nft list ruleset 不显示新规则的 table / chain / priority 冲突

24次阅读

最常见原因是规则未成功插入或被静默拒绝。需逐层验证: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 冲突

为什么 nft list ruleset 不显示新添加的规则?

最常见原因是规则未成功插入,或插入时因 tablechainpriority 冲突被静默拒绝。nftables 不会报错提示“priority 已存在”,而是跳过插入——尤其在使用 add(非 insertadd rule)且目标位置已被占用时。

tablechain 不存在导致规则“消失”

nftables 要求规则必须挂载在已定义的 tablechain 下;如果先执行 add rule ip filter input ...table ip filterchain 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 0filter chain,再建一个 priority 0raw 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 冲突

实际中最容易被忽略的是:chain 创建时没写全参数(比如漏了 hook inputtype filter),导致后续规则挂载失败却不报错。务必逐层验证 table → chain → rule 是否都真实存在于 nft list 输出中。

text=ZqhQzanResources