nftables 仪表错误:语法错误、意外的 Saddr、需要逗号或“}”

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

你有两个问题:

  • 使用太旧版本的 nftables。

    我可以重现该错误Error: syntax error, unexpected saddr, expecting comma or '}'(如 Debian 9 中所示)。米(nftables 维基)建议nftables>= 0.8.1 且核心>= 4.3。

    升级nftables。例如,在 Debian 9 上,使用拉伸向后移植拉伸向后移植, 不是破坏者向后移植) 版本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’?
    

    事实上,许多对象对于声明它们的表来说是本地的。所以你不能在网络过滤器“命名空间”并在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过滤器桌子。

相关内容