.png)
私の Linux ボックスには10.20.1.1
、それぞれポート46000 (App A)
とにバインドされた 2 つの UDP アプリがあります36000(App B)
。アプリは、それぞれ と にバインドされた 2 つの UDP サーバーと通信し10.10.1.1:36000 (Srv X)
ます10.10.1.2:36000 (Srv Y)
。
パケットを送信するときは、常に UDP 送信元ポートを 36000 として使用する必要があります。有線上のパケットは常に36000 - 36000
送信元ポートと宛先ポートになります。
私の iptables ルールは以下のとおりです。私の意図は、DNAT
ポートから Srv X からの着信パケットを36000 to 46000
App A が受信できるようにすることです。
*nat
-A PREROUTING -s 10.10.1.1/32 -p udp --dport 36000 -j DNAT --to-destination :46000
*raw
-A PREROUTING -p udp --dport 36000 -j CT --notrack
-A PREROUTING -p udp -j ACCEPT
-A OUTPUT -p udp --dport 36000 -j CT --notrack
-A OUTPUT -p udp -j ACCEPT
*filter
-A INPUT -p udp -m udp --dport 36000 -j ACCEPT --> rule 1
-A INPUT -p udp -m udp --dport 46000 -j ACCEPT --> rule 2
-A OUTPUT -p udp -m udp --dport 36000 -j ACCEPT -> rule 3
からパケットを送信すると、App A to Srv X
正常に動作します。 に conntrack エントリはなく/proc/net/ip_conntrack
、 OUT パケットは一致しませんrule 3
。 から応答が来るとSrv X to App A
、パケットは raw テーブルをトラバースしますが、フィルター テーブル ルール 1 に直接ジャンプします。つまり、Srv X 応答が私のボックスに届きますが、App A ではなく App B に送られます。DOES NOT
DNAT
質問:
RAW テーブルは存在しないことを示しています
CONNTRACK
。ただし、上記の動作は、App A -> Srv X
src および dst ポートを持つ最初のパケット36000 - 36000
がどこかのモジュールによって追跡されていることを示しています。したがって、からの応答はSrv X -> App A
DNAT を受けていないようです。これを回避するにはどうすればよいですかCONNTRACK
?dst ポート 36000 を持つ Srv X からのすべての着信パケットが常に DNAT を受けるようにするにはどうすればよいですか?
よろしくお願いします、テレックス
答え1
を見てNetfilter ドキュメント、 と言われている「接続追跡は NAT の基本です」、したがって、有効にしないとDNATを使用することはできません接続トラック。