nftables を更新した後の設定エラー

nftables を更新した後の設定エラー

過去 2 年間、同じ設定で nftables を使用してきましたが、先日プログラムを更新したところ、すべてのドキュメントにはまだ正しいと記載されているにもかかわらず、設定が有効ではないというエラーが表示されます。誰か不正なシンボルか何かを見つけられるでしょうか?

これが私の設定です:


flush ruleset

# `inet` applies to both IPv4 and IPv6.
table inet filter {
    chain input {
        type filter hook input priority 0;

        # accept any localhost traffic
        iif lo accept

        # no ping floods:
        ip protocol icmp icmp type echo-request limit rate over 10/second burst 4 packets drop
        ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop

        # accept traffic originated from us
        ct state established,related accept

        # ssh
        tcp dport 22 accept

        # http/https
        tcp dport 80 accept
        tcp dport 443 accept

        # tftp/netboot
        udp dport 4011 accept
        udp dport 67 accept
        tcp dport 69 accept
        udp dport 69 accept

        # listinator
        tcp dport 8080 accept
        tcp dport 4343 accept

        # smb
        tcp dport 139 accept
        tcp dport 445 accept
        udp dport 137 accept
        udp dport 138 accept

        # mc
        tcp dport 25565 accept

        # count and drop any other traffic
        counter drop
    }

    chain output {
        type filter hook output priority 0;
        policy accept;
    }

    chain forward {
        type filter hook forward priority 0;
        nft add rule inet filter forward ct status dnat accept;
        policy drop;
    }
}

起動時のエラー:

Starting nftables...
/etc/nftables.conf:57:6-8: Error: syntax error, unexpected add
        nft add rule inet filter forward ct status dnat accept;
            ^^^
nftables.service: Main process exited, code=exited, status=1/FAILURE
nftables.service: Failed with result 'exit-code'.
Failed to start nftables.

答え1

これはnftables 脚本コマンドでロードされますnft -fnft単語は内部では意味を持たず、表示されるべきではありません。しかし、同じ場所に 1 1/2 個の他の問題があります。それでは見てみましょう:

コマンドがエラーを発する行の周辺にはnft次の内容があります:

   chain forward {
       type filter hook forward priority 0;
       nft add rule inet filter forward ct status dnat accept;
       policy drop;
   }
  • nft削除される、

  • すでにinet filter forward(チェーン)ブロック内にある

    したがって、add rule inet filter forwardも削除する必要があります。 実際には、;の後に新しい行があるため、 は不要です。

           ct status dnat accept
    
  • policy drop;基本チェーン定義と一緒に配置する必要があります

    今回は;構文の必須部分policyです。キーワードは意味、一部ではないルール定義。これは現在、間のルールによってベースチェーン定義から分離されて受け入れられているように見えますが、これは信頼できるものではありません。これは後のリリースで変更される可能性があります。

    同じ注意事項がチェーンにも当てはまります。後で誤ってルールを挿入しないように、基本チェーン定義からoutput分離しないでください。policy accept;

forward最終的に、チェーンは次のように置き換えられます。

    chain forward {
        type filter hook forward priority 0; policy drop;
        ct status dnat accept
    }

正しい構文ではあるが、あまり面白くないのは、次のようにスクリプトの最後に、ブロック内ではなく構造の完全に外側でルールを定義することです。

    chain forward {
        type filter hook forward priority 0; policy drop;
    }
}
add rule inet filter forward ct status dnat accept

いずれにせよ、チェーン ブロックnft list ruleset内で以前と同じように表示されますinet filter forward


ノート:

  • 使用するのはOKですがip protocol icmp、使用するのはダメですip6 nexthdr ipv6-icmp

    その理由は、IPv4ヘッダーのプロトコルが常にレイヤー4プロトコルであるIPv4とは対照的に、IPv6の次のヘッダー必ずしもレイヤー4(icmp、udp、tcp...)ヘッダーではありません。代わりに拡張ヘッダーIPv6 ヘッダーとレイヤー 4 (最終) ヘッダーの間に表示されます。この場合、ルールは一致しません。

    OS は既にこのパケットがどのレイヤー 4 プロトコルに属しているかを判別しているため、この情報はパケット コンテンツ情報ではなくメタ情報として利用できますmeta l4proto ipv6-icmp

    これもまたマニュアルページに記載されている:

    この表現は、IPv6 ヘッダー フィールドを参照します。 を使用する場合は注意してください。 ip6 nexthdr値は次のヘッダーのみを参照します。つまり、ip6 nexthdr tcpIPv6 パケットに拡張ヘッダーが含まれていない場合にのみ一致します。フラグメント化されたパケットや、たとえばルーティング拡張ヘッダーを含むパケットは一致しません。meta l4proto 実際のトランスポート ヘッダーを一致させ、追加の拡張ヘッダーを無視する場合は、 を使用してください。

    しかし実際には、同じ行にicmpv6 type ...行が含まれているため、これはすでにレイヤー4プロトコルをICMPv6に一致するようにフィルタリングしており、同時にICMPv6を使用すると、レイヤー3プロトコルが暗黙的にIPv6と一致するように設定されます。: それを正すために何も必要ありません。

    ip protocol icmp同様に、前の行も同じ理由でなくてもかまいません(ただし、現在の動作は問題ありません)。

    この線:

            ip6 nexthdr icmpv6 icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
    

    次のように単純に置き換える必要があります:

            icmpv6 type echo-request limit rate over 10/second burst 4 packets drop
    

    (先頭に付ける必要はありませんmeta nfproto ipv6 meta l4proto icmpv6

  • FTPサーバー

  • ポート値が異なるだけの同一のルールは、次のように分解できる。匿名セットnftables バージョン1.0.2以上では-o(optimize)オプションも存在するこれを自動的に実行してみます。

関連情報