nftables table 不显示规则的 nft list tables / nft -a list chain

1次阅读

nft list tables 无输出是因为当前命名空间无任何表,nft 不自动创建默认表,需手动加载规则(如 nft -f /etc/nftables.conf),且必须显式指定 family、table 名,不能依赖默认上下文。

nftables table 不显示规则的 nft list tables / nft -a list chain

为什么 nft list tables 什么也不输出?

因为当前命名空间里压根没创建任何 table,nft 不会自动建默认表——这和 iptables 的“总有默认链”完全不同。常见于刚装完 nftables、只改了配置文件但没执行 nft -f,或者误以为启用服务就等于载入规则。

  • 检查是否真有规则加载:nft list ruleset,如果也空,说明规则根本没进内核
  • 确认配置文件路径和加载命令:比如写好了 /etc/nftables.conf,但忘了运行 nft -f /etc/nftables.conf
  • systemd 用户注意:systemctl enable nftables 只是开机启动服务,不等于自动加载规则;得确保 nftables.serviceExecStart 真的指向了你的配置文件(或启用了 nf_tables 模块且配置路径正确)

nft -a list chain 报错 “No such file or Directory

这个错误不是链不存在,而是你漏写了 table 名和 family。nft 要求显式指定作用域nft -a list chain ip Filter input 才合法;直接 nft -a list chain 会被解释成查所有 family+table+chain 组合,而内核不支持通配查询,于是返回 ENOENT。

  • 必须带三段:family(ip/ip6/inet)、table 名、chain 名
  • 查所有链?用 nft list ruleset,它会递归展开全部 table 和 chain
  • -a 只是显示 handle/position,不能单独用来“发现”链——它不提供枚举能力

family 选 inet 还是分开写 ipip6

取决于你是否需要 IPv4/IPv6 共享同一套规则逻辑。inet 是混合 family,能同时匹配双流量,但要求所有 chain 类型(如 input)在 IPv4 和 IPv6 下语义一致;而分开定义更灵活,也更常见于生产环境。

  • inet:适合简单双栈服务(如 http),且你确认所有 hook 行为在 v4/v6 下无差异
  • 分开写:避免意外继承问题(比如某条 ip6 规则因 family 写错被塞进 ip 表),也方便独立调试
  • 性能差异极小,但 inet 在高并发下可能略少一次 family 判定——不过几乎感知不到

规则加进去了,但 nft list table 仍不显示?

最可能是 table 名拼错了,或者 family 不匹配。nft 对大小写敏感,且 ipinet 是不同 family,哪怕 table 名一样,也是两个独立对象

  • 确认创建 table 的命令:比如 nft add table inet filter,那查的时候必须用 nft list table inet filter
  • 别用 nft list tables 试图找 table——它只列顶层 table 名,不带 family,实际已废弃;改用 nft list ruleset | head -20 看开头几行
  • 检查内核模块:lsmod | grep nf_tables,如果没加载,所有 nft 命令都会静默失败(尤其在 minimal kernel 或容器中)

事情说清了就结束。真正卡住的点往往不是语法,而是 family 和 table 的绑定关系没理清,以及把 nft 当成 iptables 那样“总有个默认上下文”来用。

text=ZqhQzanResources