在处理连接的进程获取流之前,我需要对来自已知 TCP 主机:端口的传入流量做一些小的修改。
例如,假设 192.168.1.88 是运行 Web 服务器的远程主机。
我需要,当我本地主机上的进程从 192.168.1.88:80(例如浏览器)接收数据时,首先将数据更改为text-A
,text-B
如下所示:
- 127.0.0.1:... 连接到 192.168.1.88:80
127.0.0.1:...发送至 192.168.1.88:80:
GET /
192.168.1.88:80 发送至 127.0.0.1:...:
HTTP/1.0 200 OK Content-Type: text/plain Some text-A, some other text
该数据在某种程度上被系统截取并传递给程序,其输出为:
HTTP/1.0 200 OK Content-Type: text/plain Some text-B, some other text
系统将改变后的数据提供给处理 127.0.0.1:... 的进程,就好像它来自 192.168.1.88:80。
假设我有一种基于流的方法来做出这种改变(sed
例如使用),那么预处理传入的 tcp 流的最简单方法是什么?
我猜这会涉及到iptables
,但我不太擅长。
请注意,应用程序应该处理原始主机,因此设置代理可能不是一个解决方案。
答案1
使用 netsed 和 iptables 代理。
iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101
然后运行:
netsed tcp 10101 desthost 80 s/text-A/text-B
网络SED是一款小巧方便的实用程序,旨在实时更改通过网络转发的数据包内容。它对于网络数据包更改、伪造或操纵非常有用。NetSED 支持:
黑盒协议审计 - 每当有两个或多个专有盒子使用某些未记录的协议进行通信时。通过强制更改正在进行的传输,您将能够测试所检查的应用程序是否可以声称是安全的。
模糊生成实验、完整性测试——每当您对应用程序进行稳定性测试时,都要查看它如何关心数据完整性;
其他常见用例:欺骗性传输、内容过滤、协议转换——任何最适合您手头任务的。
答案2
你可以使用 iptables 来实现这一点通过 squid 代理透明地代理连接,然后有squid 重写 http 内容为你。
答案3
iptables
+ 使用libnetfilter_qu是另一个可以实现您想要的功能的选项:
“...[重新注入]改变的数据包到内核 nfnetlink_queue 子系统。”
它可能会为您提供最大的可扩展性,因为软件编码取决于您。
有一个 Python 包装器也可用。