フローテーブルnftables
接続が確立されると、通常の転送経路をスキップする「高速経路」にトラフィックをオフロードする機能です。フローテーブルを設定するには、2つの設定が必要です。 1つ目は、flowtable
テーブルの一部として定義されたものです。声明に続き、flow offload
これが私の質問です。マニュアルnft
ページには次のように記載されています。
FLOW STATEMENT
A flow statement allows us to select what flows you want to accelerate
forwarding through layer 3 network stack bypass. You have to specify
the flowtable name where you want to offload this flow.
flow add @flowtable
これウィキページ以下の完全な構成例が含まれています。
table inet x {
flowtable f {
hook ingress priority 0; devices = { eth0, eth1 };
}
chain forward {
type filter hook forward priority 0; policy drop;
# offload established connections
ip protocol { tcp, udp } flow offload @f
ip6 nexthdr { tcp, udp } flow offload @f
counter packets 0 bytes 0
# established/related connections
ct state established,related counter accept
# allow initial connection
ip protocol { tcp, udp } accept
ip6 nexthdr { tcp, udp } accept
}
}
これが私が混乱しているところです。この例では、トラフィックとitにip protocol { tcp, udp }
同じaccept
条件()を使用しますflow offload
。ストリームがストリームテーブルにflow offload
暗黙的に追加され、これらの条件が常に一致する必要があるためですか?accept
それとも、この例は単なる偶然の一致であり、ルールはaccept
より厳密になる可能性がありますか?
具体的には、インバウンドSSHトラフィックのみを転送し、eth0
トラフィックオフロードを有効にするとします。転送チェーンをこのように設定する必要がありますか?
chain forward {
type filter hook forward priority 0; policy drop;
# offload established connections
ip protocol { tcp, udp } flow offload @f
# established/related connections
ct state established,related counter accept
# allow initial connection
iif eth0 tcp dport 22 accept
}
それともこんなこと? (flow offload
ルールが変更されただけです)
chain forward {
type filter hook forward priority 0; policy drop;
# offload established connections
iif eth0 tcp dport 22 flow offload @f
# established/related connections
ct state established,related counter accept
# allow initial connection
iif eth0 tcp dport 22 accept
}
答え1
まず、Wikiでいくつかの重要な文章を指摘したいと思います。
ストリーム式を使用すると、順方向チェーンからオフロードするストリームを選択できます。
ステータスが生成されると、トラフィックはオフロードされます。これは通常、最初の応答パケットがフローテーブルエントリを生成することを意味します。初期トラフィックを許可するにはファイアウォールルールが必要です。順方向チェーンのフロー式は、初期接続の戻りフローと一致する必要があります。
具体的に言えば、
これはまた、特別なIPルールを使用する場合、そのルールが元のトラフィックだけでなく応答パケットトラフィックとも一致することを確認する必要があることを意味します。
経験的には、応答の方向、設定、初期化などを決定するのは難しいです。
また例の彼らの説明に注意深い注意を払いなさい。プロセス記述は、設定された負荷をオフロードし、さらに初期接続を受け入れる必要があります。
私の考えでは、オフロードは一般的に良いものなので、次のような広範なプロセス記述を使用します。
ip6 nexthdr { tcp, udp } flow add @f counter
ip protocol { tcp, udp } flow add @f counter
その後、通常どおり入って出ることを許可します。
ct state established,related counter accept
iif $DEV_INSIDE counter accept
iif $DEV_OUTSIDE ip6 daddr <mail server> tcp dport { smtp } counter accept
ストリームドアはそう見えるかもしれませんが、確かにすべてを受け入れるわけではありません。上記のASCII図を見ると、さらに理解するでしょう。
パブロ・ネイラ・アユソは次のように指摘しています。やや異なる方法:
フローが設定された状態になると、「フローオフロード」アクションは接続追跡定義に基づいてフローエントリを追加します。我々は、交通が双方向に行くのを見た。したがって、フローの最初のパケットだけが既存の転送パスに従います。
全体的に、はい、flow add
説明でより具体的に説明できますが、最終的なトラフィックがESTABの状態に従うのは面倒でなければならず、保護を維持するために他の場所で通常のステートフルルールを使用できます。
このリソースまた、かなり深く、エキサイティングです。
最初の例を使用してnmap
スキャンしてもう一度確認します。また、を使用して成功したかどうかを確認できますconntrack -L
。