我正在尝试使用具有以下设置的 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
ping VMC->VMA(10.0.0.5) 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
但是 ping VMA->VMC(10.0.1.4) echo reply 的 IP 不是在 VM B 上 SNATed:
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 以及如何实现。谢谢你。
ICMP echo-reply 是连接的返回部分,出于某种原因,它们的处理方式不同。
首先,如果你确实设法做你想做的事,你会破坏 PING:VMA 会向 发送一个 ICMP 回显请求
10.0.1.4
,但会从10.0.0.4
. 它不会将该 PONG 与之前发送的 PING 相关联,因此您会看到 100% 的数据包丢失(加上免费的 PONG)。在返回时处理 SNAT 的方法是对出站进行 DNAT,并让 NAT 整理逻辑处理对返回的一半流量进行去 NAT。但是你不能在这里这样做,因为如果你把所有进入 VMB 的 eth0 的东西都 DNAT 到
10.0.0.4
,你就不能再和 VMB 对话了。因此,正确的做法是解决根本问题,并使主机的火星探测逻辑适合您的实际 IP 寻址方案。