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