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 中交互式操作时,注释中使用的 双引号(
"") 要使用 转义(\)