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