Linux

nftables 儀表錯誤:語法錯誤,意外的saddr,需要逗號或’}'

  • April 23, 2020

我有以下 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,看看它是否對沒有成功有任何影響。任何指針?

你有兩個問題:

  • 使用太舊版本的 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,而不是buster-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過濾器“命名空間”中聲明它並在**ip過濾器“命名空間”中使用它。這與例如iptables+不同,其中可以在任何表中使用ipset相同的 ipset集。

這將起作用(一旦您獲得足夠近的 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 過濾器表。

引用自:https://unix.stackexchange.com/questions/542139