Networking

ICMP ECHO REPLY 未正確進行 SNAT

  • April 19, 2016

我正在嘗試使用具有以下設置的 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-r​​eply 是連接的返回部分,出於某種原因,它們的處理方式不同。

首先,如果你確實設法做你想做的事,你會破壞 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 定址方案。

引用自:https://serverfault.com/questions/771377