Linux iptables は、conntrack なしで着信パケットに DNAT を実行します (ステートレス)

Linux iptables は、conntrack なしで着信パケットに DNAT を実行します (ステートレス)

私の 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 46000App 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 NOTDNAT

質問:

  1. RAW テーブルは存在しないことを示していますCONNTRACK。ただし、上記の動作は、App A -> Srv Xsrc および dst ポートを持つ最初のパケット36000 - 36000がどこかのモジュールによって追跡されていることを示しています。したがって、からの応答はSrv X -> App ADNAT を受けていないようです。これを回避するにはどうすればよいですかCONNTRACK?

  2. dst ポート 36000 を持つ Srv X からのすべての着信パケットが常に DNAT を受けるようにするにはどうすればよいですか?

よろしくお願いします、テレックス

答え1

を見てNetfilter ドキュメント、 と言われている「接続追跡は NAT の基本です」、したがって、有効にしないとDNATを使用することはできません接続トラック

関連情報