PREROUTING チェーンにルールを設定せずにテーブルに 1 つのルールを設定すると、SNAT が機能するのはなぜですか?

PREROUTING チェーンにルールを設定せずにテーブルに 1 つのルールを設定すると、SNAT が機能するのはなぜですか?

Iptables を使用した SNAT についていくつか質問があります。LAN 内にプライベート IP を割り当てるための DHCP サーバーとして機能するルータが 1 台あり、LAN 内のホストがパブリック インターネットにアクセスできる NAT 機能を備えていると仮定します。

ルーターには 2 つのインターフェイスがあります。1 つはダイナミック パブリック IP を持つ「eth0」、もう 1 つはプライベート IP 192.168.0.1 を持つ「eth1」で、サブネットは 192.168.0.0/24 です。そのルーターで IPv4 パケット転送が有効になっていると仮定します。LAN 内のホストからパブリック インターネットへのパケットの送信元 IP をマスカレードするには、NAT テーブルに 1 つのルールを設定する必要があることはわかっています。このルールは、次のようになります。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

LAN からのパケットにはインターネット ルーティング用のパブリック IP が必要なので、このルールが必要なのは理解しています。

PREROUTINGしかし、宛先 IP アドレスを変更するために、応答パケットのチェーンに別のルールを設定する必要がないのはなぜかわかりません。

これらの応答パケットの宛先アドレスの変更は、私が設定した MASQUERADE ルールのデフォルトの動作ですか?

もう 1 つの疑問は、iptable がどのパケットを変更する必要があるかをどのように知るかということです。

ありがとう。

答え1

iptables NATはステートフルです。「nat」テーブルを使用すると、自動的に接続トラックこのシステムは、アクティブな接続のリストを保持し、どのパケットがどの接続に属しているかを認識します。conntrack システムは、iptables ルールとは別に動作する内部フックを登録し、認識したパケットを自動的に変換します。

(conntrack 状態テーブルは、conntrack -L/proc/self/net/nf_conntrack を使用して、または /proc/self/net/nf_conntrack 経由で確認できます。)

このシステムでは、「nat」テーブルのルールは実際にはイニシャルすべてのパケットではなく、各接続に属するパケット。最初のパケットが一致すると、対応する conntrack エントリが NAT が必要 (または不要) としてマークされ、それ以降のパケットは 'nat' テーブルを経由することなく自動的に変換されます。

関連情報