nftables 核心是用结构化层级(表→链→规则)和原子操作替代命令拼凑:表按场景隔离(如 inet filter/nat),链依 priority 控制执行顺序,规则借集合高效匹配万级条目,部署推荐文件+原子加载。

表:按用途隔离,避免混杂
表不是功能标签,而是逻辑命名空间。推荐按场景建表,而不是照搬 iptables 的 filter/nat/mangle 划分:
-
统一用
inet协议族:同时覆盖 IPv4 和 IPv6,省去双栈重复配置 -
主机防护用
inet filter:放行回环、已连接、必要服务,其余默认 drop -
容器或转发流量单独建表,比如
inet forward或inet docker:避免和主机策略耦合,Docker 启动时也不易冲突 -
NAT 相关集中到
inet nat:DNAT、SNAT、端口转发全在此表定义,便于审计和迁移
链:优先级可控,执行顺序明确
链决定规则何时生效。基础链必须绑定 hook 和 priority,数字越小越早执行:
-
input 链设
priority 0:适合做第一层过滤(如黑名单拦截) - established 检查放在 priority 10:保证已建连流量快速通过,不卡在黑名单后
- 服务放行(SSH/HTTP)放在 priority 20:白名单兜底,防止误封
-
自定义链用于模块化:例如
nft add chain inet filter logging { type filter \; },再用jump logging复用日志逻辑
规则:少而准,靠集合撑规模
万级 IP 或端口不能靠写一万条规则。真正高效的规则,往往只有几行:
-
一条规则引用一个集合:
nft add rule inet filter input ip saddr @blacklist drop,集合里可存 5 万个 IP + 网段,匹配仍是毫秒级 -
集合启用
interval和timeout:支持 CIDR(如 192.0.2.0/24)和自动过期,不用定时 flush -
状态匹配直写,不加模块:用
ct state established,而非旧式-m conntrack --ctstate ESTABLISHED -
端口范围直接写
tcp dport { 22, 80-443 },语义清晰,无需拆成多条
部署:一次加载,持久可靠
避免逐条执行 nft 命令——容易中断、难回滚、无法校验。推荐用文件+原子加载:
-
所有规则写进
/etc/nftables.conf:格式为 nftables 原生语法,支持 include -
用
nft -f /etc/nftables.conf一次性加载:失败则整套不生效,无中间态 -
开机自动加载依赖 systemd 服务:Debian/Ubuntu 启用
nftables.service;RHEL/CentOS 检查/etc/sysconfig/nftables-config中的NFTABLES_CONF - Ansible 等工具分发时,先 template 渲染,再 command 加载,最后 shell 校验
nft list chain inet filter input

















