web-dev-qa-db-ja.com

nftablesメーターエラー:構文エラー、予期しないsaddr、コンマまたは '}'が必要です

接続レートメーターを追加するためのnftableルールを以下に示します。

nft add rule ip filter input tcp dport @rate_limit meter syn4-meter \{ ip  saddr . tcp dport timeout 5m limit rate 20/minute \} counter accept

エラーが発生します:

Error: syntax error, unexpected saddr, expecting comma or '}'
add rule ip filter input tcp dport @rate_limit ct state new meter syn4-meter { ip saddr . tcp dport timeout 5m limit rate 20/minute } counter accept
                                                                                  ^^^^^

nftablesルールセット

table ip filter {
    chain input {
        type filter hook input priority 0; policy accept;
    }
}
table inet filter {
    set rate_limit {
        type inet_service
        size 50
    }

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

最初はinetだけを試しましたが、エラーが発生したため、ipを追加して、成功しないかどうかを確認しました。ポインタはありますか?

1
losintikfos

2つの問題があります。

  • 古すぎるバージョンのnftablesを使用しています。

    エラーを再現できましたError: syntax error, unexpected saddr, expecting comma or '}' nftablesバージョン0.7を使用(Debian 9にあります)。 Meters(nftables wiki)nftables> = 0.8.1およびkernel> = 4.3を提案します。

    アップグレードnftables。たとえば、Debian 9では、 stretch-backportsstretch-backports、notbuster-backports)バージョン0.9.0-1~bpo9+1、申し訳ありませんが、他のディストリビューションでそれを行う方法を検索する必要があります。

  • コマンドで指示されているように、間違ったテーブルを使用している(nftables 0.9.2を使用している場合):

    # nft add rule ip filter input tcp dport @rate_limit meter syn4-meter \{ ip  saddr . tcp dport timeout 5m limit rate 20/minute \} counter accept
    Error: No such file or directory; did you mean set ‘rate_limit’ in table inet ‘filter’?
    

    実際、多くのオブジェクトは、それらが宣言されているテーブルに対してローカルです。したがって、inet filter "namespace"で宣言して、ip filter "namespace"で使用することはできません。これは、たとえばiptables + ipsetとの違いです。ここでは、同じipsetsetを任意のテーブルで使用できます。

    これは機能します(最近十分なnftablesを取得すると):

    nft add rule inet filter input tcp dport @rate_limit meter syn4-meter \{ ip  saddr . tcp dport timeout 5m limit rate 20/minute \} counter accept
    

    または、メーター定義をip filterテーブルに戻すこともできます。

1
A.B