次の設定でOpenVPNを使用して、2つのリモート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:
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
ただし、VMA-> VMC(10.0.1.4)エコー応答のIPにpingを実行しても、VM B:
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
私の場合、IPスプーフィングを防ぐために、他の基盤となる(VMのホストマシン)アンチスプーフィングiptablesルールによってパケットがドロップされます。
ICMPエコー応答パケットが適切にSNATされていない理由と、それを実現する方法がわかりません。ありがとうございました。
ICMPエコー応答は接続の戻り半分であり、理由により、処理が異なります。
まず、didなんとかやりたいことができたら、PINGを壊します。VMAはICMPエコー要求を10.0.1.4
に送信しますが、ICMPエコー応答(PONG)を取得します。 10.0.0.4
から。そのPONGを以前に送信されたPINGと関連付けないため、100%のパケット損失(および無償のPONG)が発生します。
リターンでSNATを処理する方法は、アウトバウンドでDNATを実行し、NAT整理ロジックでリターンの半分のトラフィックのNATを解除して処理することです。ただし、ここではそれを行うことはできません。 VMBのeth0から10.0.0.4
に入るすべてのものをDNATすると、VMBと通信できなくなるためです。
したがって、正しいことは、根本的な問題を修正し、ホストの火星検出ロジックを実際のIPアドレス指定スキームに適合させることです。