Linux
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
,看看它是否對沒有成功有任何影響。任何指針?
你有兩個問題:
- 使用太舊版本的 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,而不是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 過濾器表。