在Linux中侦听/重新发送TCP SYN数据包到C ++程序

我试图find最简单的方法来拦截在我的电脑在一个c + +程序发送的TCP SYN数据包。 我知道有几个选项。 一个会监视所有的stream量,只是有select地处理SYN数据包,其余的都不做任何事情。 我遇到的另一个select是使用包过滤实用程序将转发SYN数据包到我的程序。 有人build议我使用netfilter相同。

我想知道是否有其他select,或者我应该钻研netfilter。 另外,有关如何使用netfilter做到这一点的任何指针将是有帮助的。

编辑:我想拦截SYN数据包,并可能需要修改它(重新路由到不同的目的地,更改目标端口等),然后再次将其重新注册到networking

编辑:我能够做到这一点使用iptables和libnetfilter_queue的组合。 我使用ipfilter将所有TCP SYN数据包redirect到一个特定的队列(这是使用一个简单的命令)
然后在一个C程序中,我可以使用libnetfilter_queue API来访问队列中的数据包并分析它们,并将它们重新发回networking。

如果您只想查看数据包,请使用libpcap和数据包过滤 – 这在大多数UNIX变体上都可以使用。

如果您想以某种方式拦截并重写数据包,请提供有关您要做什么的更多信息,以及之后会发生什么情况。

正如你所建议的那样,这可能是netfilter及其队列模块的应用程序,尽管这需要2.6.14或更高版本的内核:

主要特点

  • 接收来自内核nfnetlink_queue子系统的排队数据包
  • 向内核nfnetlink_queue子系统发出判决和/或重新发送更改的数据包

您可以使用原始套接字或例如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 ++中。