接続レートメーターを追加するための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
^^^^^
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
を追加して、成功しないかどうかを確認しました。ポインタはありますか?
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-backports (stretch-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テーブルに戻すこともできます。