2009-02-27 26 views
1

我正試圖找到最簡單的方法來截獲我的電腦在C++程序中發送的TCP SYN數據包。我知道有幾個選項。一個會監視所有的流量,並且只是有選擇地處理SYN數據包而對其他數據無所作爲。我遇到的另一個選擇是使用包過濾實用程序將SYN數據包轉發到我的程序。有人建議我使用netfilter截取/重新編程TCP SYN數據包到Linux中的C++程序

我想知道是否有其他選擇,或者我應該鑽研netfilter。另外,關於如何使用netfilter做到這一點的任何指針都會有所幫助。

編輯:我想攔截SYN包,可能需要對其進行修改再注入回網絡

編輯之前(重新路由到不同的目的地,改變目的端口等):我是能夠做到這一點使用iptables和libnetfilter_queue的組合。我用ipfilter將所有TCP SYN數據包重定向到一個特定的隊列(這是使用一個簡單的命令)
然後在一個C程序中,我能夠使用libnetfilter_queue API來訪問隊列中的數據包並分析它們並將它們重新註冊回網絡。

+0

請說明你是否確實要重新路由 - 你建議你做主題,但不要在問題 – Alnitak 2009-02-27 10:01:30

+0

中提到我想攔截SYN數據包,可能需要修改它(重新路由到不同的目的地,改變目標端口等),然後將其重新注入網絡 – 2009-02-27 10:22:05

回答

4

如果您只想要請參閱數據包,請使用libpcap和數據包過濾 - 這將適用於大多數任何UNIX變體。

如果您想以某種方式攔截並重寫數據包,請提供有關您想要執行的操作的更多信息,以及之後會發生什麼情況。

正如你提到的,這可能是網絡過濾器的應用程序及其queue模塊,儘管這需要一個2.6.14或更高版本的內核:

主要特點

  • 接收到來自排隊包內核nfnetlink_queue子系統
  • 發出判決和/或將更改的數據包重新發送到內核 nfnetlink_queue子系統
0

您可以使用原始套接字或例如pcap庫。隨着PCAP您設置的過濾器,捕捉有趣的交通:

#include <pcap.h> 
... 
pcap_t* reader_handle; 
char errbuf[PCAP_ERRBUF_SIZE]; 
if ((reader_handle = pcap_open_live(device_string, capture_size, 0, timeout, errbuf)) == NULL) 
{ 
    //ooops 
} 
struct bpf_program fp; 
if (pcap_compile(reader_handle, &fp, filter_string, 1, 0) == -1) 
{ 
    //ooops, cleanup 
} 
if (pcap_setfilter(reader_handle, &fp) == -1) 
{ 
    //ooops, cleanup 
} 
pcap_freecode(&fp); 

事後你只是捕捉,有幾種不同的方式,例如:

pcap_pkthdr* header; 
u_char* pkt_data; 
const int status = pcap_next_ex(reader_handle, &header, &pkt_data); 
// Check the status 

結束拍攝後

pcap_close(reader_handle); 

你需要使用原始套接字的特權。上面的例子可以很好地包裝在C++中。