我已经阅读了使用IPFW的ipfw转发套接字,并且看起来非常有前途。那么有没有修改数据包并使用转发套接字将其重新注入堆栈的示例呢?另外,出于好奇,是否可能使用Java从套接字中读取数据,或者这会限制我进行包操作和重新注入等操作?
我认为可以使用QUEUE或NFQUEUE iptables目标在用户空间中完成此操作。客户端应用程序连接到队列并接收所有匹配的数据包,然后可以修改它们再重新注入(如果需要,也可以将其丢弃)。
需要链接libnetfilter_queue客户端库。不幸的是,文档很少,但有一些邮件列表帖子和示例可供参考。
出于性能原因,您不会想对每个数据包执行此操作,而只会对特定匹配的数据包执行此操作,这需要使用标准iptables规则进行匹配。如果这还不够,您需要编写自己的netfilter内核模块。
如果您只是想进行数据包捕获,那么libpcap是非常流行的。它被用于基本工具,例如tcpdump和ethereal。至于"hooking into the stack"(钩入堆栈),除非您打算从根本上改变网络实现的方式(例如添加自己的层或更改TCP的行为),否则您使用IPF进行数据包修改或干预的想法似乎是最好的选择。在Linux中,他们为用户空间模块提供了特定的重定向目标,IPF可能有类似的功能,或者您可以修改IPF来实现这样的功能。
如果您只是对数据包感兴趣,那么libpcap是一个好选择。您可以在http://www.tcpdump.org/中找到它。
我本来打算像其他回答建议的那样使用iptables(取决于您要匹配的模式和要进行的数据包修改的复杂性)- 直到我注意到问题的BSD标记。
正如Stephen Pellicer已经提到的,libpcap是捕获数据包的好选择。不过,我相信libpcap也可以用于发送数据包。参考资料,我很确定tcpreplay使用它来重放pcap格式的文件。