VPNによってサーバーYに接続されているサーバーX(45.55.245.182)があります。 XのVPNインターフェースはip10.200.0.2のtap0です。 YのVPNインターフェースは、IP10.200.0.1のtap0です。サーバーYでnetcatを実行して、UDP35000をリッスンします。
nc -lu 10.200.0.1 35000
サーバーXでは、ポート35000のパケットが次のiptablesルールでDNATされます。
iptables -t nat -A PREROUTING -p udp --dport 35000 -j DNAT --to-destination 10.200.0.1
サーバーYのtap0インターフェイスでtcpdumpを実行すると、パケットが期待どおりに到着したことが示されます。
11:54:44.000610 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.200.0.1 tell 10.200.0.2, length 28
11:54:44.000638 ARP, Ethernet (len 6), IPv4 (len 4), Reply 10.200.0.1 is-at fa:0f:00:1a:57:59 (oui Unknown), length 28
11:54:44.154702 IP (tos 0x8, ttl 47, id 52840, offset 0, flags [DF], proto UDP (17), length 34)
hotnet-213-57-17-185.hotnet.net.il.24740 > 10.200.0.1.35000: [udp sum ok] UDP, length 6
ただし、サーバーYでリスニングネットキャットがデータを取得していることを確認できません(クライアントでEnterキーを押しても、Yの画面には何もエコーしません)。
何が問題になる可能性がありますか?
問題の最も可能性の高い説明はrp_filter
であり、これはデフォルトで有効になっています。サーバーYはtap0
でパケットを受信しますが、そのルーティングテーブルによると、パケットは別のインターフェイス(おそらくeth0
)に到着するはずでした。
これが本当に問題である場合、解決策はrp_filter
に対してtap0
を無効にすることです。まず、これを試して、問題が解決するかどうかを確認します。
echo 0 > /proc/sys/net/ipv4/conf/tap0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
サーバーYにパケットを受け入れるようになったら。間違ったIPアドレスからの送信が原因で、クライアントが応答を拒否するという問題が発生する可能性があります。その問題には さまざまな解決策 があります。
サーバーXでSNAT
を使用することを選択した場合、両方の問題が解決されます。ただし、2つの注意点があります。
送信元アドレスを実際にパケットが到着した10.200.0.2に設定すると、問題が解決しました。
iptables -t nat -A POSTROUTING -p udp --dport 35000 -j SNAT --to 10.200.0.2