挂钩到C中的TCP堆栈

时间:2008-09-15 14:04:00

标签: c tcp stack freebsd bsd

这不仅仅是我想在这里做的捕捉。我想首先捕获数据包,然后实时检查有效负载的特定数据,删除它,注入签名并将数据包重新注入堆栈,然后像以前一样发送。

我使用IPFW阅读了ipfw转移插座,看起来非常有前途。如何使用转移套接字修改数据包并将其重新注入堆栈?另外,作为一个好奇心,是否可以使用Java从套接字读取数据,或者这会限制我打包修改和重新注入等?

4 个答案:

答案 0 :(得分:4)

请参阅转移套接字:Divert Sockets mini HOWTO

它们的工作原理是将匹配某个ipfw规则的流量传递给特殊的原始套接字,然后再将更改的流量重新注入网络层。

答案 1 :(得分:1)

如果你只是在寻找数据包捕获,libpcap非常受欢迎。它用于基本工具,如tcpdump和ethereal。至于“挂钩到堆栈”,除非你计划从根本上改变网络的实现方式(即添加你自己的层或改变TCP的行为),你使用IPF进行数据包修改或干预的想法似乎最好的选择。在Linux中,他们有一个特定的用户空间模块重定向目标,IPF可能有类似的东西,或者你可以修改IPF来做类似的事情。

如果您只是对查看数据包感兴趣,那么libpcap就是您的选择。您可以在http://www.tcpdump.org/

找到它

答案 2 :(得分:1)

我认为可以在用户空间中使用QUEUE或NFQUEUE iptables目标执行此操作。客户端应用程序附加到队列并接收所有匹配的数据包,它们可以在重新注入之前修改(如果需要,也可以删除它们)。

需要链接的客户端库libnetfilter_queue。遗憾的是,文档很少,但有一些邮件列表帖子和例子可以解决。

出于性能原因,您不希望对每个数据包执行此操作,而只需要使用标准iptables规则必须匹配的特定匹配数据包。如果做得不够,则需要编写自己的netfilter内核模块。

答案 3 :(得分:0)

我将回应其他推荐iptables的响应(取决于您尝试匹配的模式的复杂性以及您想要进行的数据包修改) - 直到我注意到BSD标记为止问题。

正如Stephen Pellicer已经提到的,libpcap是捕获数据包的好选择。不过,我相信libpcap也可用于发送数据包。作为参考,我非常确定tcpreplay使用它来重放pcap格式的文件。