我正在寻找一个Linux实用程序,可以根据一组规则来改变networking数据包的有效载荷。 理想情况下,我会使用iptables
和netfilter
内核模块,但是它们不支持通用的有效负载模式: iptables
将会改变不同的头域(地址,端口,TOS等),并且可以匹配一个数据包中的任意字节,但它显然无法改变数据包内的任意数据。
内核模块将是一个很大的优势,因为效率是一个问题,但我很乐意探索任何可以完成工作的其他选项。
感谢您的想法!
姗姗来迟的更新:
我们select使用NFQUEUE
模块,这是Robert Gamblebuild议的QUEUE模块的最新实现。 它似乎相当简单,让我们的代码在用户而不是内核空间中运行,这是一个安全奖金。
如果我们只是想改变有效载荷而不改变它的大小,那么实现将几乎是微不足道的。 在这种情况下,我们将定义一个iptables
规则来为我们select“有趣的”数据包,并向它们发送一个NFQUEUE
目标。 我们将编写一个callback函数来检查来自NFQUEUE
的数据包,根据需要修改数据,并重新计算TCP和IP头中的校验和。
但是,我们的用例涉及在数据stream中注入更多字符。 这在TCPstream中增加了相应的SEQ / ACK号码的副作用比较明显,混淆了conntrack
模块的副作用并不明显,完全打破了NAT。 经过大量的研究,头部划伤和实验,最NOTRACK
解决scheme是禁用这些特定数据包的连接跟踪(在raw
表中使用NOTRACK
目标),并在我们的callback中处理。 保存你的西红柿和讨厌的邮件; 我一点都不骄傲让你置身事外,但在下一个冰河世纪之前,这是唯一可以获得可靠产品给客户的方法。 这是一个很好的故事。 但我真的很感激,并分享你的衷心的感受。
版本2将利用我们新发现的启示,通过用自定义NAT和/或conntrack
助手来replace我们的callback和多个iptables
规则。 我们相信,目前的练习已经给了我们足够的经验来创build一个内核模块,它将有机地融入到netfilter体系结构中来解决我们遇到的问题。
再次感谢您的关注和build议!
我没有使用它,但QUEUE netfilter目标看起来像可能工作。 它使用nflink套接字和注册到套接字的用户空间应用程序来执行有效负载修改。
libipq手册页包含如何使用这个的详细信息,并提供一个简单的例子。
我们结束了netfilter的自定义模块,这显然是这个工作的“正确”工具。