我有两台机器:机器 A 和机器 B。机器 A 将所有流量路由到机器 B。在机器 A 上设置以下 iptables 规则:
iptables -t nat -A PREROUTING -i wlan0 -j DNAT --to-destination 172.16.250.128
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
其中是包含其 IP 范围内的tun0
IP 地址的接口。172.16.250.128
现在,机器 A 上收到的所有数据包都将路由到机器 B,无需更改端口。
在机器 BI 上,在端口 8080 上设置透明代理(mitmproxy、burpsuite 等),并使用以下 iptables 规则:
iptables -t nat -A PREROUTING -i ens33 -p tcp -j REDIRECT --to-ports 8080
其中ens33
(ip 172.16.250.128
) 是连接到计算机 A 上的接口的接口tun0
。上面的规则将所有 tcp 数据包从该接口重定向到端口 8080 - 透明代理侦听的端口。一切都很好,所有 TCP 数据包都通过透明代理路由。
但我不确定透明代理如何知道数据包的原始目的地(地址和端口)?我发现了这个问题:[link][1] 它说 iptables 在修改目的地之前保存原始目的地。现在我明白透明代理是如何知道原始端口的了。但是目标地址呢?由于目标地址是在机器A上修改的,我认为机器B及其内部不应该知道原始目标地址,因为机器B没有修改它,对吗?但不知何故,它仍然能够以某种方式获取发送到路由wlan0
到透明代理的接口的数据包的原始目标地址。我知道这一点是因为显然透明代理将数据包正确路由到原始目的地(互联网上的目的地)。
机器 B 如何知道 DNATed(修改的目的地)数据包的原始目的地?原始目的地是否也通过网络发送?我在wireshark中没有看到它。 [1]:透明 SOCKS 代理如何知道要使用哪个目标 IP?
答案1
你很想知道“透明代理如何实现[在服务器B上]知道数据包的原始目的地”。它不能,因为您在服务器 A 上重写了源 ( MASQUERADE
) 和目标 ( DNAT
)。就服务器 B 而言,流量源自服务器 A,并寻址到服务器 B。
当流量回复发送回服务器 A 时,它独自知道如何撤消 DNAT/MASQUERADE,以便将它们发送到原始的真实源。