新发行版的默认后端
RHEL 9 与 Debian 11 之后的发行版默认使用 nftables:规则用 nft 命令管理,保存到 /etc/nftables.conf,由 nftables 服务在开机时加载。相较 iptables 的链式结构,nftables 用表、链、规则集的层级组织配置,支持一次性原子替换整个规则集,写错时不会出现中间态;旧命令仍可通过兼容层运行,但两套混用会造成混乱。
基本信息
| 适用平台 | Linux(RHEL 9+/Debian 11+/Ubuntu 22.04+ 等) |
|---|---|
| 核心命令 | nft list ruleset、nft -f、nft add/delete |
| 配置文件 | /etc/nftables.conf |
| 服务 | systemctl enable --now nftables |
| 基线 | 规则集显式持久化并纳入配置管理 |
典型使用场景
- 新系统加固:直接按 nftables 语法编写规则集
- 从 iptables 迁移:把规则翻译后统一到 nft 一套口径
- 原子变更:用 nft -f 一次性加载完整规则集,避免中间态暴露
- 备份与审计:导出规则集文本纳入版本控制
- 容器与网桥场景:用 inet 表同时处理 IPv4 与 IPv6
查看与应用
查看与应用
nft list ruleset # 查看全部表与链
nft -f /etc/nftables.conf # 一次性加载规则集
systemctl enable --now nftables # 开机自动加载
nft list ruleset | tee /root/nft-backup-$(date +%F).ruleset # 备份规则集
nft -c -f /etc/nftables.conf # 只检查语法不加载,变更前用
systemctl status nftables --no-pager | head -5最小骨架示例
最小骨架示例
table inet filter {
chain input { type filter hook input priority 0; policy drop;
ct state established,related accept # 放行已建立连接的回包
iif lo accept # 放行本机回环
tcp dport 22 accept # 管理端口
tcp dport 443 accept # 业务端口
}
chain forward { type filter hook forward priority 0; policy drop; }
chain output { type filter hook output priority 0; policy accept; }
}结构逐层读法
| 层级 | 含义 | 注意点 |
|---|---|---|
| table | 规则集的容器,可按协议族划分 | inet 表同时处理 IPv4 与 IPv6 |
| chain | 规则列表与挂载点 | hook 与 priority 决定生效位置 |
| rule | 匹配条件与动作 | 按顺序匹配,先命中先生效 |
| policy | 链的默认动作 | input 建议 drop,output 按需 |
| ct state | 连接跟踪状态 | 放行 established,related 才不回包丢 |
同一台机器上不要混用 nft 与 iptables 命令改同一规则集:两套前端各自记账,容易互相覆盖,排障时以 nft list ruleset 的实际输出为准。
落地要点
- 变更前先 nft -c -f 校验语法,再实际加载
- nft list ruleset 的输出可直接作为备份,但恢复时注意计数器差异,必要时先清理
- 规则集纳入版本控制,变更留痕,便于回溯
- 迁移时确认 iptables 兼容层是否还被其它脚本使用,避免双写
- IPv6 规则不要遗漏:inet 表写法能一并覆盖,避免只保护 IPv4
部分发行版默认没有启用 nftables 服务,但内核模块已加载:规则需要显式持久化,不能依赖内存中的临时状态。