ICMP ECHO REPLY没有被正确的SNAT

我正在尝试使用OpenVPN在两个远程LANnetworking(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 

Pinging VMC-> VMA(10.0.0.5)在VM B上,ICMP回显请求的IP被正确的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)echo reply的IP不被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 

这在我的情况下导致其他底层(虚拟机的主机)反欺骗iptables规则,以防止IP欺骗丢弃数据包。

我不明白为什么ICMP回声回复数据包没有被正确的SNAT,以及如何使它发生。 谢谢。

ICMP echo-r​​eply是连接的返回一半,并且由于某种原因,它们的处理方式不同。

首先,如果你设法做你想做的事情,你会打破PING:VMA会发送一个ICMP回应请求到10.0.1.4 ,但从10.0.0.4得到一个ICMP回应回复(PONG)。 它不会将PONG与以前发送的PING联系起来,所以你会看到100%的数据包丢失(加上无用的PONG)。

处理SNAT返回的方法是在出站时执行DNAT,并让NAT整理逻辑处理掉返回的一半stream量。 但是在这里你不能这样做,因为如果你将VMB的eth0中的所有内容都删除到10.0.0.4 ,你将不能再和VMB进行通话。

所以正确的做法是解决底层的问题,并让你的主机的火星探测逻辑适合你的实际IP寻址scheme。