最常见原因是规则未成功插入或被静默拒绝。需逐层验证:nft list tables 确认 table 存在;nft list chain ip filter input 确认 chain 已正确定义;检查 priority 是否冲突;用 nft list ruleset -a -n 查看完整结构并避免 DNS 干扰;最后检查 dmesg 获取内核错误日志。

为什么 nft list ruleset 不显示新添加的规则?
最常见原因是规则未成功插入,或插入时因 table、chain、priority 冲突被静默拒绝。nftables 不会报错提示“priority 已存在”,而是跳过插入——尤其在使用 add(非 insert 或 add rule)且目标位置已被占用时。
table 和 chain 不存在导致规则“消失”
nftables 要求规则必须挂载在已定义的 table 和 chain 下;如果先执行 add rule ip filter input ... 但 table ip filter 或 chain input 尚未创建,该命令会静默失败(返回 0 但无效果)。验证方式:
- 运行
nft list tables确认 table 存在 - 运行
nft list chain ip filter input确认 chain 已声明且类型/hoook/priority 匹配 - 若 chain 不存在,需先用
nft add chain ip filter input { type filter hook input priority 0 \; }
priority 冲突让新规则无法生效
同一 hook 下多个 chain 共享 priority 命名空间。例如:input hook 上已有 priority 0 的 filter chain,再建一个 priority 0 的 raw chain 会失败(nft 不报错,但 chain 不创建,其下规则自然不显示)。
- 查看所有 hook 上的 chain 及 priority:
nft list chains - 避免冲突:显式指定非重叠 priority,如 raw 链用
priority -300,mangle 用-150,filter 用0,security 用150 - 注意:priority 是整数,值越小越早执行;重复值 = 冲突 = 规则不加载
调试时漏掉 -a 导致看不到 handle
nft list ruleset 默认不显示规则 handle,而某些操作(如 delete rule)依赖 handle。更关键的是:若规则因语法错误未加载,nft list ruleset 根本不会列出它——你以为加了,其实根本没进内核。
- 加
-a查看完整结构:nft list ruleset -a - 加
-n避免 DNS 反查干扰判断(尤其有 IP 别名时) - 检查 dmesg:
dmesg | tail -20,nft 加载失败常留内核日志,如 “Could not process rule: File exists” 指 priority 冲突
hook input 或 type filter),导致后续规则挂载失败却不报错。务必逐层验证 table → chain → rule 是否都真实存在于 nft list 输出中。










