ICMP ECHO REPLY 未正确进行 SNAT

ICMP ECHO REPLY 未正确进行 SNAT

我正在尝试使用 OpenVPN 在两个远程 LAN 网络 (10.0.0.0/24、10.0.1.0/24) 之间提供 L3 连接,设置如下:

+----------------+  +---------------------+  +---------------------+
|VM A            |  |VM B (OpenVPN Server)|  |VM C (OpenVPN Client)|
|eth0:10.0.0.5/24|--|eth0:10.0.0.4/24     |  |eth0:10.0.1.4/24     |
+----------------+  |tun0:10.8.0.1/32     |==|tun0:10.8.0.2/32     |
                    +---------------------+  +---------------------+

提供以下IP表规则:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.0.4

对 VMC->VMA(10.0.0.5) 执行 Ping 操作时,ICMP 回显请求的 IP 在 VM B 上正确进行了 SNAT:

VM-B# tcpdump -i eth0 icmp
09:27:36.170555 IP 10.0.0.4 > 10.0.0.5: ICMP echo request, id 4049, seq 2, length 64
09:27:36.171201 IP 10.0.0.5 > 10.0.0.4: ICMP echo reply, id 4049, seq 2, length 64

但是在 VM B 上 ping VMA->VMC(10.0.1.4) 回显回复的 IP 并未经过 SNAT 处理:

VM-B# tcpdump -i eth0 icmp
09:33:31.791095 IP 10.0.0.5 > 10.0.1.4: ICMP echo request, id 6590, seq 2, length 64
09:33:31.795299 IP 10.0.1.4 > 10.0.0.5: ICMP echo reply, id 6590, seq 2, length 64

在我的例子中,这会导致其他底层(VM 的主机)反欺骗 iptables 规则丢弃数据包以防止 IP 欺骗。

我不明白为什么 ICMP 回显回复数据包没有被正确 SNAT 以及如何实现这一点。谢谢。

答案1

ICMP 回显答复是连接的返回部分,由于原因,它们的处理方式不同。

首先,如果你做过设法完成您想要的操作,您将中断 PING:VMA 将向 发送 ICMP 回显请求10.0.1.4,但从 获得 ICMP 回显答复 (PONG) 10.0.0.4。它不会将该 PONG 与先前发送的 PING 关联,因此您将看到 100% 的数据包丢失(加上无端的 PONG)。

处理返回的 SNAT 的方法是对出站进行 DNAT,并让 NAT 整理逻辑处理返回一半流量的去 NAT。但您在这里不能这样做,因为如果您将进入 VMB 的 eth0 的所有内容都进行 DNAT 10.0.0.4,您将无法再与 VMB 通信。

因此,正确的做法是解决根本问题,并使主机的火星检测逻辑适合您的实际 IP 寻址方案。

相关内容