iptablesからnftablesに移行しています。 nftablesのパケット処理順序に関する基本的な質問があります。
同じタイプ(inetなど)の複数のテーブルを作成でき、各テーブル内で優先順位が異なるか、同じチェーンを作成できるため、処理順序は何ですか?
たとえば、次のように生成すると、順序はどうなりますか?
table inet t1 {
chain INPUT {
type filter hook input priority 20; policy accept;
...
}
}
table inet t2 {
chain INPUT {
type filter hook input priority 20; policy accept;
...
}
}
チェーンが別の入力に接続されていることは理解していますが、他のテーブルの背後にあるロジックはまだ理解していません。
これが愚かな、または基本的な質問であればお詫び申し上げます。
答え1
例の順序は次のとおりです。はっきりしないただし、両方のチェーンが通過します(パケットが最初のチェーンから削除されない限り)。
Netfilterおよびネットワーク/ルーティングスタックはソート機能を提供します。
これは一般ネットワークのNetfilterとパケットフロー模式図:
使用されますが、iptables次回適用される場合、全体的な動作は同じであることに注意してください。nftables微妙な違いがあります(例:壊すそしてフィルター、これはすべてですフィルター存在するnftablesmangle/OUTPUTの代わりに、おそらく次のように翻訳する必要があります。入力ルーティングフック出力または、ほとんどの橋が一緒に混合されているebtablesそしてiptables下半身から見た修正する: には存在しませんnftables存在するが避けなければならないnftables直接ブリッジファミリー直接、そしてカーネル>= 5.3を使用する場合つながるそこには機能が必要です(br_netfilter
カーネルモジュールをまったく使用しません)。
テーブルの役割
テーブルが入っています。nftablesテーブルの値と等しくないiptables:これは厳しくないです。存在するnftables、これテーブルチェーンを整理するコンテナであり、置くおよび他の種類のオブジェクトを含み、その範囲を制限します。反対側にiptablesこれは完全に許可されており、時には同じテーブルに異なるチェーンタイプ(nat、フィルタ、パスなど)を混在させる必要があります。たとえば、これがパブリックチェーンにアクセスできる唯一の方法です。置くその範囲はグローバルではなくテーブルに制限されているためです。iptables'仲間IPセット)。
その後、特定の処理または特定のトラフィックを処理するために同じシリーズ(同じタイプのチェーンを含む)の複数のテーブルを持つことも完全に許可されます。このテーブルの内容を変更する場合、ルールを変更するリスクはありません。他のテーブル(完全な結果にもかかわらず、まだ競合する効果が発生する危険性がある)ルールを管理するのに役立ちます。例えばNFTLBロードバランサーは、名前付きテーブル(各シリーズ)を生成します。NFTLBは独自に管理するように設計されており、他のカスタムテーブルと競合しません。
フック間とフック内で整列
特定のシリーズ(netdev、bridge、arp、ip、ip6)で異なるHook(entrance、pre-routing、input、forwarding、output、post-routing)に登録されているチェーンは、Netfilterが提供するHookの順序に従って並べ替えられ、上の図のように表示されます。優先順位の範囲は同じフックに制限され、ここでは重要ではありません。たとえば、パケット転送の場合、以前のtype filter hook prerouting priority 500
状況が引き続き発生します。type filter hook forward priority -500
該当する場合、特定のシリーズの可能な各フックについて、各チェーンは同じ場所に登録されている他のチェーンと競合します。これテーブルここでは、家族を定義する以外は目的を提供しません。優先順位が異なる限り、特定のフックタイプ内では、パケットはそのフック内のチェーンを最も低い優先順位から最も高い優先順位に渡します。同じシリーズとフックタイプの2つのチェーンに正確に同じ優先順位が使用されている場合、順序は定義されません。チェーンを作成するとき、現在のカーネルバージョンは、対応する接続リスト構造で同じ優先順位を持つチェーンの前または後にチェーンを追加しますか?次のカーネルバージョンでも同じ動作が維持されますか、それとも一部の最適化によってこの順序が変わりますか?これは文書化されていません。両方のフックは引き続き呼び出されますが、呼び出し順序は未定義です。
それは何の関係ですか?これは以下で引用された。マニュアルページ以下では、同じフックで複数のパケットを許可(または許可されていない)できることを明確に説明します。
accept
ルールセット評価を終了し、パケットを受け入れます。パケットは後で別のフックによってドロップされる可能性があります。たとえば、フォワードフックの承認は、パケットが後でルーティング後にフックからドロップされるか、または優先順位が高い他のフックからドロップされ、後で処理パイプラインで評価されることを可能にします。チェーン。
たとえば、あるリンクが特定のパケットを受け入れ、別のチェーンがこの同じパケットを破棄する場合、結果全体は常に次のようになります。減らす。ただし、フックは追加の操作を実行して副作用を引き起こす可能性があります。たとえば、パケットの送信元アドレス置くnextと呼ばれる別のチェーンがパケットをドロップしました。順序が変わってパケットが最初にドロップされると、この「副作用」アクションは発生しません。置く更新されません。したがって、この場合は同じ優先順位を使用しないでください。他のケースでは、ほとんど低下が発生せず、これは重要ではありません。人々はそれが重要ではないことを知らない限り、同じ優先順位を使用しないでください。
他のネットワークサブシステムとの関係
フック内ですべて整数範囲を使用して順序を選択できますが、いくつかの特定のしきい値が重要です。
~からnftables'wiki、これは遺産ですiptables固定値は次に適用されます。アイピーシリーズには他のサブシステムも含まれます。
NF_IP_PRI_CONNTRACK_DEFRAG (-400)
: 最適化の優先順位
NF_IP_PRI_RAW (-300)
: 接続追跡操作の前に元のテーブルの既存の優先順位 :
NF_IP_PRI_SELINUX_FIRST (-225)
SELinux 操作
NF_IP_PRI_CONNTRACK (-200)
: 接続追跡操作
NF_IP_PRI_MANGLE (-150)
: mangle 操作
NF_IP_PRI_NAT_DST (-100)
: ターゲット NAT
NF_IP_PRI_FILTER (0)
: フィルタ操作、フィルタテーブル
NF_IP_PRI_SECURITY (50)
: secmark を設定できるセキュリティテーブルの場所 例
NF_IP_PRI_NAT_SRC (100)
: ソース NAT
NF_IP_PRI_SELINUX_LAST (225)
:パケット終了時のSELinux
NF_IP_PRI_CONNTRACK_HELPER (300)
:終了時の接続追跡
そのうち実際に重要なのはほんの一握りです。iptables。たとえば、(不完全な)家族は次のようになりますip
。
NF_IP_PRI_CONNTRACK_DEFRAG (-400)
:チェーンが着信IPv4フラグメントを表示するには、次の場所にある必要があります。事前ルーティング優先順位は-400未満です。その後、再組み立てられたパケットのみが表示されます(断片の存在を確認するルールは一致しません)。NF_IP_PRI_CONNTRACK (-200)
:チェーンを作動させる今後 つながるに登録する必要があります。事前ルーティングまたは出力確率は-200未満です。たとえば、優先順位NF_IP_PRI_RAW (-300)
(またはポートがすべての場合に一致するようにするには、他の値<-200ですが、まだ>-400)として登録して追加します。notrack
防止するための声明つながるこのパケットの接続エントリを作成します。だからnftables等しいiptables'raw / pre-routing事前ルーティングフィルタリング十分な優先順位があります。
いくつかの雑多な
いくつかの特別な場合:
これイントラネット戸籍にアイピーそしてIP6また、家族のフック。
タイプナット
ルールがNAT関連ステートメントと一致し、実行された場合は異なる動作をします。つまり、パケットはもはや通過しません。ナットチェーンは同じフックにあります。タイプナット登録方法が異なります。 NAT以外のフックよりも優先順位が固定されています。例えば事前ルーティングまたは出力
NF_IP_PRI_NAT_DST
フィルタフックの場合、NATフックはすべて固定優先順位= -100で発生します。いくつかのNATフックはまだそれらの間の優先順位を尊重します。に関する追加情報タイプナットこのQ / Aでこれを確認できます。nftables:特定のフックに対してさまざまな種類のチェーンが評価されますか?両側のNATルールiptables - 旧バージョンそしてnftables4.18以前のカーネルと混在しないでください。 4.18以前の最初の施設iptables - 旧バージョンそしてnftables登録すると、フックのすべてのNATが処理されます。
答え2
長い話を短く
ネットフィルターの処理順序を理解するために、私はより直感的な形を好みます。だから私はしばしば以下を参照します。プルーフ
(input interface)
|
v
/-------+-------\
| sanity checks |
\-------+-------/
|
v hook NF_IP_PRE_ROUTING
+------+------+
| conntrack |
| defrag. |
+-------------+
| mangle |
| PREROUTING |
+-------------+
| nat (dst) |
| PREROUTING |
+------+------+
|
v
local delivery /----+----\ forward
+---------------+ route +---------------+
| \---------/ |
v v
/-----+-----\ /-----+-----\
| defrag. | | TTL check |
\-----+-----/ | dec. TTL |
| \-----+-----/
v hook NF_IP_LOCAL_IN |
+------+------+ |
| mangle (1) | |
| INPUT | |
+-------------+ |
| filter | v
| INPUT | /-----+-----\
+-------------+ | DF check |
| nat (src)(2)| \-----+-----/
+-------------+ |
| conntrack | |
| confirm | |
+------+------+ hook v NF_IP_FORWARD
| +------+------+
v | mangle (1) |
/-------+-------\ | FORWARD |
| local process | +-------------|
\-------+-------/ | filter |
| | FORWARD |
v +------+------+
/-----+-----\ |
| route | |
| frag. | |
\-----+-----/ |
| |
v hook NF_IP_LOCAL_OUT |
+------+------+ |
| conntrack | |
| defrag. | |
+-------------+ |
| mangle | |
| OUTPUT | |
+-------------+ v
| nat (dst)(3)| /-----+-----\
| OUTPUT | | frag. |
+-------------+ \-----+-----/
| filter | |
| OUTPUT | |
+------+------+ |
| |
v |
/-----+-----\ |
| reroute | |
\-----+-----/ |
| |
+------------------+ +------------------+
| |
v v hook NF_IP_POST_ROUTING
+---+-----+---+
| mangle (1) |
| POSTROUTING |
+-------------+
| nat (src) |
| defrag. |
| POSTROUTING |
+-------------+
| conntrack |
| confirm |
| frag. |
+------+------+
|
v
(output interface)