题
我想要在这里做的不仅仅是一次捕捉。我想首先捕获数据包,然后实时检查有效负载中的特定数据,将其删除,注入签名并将数据包重新注入到要像以前一样发送的堆栈中。
我读过使用 IPFW 的 ipfw 转移套接字,它看起来非常有前途。修改数据包并使用转移套接字将它们重新注入堆栈的示例怎么样?另外,出于好奇,是否可以使用 Java 从套接字读取数据,或者这是否会限制我打包和重新注入等?
其他提示
请参阅转移插座: 迷你转接插座 HOWTO.
它们的工作原理是将与特定 ipfw 规则匹配的流量传递到特殊的原始套接字,然后该套接字可以将更改后的流量重新注入网络层。
如果您只是寻找数据包捕获,libpcap 非常受欢迎。它用于 tcpdump 和 ethereal 等基本工具中。至于“挂钩堆栈”,除非您计划从根本上改变网络的实现方式(即,添加您自己的层或更改 TCP 的行为),您使用 IPF 进行数据包修改或干预的想法似乎是最好的选择。在 Linux 中,它们对用户空间模块有一个特定的重定向目标,IPF 可能有类似的东西,或者您可以修改 IPF 来执行类似的操作。
如果您只是想查看数据包,那么 libpcap 就是您的最佳选择。您可以在以下位置找到它: http://www.tcpdump.org/
我认为可以使用 QUEUE 或 NFQUEUE iptables 目标在用户空间中执行此操作。客户端应用程序附加到队列并接收所有匹配的数据包,它可以在重新注入之前对其进行修改(如果需要,也可以删除它们)。
有一个客户端库 libnetfilter_queue 需要链接到它。遗憾的是,文档很少,但有一些邮件列表帖子和示例。
出于性能原因,您不想对每个数据包执行此操作,而只想对特定的匹配数据包执行此操作,您必须使用标准 iptables 规则来匹配这些数据包。如果这还不够,您需要编写自己的 netfilter 内核模块。