
本文教你在现代 Linux 上用 nftables 替代 iptables,覆盖结构、迁移、生产模板、NAT 与日志五类场景。读完你会拿到一份可直接套用的服务器入站规则、一份命令对照表、以及针对规则不生效与日志爆量的排查清单。
一、为什么从 iptables 迁移到 nftables
iptables 二十多年来规则越多线性遍历越慢、表与链结构限制多、IPv4 与 IPv6 要写两套。nftables 是 Linux 3.13 引入的新框架,2018 年起被主流发行版设为默认。它的核心优势:单一框架支持 IPv4 与 IPv6 与桥接、原子规则更新不出现中间态、set 与 map 数据结构百万级条目仍是常数时间查询、更友好的 JSON 输出。
iptables 命令现在仍可用,但底层走 iptables-nft 翻译层最终调 nftables 后端,新项目直接学 nftables 语法。云服务器官方镜像新版本默认就是 nftables,相关选型可参考 云服务器选购指南。
二、表/链/规则三层结构
nftables 三层结构:table 按地址族分类(inet 同时支持 IPv4 与 IPv6,另有 ip、ip6、arp、bridge、netdev);chain 挂到 hook 点(prerouting、input、forward、output、postrouting)并设默认 policy;rule 是具体匹配与动作。最常用的是 inet filter 表,一表搞定 IPv4 与 IPv6。最小骨架包含三条链:input 链设默认 policy drop,加上 established/related 放行、回环接口放行、22 端口放行;forward 链默认 drop;output 链默认 accept。规则用 chain input { type filter hook input priority 0; policy drop; ... } 这样的语法定义。
这套规则的含义:进入主机的包默认丢弃,已建立连接放行,回环接口放行,22 端口放行。注意 chain 必须显式声明 type、hook 与 priority 才会被内核挂载,不写就是普通用户链不会被自动调用。
三、生产服务器入站规则模板
Web 服务器的实战规则要点:先定义一个 set ssh_admins 类型为 ipv4_addr,把允许 SSH 的可信 IP 段写进去;input 链先丢弃 invalid 连接、放行 established 与回环、对 ICMP echo 用 limit rate 5/second 限速、放行 IPv6 邻居发现、再用 ip saddr @ssh_admins tcp dport 22 ct state new accept 限制 22 端口只接受可信 IP、放行 80 与 443、最后 log prefix "nft drop: " limit rate 5/minute 加 counter drop 兜底。
亮点:用 set 维护可信 IP 段,规则里直接用 @ssh_admins 引用,新增 IP 只改 set 不改规则;ICMP echo 限速避免 ping flood;80 与 443 公开;其他全部 drop 并打日志。日志通过 dmesg 与 journald 查 nft drop 前缀。Web 部署相关加固可参考 美国 VPS 部署教程。
四、命令对照与迁移路径
常用 iptables 命令对应的 nft 写法基本一一对应:列表用 nft list ruleset、加规则用 nft add rule inet filter input ...、NAT 用 nft add rule inet nat postrouting masquerade、清空用 nft flush chain、保存与恢复用 nft list ruleset 与 nft -f rules.nft。
老规则迁移用 iptables-translate 工具:把 iptables 命令前面加这个前缀就会输出对应的 nft 命令,省得手翻。批量迁移用 iptables-save 管道接 iptables-restore-translate,能把整个规则集自动转换成 nft 语法再手工微调即可。
五、NAT 与端口转发
nftables 的 NAT 表与 filter 表分开,单写一个 nat 表挂到 prerouting 与 postrouting:prerouting 链用 priority -100 做 DNAT,例如把出口网卡的 8080 端口转到内网 10.0.0.10:80;postrouting 链用 priority 100 做 masquerade,自动用出口接口 IP 做 SNAT。
这套规则的含义:外网 8080 端口的请求 DNAT 到内网;内网 10.0.0.0/24 段出网走 masquerade。priority -100 用于 DNAT 在路由前生效,priority 100 用于 SNAT 在路由后生效。
容器场景下 Docker 仍用 iptables-nft 维护自己的 DOCKER 链,与你手写的 nftables 规则共存。要看完整规则集用 nft list ruleset,会把 Docker 自动生成的也列出来。CDN(Content Delivery Network,内容分发网络)边缘节点的 DDoS 防护通常配合 nftables 与 set 做大规模 IP 黑名单,相关边缘策略可继续看 W3 Total Cache 调优实战 与 WordPress 香港主机选购指南。
六、原子更新、持久化与排查
nftables 的原子更新是杀手锏:用 nft -f 加载整个文件时新旧规则切换是原子的,不会出现规则部分应用导致连接被误拦截的中间态,对生产改规则非常关键,iptables 一条条加就会有窗口期。
持久化推荐:把规则写到 /etc/nftables.conf,开头加 nft 解释器声明与 flush ruleset,systemctl enable nftables.service 让它开机加载。RHEL 与 Ubuntu 都自带这个 service。
常见问题排查:规则不生效要检查 chain 是否声明 type/hook/priority,以及规则顺序是否被默认 policy 覆盖;日志看不到通常是没写 log 前缀或 limit rate 太严;set 查询命中不到用 nft list set 看实际元素;counter 数字异常可能命中了上一条 established 规则,把 counter 加到具体规则做精确计数;重启后规则丢失通常是 nftables.service 没 enable 或配置文件语法错误。
生产环境建议把 nftables 规则纳入 Git 管理,每次改动通过 PR 审核后再下发,杜绝凭记忆改防火墙的事故。更多安全相关文章见 WordPress 分类。
七、前端封装、性能与日常运维
发行版自带的 firewalld(RHEL 系)与 ufw(Debian 系)都是 nftables 的前端封装。firewalld 用 zone 概念按网络位置分组规则,适合多网卡服务器;ufw 接口最简洁,适合个人服务器。两者底层都生成 nft 规则。建议看场景选择:单机小集群且规则简单,用 firewalld 或 ufw 省事;规模大、规则复杂、有版本管理需求,直接写 nft 文件加 Ansible 下发更可控。混用是禁忌:firewalld 会清空它认为不属于自己的规则,覆盖手写的 nft。
nftables 的性能优势体现在大规则集:set 与 map 在内部用红黑树或哈希表实现,百万条目查询仍是常数时间,远优于 iptables 的线性遍历。生产环境给爬虫 IP 黑名单常用 set 维护几十万 IP 都不会有性能问题。监控对接上每条规则加 counter 关键字会统计命中包数与字节数,nft -j list ruleset 输出 JSON 便于解析,常见做法是定期推到 Prometheus 配合 Grafana 看命中趋势。日常运维建议规则变更走 Git PR、每月做一次规则集 review 删掉过期临时规则、灾备演练把规则文件能否快速重建作为必测项。
总结与建议
nftables 是 Linux 防火墙的现代答案:单一框架、原子更新、内置 set 与 map、IPv4 与 IPv6 统一。建议按本文顺序落地:先理解表与链与规则三层结构,再用迁移工具自动转换老规则,最后把规则文件纳入版本管理仓库。多机部署可用配置管理工具下发并把计数器接入监控系统。新项目直接学 nftables 语法回报更高。