web-dev-qa-db-ja.com

ICMP ECHOREPLYが正しくSNATされていません

次の設定で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されていない理由と、それを実現する方法がわかりません。ありがとうございました。

1
amic

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アドレス指定スキームに適合させることです。

0
MadHatter