你可能想看看mitmproxy。这允许您拦截和修改 http(s) 流量,这可能是也可能不是您需要的,但它也有像 mitmdump 这样的工具,可以转储连接上的内容。
Mitmproxy 也有关于使用 iptables 重定向连接来设置 linux tcp 堆栈的说明。我想这是你想要实现的主要部分。
在您的设置中,您可以做的最简单的事情可能是使用 virtualbox 创建一个虚拟机,在机器内运行客户端,在机器内使用 iptables 将服务器连接重定向到您的主机,并在主机上运行代理。
使用虚拟机的好处是无论你在 VM 上安装/配置什么都不会干扰你的主机,你可能不想在那里搞乱网络以减少破坏其他东西的风险,并且你可以创建快照然后回到它,你打破了一些东西,不记得你到底做了什么。
然后,在 VM 上,执行类似的操作
iptables -t nat -A OUTPUT -p tcp --dport 1234 -j DNAT --to-destination 1.2.3.4:1234
重定向所有来自客户端的流量,独立于目标 ip,到主机(假设主机是 1.2.3.4)。在主机上,编写一个程序监听1234端口,转储所有数据,并通过real.server.ip:1234。这样,您就不必弄乱主机的 IP 配置。
如果你不想使用虚拟机,你也可以使用
iptables -t nat -A OUTPUT -p tcp --dport 1234 -j DNAT --to-destination 127.0.0.1:1234
iptables -t nat -A OUTPUT -p tcp --dport 1235 -j DNAT --to-destination :1234
并让您的程序监听端口 1234,并连接到真实服务器上的 1235。第二个 iptables 条目将再次重定向到 1234,并使用程序请求的 IP,因为您只是在--to-destination
参数中使用了一个没有 IP 的端口。您的客户端(使用端口 1234)总是被重定向到 localhost,而连接到 1235 的代理将被重定向到 1234。显然,iptables 命令的顺序在这里很重要。
当然,您也可以使用真实的服务器 IP 或名称:
iptables -t nat -A OUTPUT -p tcp --dport 1235 -j DNAT --to-destination 192.168.17.135:1234
iptables -t nat -A OUTPUT -p tcp --dport 1235 -j DNAT --to-destination real.server.name:1234
但请注意,real.server.name
在您启动 iptables 命令时会得到解决,而不是在数据包被发送时。因此,如果您的 real.server.address 稍后更改,例如,如果它位于动态 IP 后面,则您必须删除 iptables 条目并创建一个新条目。
并且为了尽量减少对您的机器的影响,您可能有一个不相关的程序通过端口 1235 连接到一个不相关的服务器,您可能希望将端口更改限制为仅一个特定的服务器:
iptables -t nat -A OUTPUT -p tcp --dest 192.168.17.135 --dport 1235 -j DNAT --to-destination 192.168.17.135:1234