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