フローテーブルを使用するときに「フローオフロード」ステートメントをどのように設定する必要がありますか?

フローテーブルを使用するときに「フローオフロード」ステートメントをどのように設定する必要がありますか?

フローテーブル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

関連情報