除iptables之外的数据包修改工具?

时间:2008-11-04 03:20:40

标签: linux networking iptables packet-mangling

我正在寻找一个可以根据一组规则改变网络数据包有效负载的linux实用程序。理想情况下,我使用iptablesnetfilter内核模块,但它们不支持通用有效负载修改:iptables将改变各种标头字段(地址) ,端口,TOS等),它可以匹配数据包中的任意字节,但它显然无法更改数据包中的任意数据。

内核模块将是一个很大的优势,因为效率是一个问题,但我很乐意探索任何其他可以完成工作的选项。

感谢您的想法!


姗姗来迟的更新:

我们选择使用NFQUEUE模块,这是Robert Gamble建议的QUEUE模块的最新实现。它似乎相当简单,允许我们的代码在用户而不是内核,空间中运行,具有安全奖励。

如果我们只是想在不改变其大小的情况下改变有效载荷,那么实现几乎是微不足道的。在这种情况下,我们会定义一个iptables规则来为我们选择“有趣”的数据包并向它们发送NFQUEUE目标。我们编写了一个回调函数来检查来自NFQUEUE的数据包,根据需要修改数据,并重新计算其TCP和IP头中的校验和。

但是,我们的用例涉及在数据流中注入其他字符。这有一些明显的副作用,即增加TCP流中相应的SEQ / ACK号,以及使conntrack模块混淆不足以完全破坏NAT的不那么明显的副作用。经过批次研究,头脑清理和实验之后,最便捷的解决方案是禁用这些特定数据包的连接跟踪(NOTRACK表中的raw目标)并在我们的回调中处理它。 保存你的西红柿,讨厌邮件;我并不自豪地让你陷入困境,但这是在下一个冰河世纪之前为客户提供可靠产品的唯一途径。这是一个很好的故事。但我真的很感激并分享你的衷心感情。

版本2将通过使用自定义NAT和/或conntrack helper替换我们的回调和若干iptables规则来利用我们新发现的启示。我们相信当前的练习给了我们足够的经验来创建一个内核模块,该模块将有机地融入到netfilter架构中,以解决我们遇到的问题。

再次感谢您的关注和建议!

2 个答案:

答案 0 :(得分:5)

我没有使用它,但QUEUE netfilter目标看起来可能有效。它使用nflink套接字和注册到套接字的用户空间应用程序来执行有效负载修改。

libipq手册页包含有关如何使用它的详细信息,并提供了一个简单示例。

答案 1 :(得分:1)

分辨率:

我们最终得到了netfilter的自定义模块,这显然是这项工作的“正确”工具。