我有两个连续的网络,都隐藏在自己的 NAT 192.168.31.0/24
-> 192.168.33.0/24
-> Internet下
我有一个 TCP 服务器192.168.33.35
和一个客户端192.168.31.32
例如,客户端向位于 Internet 的服务器发出 TCP 请求66.66.66.66
。我希望最后一个网关192.168.33.1
将请求发送到,192.168.33.35
并欺骗客户端。
我尝试过的最可行的是:
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
服务器收到 Syn 数据包并回复。但是服务器回复的源 IP192.168.33.35
在经过网关后似乎仍然存在。数据包在网关处丢失192.168.31.1
。
看起来 SNAT 部分不起作用。
我该怎么做才能用标准 openWrt 工具模拟/欺骗服务器?
答案1
事情是这样的:
- 您的
192.168.33.35
服务器看到来自的 Syn 数据包192.168.33.Z
(它不知道192.168.31.0/24
网络并且看到网关的“WAN”地址192.168.31.1
,我不知道Z
是什么)并回复该地址。 - 其路由表表明该地址属于本地网络,因此响应发往的 MAC 地址
192.168.33.Z
。 - 即使响应物理上通过
192.168.33.1
机器传输,网关也不会对其进行干扰,因为它的目标是另一台机器的 MAC 地址。 192.168.33.Z
看到来自 的响应192.168.33.35
。它期望来自 的响应66.66.66.66
,但不知道该做什么。
192.168.33.Z
请注意,执行 NAT(在其 LAN 端)无关紧要192.168.31.1
。故障机制与以下情况非常相似:NAT 环回(发夹式 NAT)仅部分设置。
您必须让您的192.168.33.35
服务器向网关的 MAC 地址发送响应192.168.33.1
。
192.168.33.Z
为(记住我不知道Z
,你知道;用真实数字代替)或甚至为整个192.168.33.0/24
网络设置路由规则:# do this on the 192.168.33.35 machine route add -host 192.168.33.Z gw 192.168.33.1
192.168.33.35
注意,这将影响从到 的所有通信。在应充当 的192.168.33.Z
情况下,数据包将被不必要地路由;但它不应该破坏一切。192.168.33.35
192.168.33.35
或者让
192.168.33.1
网关不仅执行 DNAT,还执行 SNAT。此解决方案与已链接答案中的 NAT 环回解决方案基本相同:# do this on the 192.168.33.1 gateway # you already have this line iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35 # this line is new iptables -t nat -I POSTROUTING -d 192.168.33.35 -j SNAT --to-source 192.168.33.1
此片段适用于您的情况:
注意,中的 NAT 表
iptables
仅用于连接的第一个数据包。与该连接相关的后续数据包将使用第一个数据包转换时建立的内部映射表进行处理。
这意味着当您从客户端发起连接时,第二行 ( iptables … -j SNAT --to-source 66.66.66.66
) 是无关紧要的。后面的数据包将正确进行 SNAT 和 DNAT,因为第一个数据包已正确进行。
我认为如果你的第一行
iptables -t nat -I PREROUTING -d 66.66.66.66 -j DNAT --to-destination 192.168.33.35
作用于192.168.31.1
网关,它会为其他客户端执行您想要的操作,而192.168.31.0/24
无需任何额外的技巧。
你的第二行
iptables -t nat -I POSTROUTING -s 192.168.33.35 -j SNAT --to-source 66.66.66.66
将适用于您发起的连接从 192.168.33.35
。互联网服务器很少这样做,所以你可能根本不需要这条规则。如果你确实需要它,请记住:
- 该规则仅当数据包通过该规则起作用的网关路由时才会起作用
192.168.33.1
,因此要到达本地计算机并向它们呈现,您需要像上面一样66.66.66.66
调整机器上的路由表;192.168.33.35
- 您无法
66.66.66.66
与外部主机(超出您的网络)进行通信,因为即使您设法以 的身份联系到它们66.66.66.66
,它们的响应也会到达真正的66.66.66.66
,而不是返回给您。
答案2
使用路由来实现。不幸的是,它不太灵活,无法访问真正的服务器,但至少它可以工作。如下所示:
[email protected]# route add -host 66.66.66.66 gw 192.168.33.35 dev br-lan
在服务器上:
[email protected]# ip link add name s666 type dummy
[email protected]# ifconfig s666 66.66.66.66
[email protected]# ifconfig s666 up