Networking
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
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 定址方案。