我正在寻找一个可以根据一组规则改变网络数据包有效负载的linux实用程序。理想情况下,我使用iptables
和netfilter
内核模块,但它们不支持通用有效负载修改:iptables
将改变各种标头字段(地址) ,端口,TOS等),它可以匹配数据包中的任意字节,但它显然无法更改数据包中的任意数据。
内核模块将是一个很大的优势,因为效率是一个问题,但我很乐意探索任何其他可以完成工作的选项。
感谢您的想法!
姗姗来迟的更新:
我们选择使用NFQUEUE
模块,这是Robert Gamble建议的QUEUE模块的最新实现。它似乎相当简单,允许我们的代码在用户而不是内核,空间中运行,具有安全奖励。
如果我们只是想在不改变其大小的情况下改变有效载荷,那么实现几乎是微不足道的。在这种情况下,我们会定义一个iptables
规则来为我们选择“有趣”的数据包并向它们发送NFQUEUE
目标。我们编写了一个回调函数来检查来自NFQUEUE
的数据包,根据需要修改数据,并重新计算其TCP和IP头中的校验和。
但是,我们的用例涉及在数据流中注入其他字符。这有一些明显的副作用,即增加TCP流中相应的SEQ / ACK号,以及使conntrack
模块混淆不足以完全破坏NAT的不那么明显的副作用。经过批次研究,头脑清理和实验之后,最便捷的解决方案是禁用这些特定数据包的连接跟踪(NOTRACK
表中的raw
目标)并在我们的回调中处理它。 保存你的西红柿,讨厌邮件;我并不自豪地让你陷入困境,但这是在下一个冰河世纪之前为客户提供可靠产品的唯一途径。这是一个很好的故事。但我真的很感激并分享你的衷心感情。
版本2将通过使用自定义NAT和/或conntrack
helper替换我们的回调和若干iptables
规则来利用我们新发现的启示。我们相信当前的练习给了我们足够的经验来创建一个内核模块,该模块将有机地融入到netfilter架构中,以解决我们遇到的问题。
再次感谢您的关注和建议!