钩入C语言中的TCP堆栈
这不仅是我要在此处进行的捕捉。我想先捕获数据包,然后实时检查有效载荷中的特定数据,将其删除,注入签名,然后将数据包重新注入堆栈以像以前一样发送。
我阅读了使用IPFW的ipfw转移套接字,它看起来非常有前途。修改数据包并使用转接套接字将其重新注入到堆栈中的示例又如何呢?另外,出于好奇,是否可以使用Java从套接字读取数据,或者这会限制我打包打包和重新注入等操作?
解决方案
回答
请参阅转接插座:转接插座mini HOWTO。
它们通过将符合某个ipfw规则的流量传递到特殊的原始套接字来工作,该套接字然后可以将更改后的流量重新注入网络层。
回答
如果我们只是在寻找数据包捕获,那么libpcap非常受欢迎。它在基本工具(例如tcpdump和ethereal)中使用。至于"挂钩",除非我们计划从根本上改变网络的实现方式(即添加自己的层或者更改TCP的行为),否则使用IPF进行数据包修改或者干预的想法似乎是最好的选择。在Linux中,它们为用户空间模块指定了特定的重定向目标,IPF可能具有类似的功能,或者我们可以修改IPF以执行类似的操作。
如果我们只是想查看数据包,那么libpcap是理想之选。我们可以在以下位置找到它:http://www.tcpdump.org/
回答
我认为可以使用QUEUE或者NFQUEUE iptables目标在用户空间中执行此操作。客户端应用程序添加到队列并接收所有匹配的数据包,可以在重新注入之前对其进行修改(如果需要,它也可以丢弃它们)。
需要链接一个客户端库libnetfilter_queue。遗憾的是文档很少,但是有一些邮件列表帖子和示例。
出于性能原因,我们不想对每个数据包都这样做,而只希望对特定的匹配数据包进行此操作,就必须使用标准iptables规则进行匹配。如果这样做还不够,我们将需要编写自己的netfilter内核模块。
回答
我将回声推荐iptables的其他响应(取决于我们要匹配的模式和要进行的数据包修改的复杂程度),直到我注意到问题上的BSD标签。
正如Stephen Pellicer所述,libpcap是捕获数据包的好选择。但是,我相信libpcap也可以用于发送数据包。作为参考,我很确定tcpreplay使用它来重放pcap格式的文件。