iptables NATルールの暗黙的な反転

iptables NATルールの暗黙的な反転

iptablesは明示的に追加されたすべてのNATルールに対して暗黙的に自動的にリバース/リバースルールを追加しますか?

通常、DROPポリシーを想定すると、フィルタテーブル内のすべてのINPUTルールに対して関連するトラフィックまたは設定されたトラフィックを許可する対応するOUTPUTルールがあります(その逆も同様です)。たとえば、iptablesファイアウォールを介してインバウンドSSHを有効にするには、着信接続を許可するINPUTルールが必要です。

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

ただし、戻りトラフィックを許可する対応するOUTPUTルールもあります。

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

フィルタテーブルにはこれらの明示的な逆方向トラフィックルールが必要ですが、NATテーブルにはそうではありません。

さまざまな非公式参考資料で、次の抜粋を見てください。

  1. デジタルオーシャン:IptablesおよびNetfilterアーキテクチャの詳細な分析

特定のイベントにより、処理中にテーブルチェーンがスキップされます。たとえば、接続の最初のパケットのみがNATルールに対して評価されます。最初のパケットに対するすべてのNAT決定は、追加の評価なしに接続内のすべての後続のパケットに適用されます。 NAT 接続への応答には、正しいルーティングのためにリバース NAT ルールが自動的に適用されます。

  1. スーパーユーザー:NAT転送接続ルールの内部操作

しかし、netfilter(つまり、iptablesの「エンジン」として機能するパケットフィルタリング/修正フレームワーク)は十分にスマートです。着信[NAT]パケットが受信されるたびに、netfilterのconntrackテーブルと比較されます。 Netfilterは、パケットが既存の送信接続(ACKフラグセット、IP:ポート一致、TCPシーケンス番号一致など)への応答である場合、自動的にDNATを実行します。追加のルールは必要ありません。

  1. Karl Rupp: NAT チュートリアル

幸い、netfilterフレームワークは自動的にすべてのルールに逆ルールを追加するので、明示的なルールを設定するだけです。一般に、2つのルールのうちの1つに対する決定は、不確実性の低いルールを採用することによって行われる。たとえば、「ローカルサブネット内のすべてのパケットの送信者アドレスを置き換えます」というルールは、「クライアントがサーバーに何かを送信した場合、サーバー応答の受信者を別のものに置き換えます」よりもはるかに簡単です。経験的に最初に実行されるルールは、カーネルに明示的に設定されたルールです。

私が読んで公式ネットフィルター文書しかし、私はどこでもこの行動への言及を見つけることができませんでした。上記の声明を確認する公式参考資料はありますか?

ベストアンサー1

iptablesは明示的に追加されたすべてのNATルールに対して暗黙的に自動的にリバース/リバースルールを追加しますか?

完全ではありません。

最初の2つの文は正しいです。 3番目の文は、システムの仕組みを理解していない人の混乱した横説説です。

iptables nat(iptablesフィルタリングとは異なり)は接続で機能します。接続の最初のパケットは nat テーブルを通過し、それに応じて変換されます。同じ接続に属する後続のパケットは、NATテーブルを通過するのではなく、最初のパケットが変換されるときに設定された規則に従って単に変換されます。

iptables のマニュアルページhttps://linux.die.net/man/8/iptablesドキュメントには、「接続の最初のパケット」に対して nat テーブルが照会され、DNAT および SNAT 宛先のマニュアルページ部分に「(この接続のすべての将来のパケットも破損する)」と記載されています.

残念ながら、これより深い公式文書は見たことがありません。 iptablesの参考資料はFreezetux iptablesのチュートリアルですが、公式ではないようです。

おすすめ記事