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; |
加载配置时报错: Error: Statement after terminal statement has no effect
错误原因 : nftables
规则中在 终止语句(terminal statement
)(如 jump
或 dnat
)后添加的语句(如 counter
)没有作用,因为 jump
或 dnat
语句已经处理了数据包,不会再执行后续的语句。
在
nftables
中,终止语句(terminal statement
) 是那些一旦执行后就结束了该数据包的处理,例如jump
、accept
、drop
、dnat
、snat
等。因为这些语句会决定数据包的最终去向,所以在这些语句后面再添加如counter
这样的语句是无效的。
解决方法 : 要正确配置计数器,你需要 将 counter
放在终止语句 之前,这样在执行 jump
或 dnat
之前,数据包会先经过计数器。
ip daddr 127.0.0.11 counter jump DOCKER_OUTPUT; |
syntax error
一次性配置多个端口
假如要在一个规则中同时放通 HTTP 和 HTTPS (80
和 443
端口),以下是错误语句
nft 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" |
正确格式如下:
nft insert rule inet filter input handle 11 tcp dport { 80,443 } counter accept comment \"for nginx\" |
注意: 在 cmd 中交互式操作时,注释中使用的 双引号(
""
) 要使用 转义(\
)