【发布时间】:2010-09-20 14:51:09
【问题描述】:
我正在寻找一个 linux 实用程序,它可以根据一组规则更改网络数据包的有效负载。理想情况下,我会使用 iptables 和 netfilter 内核模块,但它们不支持通用的有效负载修饰:iptables 将改变各种 header 字段(地址、端口、TOS 等),并且它可以匹配数据包中的任意字节,但它显然无法更改数据包中的任意数据。
内核模块将是一大优势,因为效率是一个问题,但我很乐意探索任何其他可以完成工作的选项。
感谢您的想法!
迟来的更新:
我们选择使用 NFQUEUE 模块,这是 Robert Gamble 建议的 QUEUE 模块的最新实现。它看起来相当简单,并且允许我们的代码在用户空间而不是内核空间中运行。
如果我们只是想改变有效载荷而不改变其大小,那么实现几乎是微不足道的。在这种情况下,我们将定义一个iptables 规则来为我们选择“有趣”的数据包并向它们发送NFQUEUE 目标。我们将编写一个回调函数来检查来自NFQUEUE 的数据包,根据需要修改数据,并重新计算其 TCP 和 IP 标头中的校验和。
但是,我们的用例涉及向数据流中注入额外的字符。这有一些明显的副作用,即增加 TCP 流中相应的 SEQ/ACK 编号,以及混淆conntrack 模块以至于完全破坏 NAT 的不那么明显的副作用。在大量研究、摸索和实验之后,最方便的解决方案是禁用这些特定数据包的连接跟踪(使用raw 表中的NOTRACK 目标)并处理它在我们的回调中。 保存你的西红柿并讨厌邮件;我一点也不自豪让您了解情况,但这是在下一个冰河时代之前为客户提供可靠产品的唯一途径。这是一个好故事。但我真的很感激并分享你的衷心感受。
第 2 版将利用我们新发现的启示,将我们的回调和几个 iptables 规则替换为自定义 NAT 和/或 conntrack helper。我们相信,当前的练习已经为我们提供了足够的经验来创建一个内核模块,该模块将有机地融入 netfilter 架构以解决我们遇到的问题。
【问题讨论】:
-
这是我的待办事项列表中的第三优先级。同时,我们也在考虑修复 netfilter 模块本身,因为这将是最好的答案。当我有信息时会更新,可能不会在几周内。 :-(
-
@Adam,你是只为修改后的数据包增加 ACK/SEQ,还是确实需要跟踪整个 ACK/SEQ 聊天?谢谢。
-
SEQ/ACK 数字计算该端口上整个流中的字节数。所以一旦你改变了一个数据包的大小,你需要保持新的 SEQ/ACK 号直到连接关闭。
-
@Adam Liss,谢谢.. 您的产品是否公开可用?有兴趣看看你选择放入这些数据包中的内容。我运行了一个小型研究项目,收集了此类软件,并尝试破解 Netfilter ......
-
(没有恶意。等待答案的人往往比发布答案的人更频繁地检查!)我不再与制造这个产品的公司有任何关系,也没有关注它的可用性,所以恐怕我无能为力。就数据包内容而言,我们在低吞吐量流中遇到目标字节序列后插入了一个短标签。
标签: linux networking iptables packet-mangling