2009-02-27 90 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++中。