Linux nftables 防火墙常见错误

环境信息

  • Ubuntu 24.04.1 LTS (Noble Numbat)
  • nftables v1.0.9 (Old Doc Yak #3)

配置错误

Statement after terminal statement has no effect

有以下配置:

ip daddr 127.0.0.11 jump DOCKER_OUTPUT counter;

meta l4proto tcp ip daddr 127.0.0.11 tcp dport 53 dnat to 127.0.0.11:45143 counter;

加载配置时报错: Error: Statement after terminal statement has no effect

错误原因nftables 规则中在 终止语句(terminal statement(如 jumpdnat)后添加的语句(如 counter)没有作用,因为 jumpdnat 语句已经处理了数据包,不会再执行后续的语句。

nftables 中,终止语句(terminal statement 是那些一旦执行后就结束了该数据包的处理,例如 jumpacceptdropdnatsnat 等。因为这些语句会决定数据包的最终去向,所以在这些语句后面再添加如 counter 这样的语句是无效的。

解决方法 : 要正确配置计数器,你需要 counter 放在终止语句 之前,这样在执行 jumpdnat 之前,数据包会先经过计数器。

ip daddr 127.0.0.11 counter jump DOCKER_OUTPUT;

meta l4proto tcp ip daddr 127.0.0.11 tcp dport 53 counter dnat to 127.0.0.11:45143;

syntax error

一次性配置多个端口

假如要在一个规则中同时放通 HTTP 和 HTTPS (80443 端口),以下是错误语句

# nft insert inet filter input handle 11 tcp dport 80,443 counter accept comment \"for nginx\"
Error: syntax error, unexpected inet, expecting rule
insert inet filter input handle 11 tcp dport 80,443 counter accept comment for nginx
^^^^

nftables 中,多个端口 在指定时不能直接用逗号分隔。对于多个端口,应该使用集合({})的语法来指定。以下为正确语法

# nft insert rule inet filter input handle 11 tcp dport { 80,443 } counter accept comment \"for nginx\"

注意: 使用 集合{})语法时要注意其中的空格,{ 80,443 } 是正确格式,如果写成 {80,443} 则是错误格式

cmd 中添加注释报错

使用以下语句添加规则报错:

# nft insert rule inet filter input handle 11 tcp dport { 80,443 } counter accept comment "for nginx" 
Error: syntax error, unexpected string, expecting end of file or newline or semicolon
insert rule inet filter input handle 11 tcp dport { 80,443 } counter accept comment for nginx
^^^^^

正确格式如下:

# nft insert rule inet filter input handle 11 tcp dport { 80,443 } counter accept comment \"for nginx\"

注意: 在 cmd 中交互式操作时,注释中使用的 双引号("" 要使用 转义(\