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

我读过使用 IPFW 的 ipfw 转移套接字,它看起来非常有前途。修改数据包并使用转移套接字将它们重新注入堆栈的示例怎么样?另外,出于好奇,是否可以使用 Java 从套接字读取数据,或者这是否会限制我打包和重新注入等?

有帮助吗?

解决方案

我本来打算回应推荐 iptables 的其他回复(取决于您尝试匹配的模式和您想要进行的数据包修改的复杂性),直到我注意到该问题上的 BSD 标签。

作为 史蒂芬·佩利瑟 已经提到,libpcap 是捕获数据包的一个不错的选择。不过,我相信 libpcap 也可以用于发送数据包。作为参考,我很确定 tc预播放 用它来重放 pcap 格式的文件。

其他提示

请参阅转移插座: 迷你转接插座 HOWTO.

它们的工作原理是将与特定 ipfw 规则匹配的流量传递到特殊的原始套接字,然后该套接字可以将更改后的流量重新注入网络层。

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

如果您只是想查看数据包,那么 libpcap 就是您的最佳选择。您可以在以下位置找到它: http://www.tcpdump.org/

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

有一个客户端库 libnetfilter_queue 需要链接到它。遗憾的是,文档很少,但有一些邮件列表帖子和示例。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top