我正在尝试使用 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 寻址方案。