Linux 网络防火墙进阶:如何用 nftables 替代 iptables

作者:袖梨 2026-07-07
nftables是iptables的全面升级而非简单命令替换,它以统一语法管理双栈及多表功能,Ubuntu 22.04+默认启用其后端,iptables仅作为兼容层运行;其核心由表、链、规则三层构成,支持inet协议族、原子操作与集合语法,6行即可实现最小安全策略,规则量减少40%且语义更清晰。

nftables 不是 iptables 的简单“命令替换”,而是整套规则模型的升级。它用统一语法管理 IPv4/IPv6、filter/NAT/mangle,规则更少、语义更直、执行更快。Ubuntu 22.04+ 默认已启用其后端,iptables 命令实际走的是兼容层(iptables-nft),所以迁移不是可选项,而是系统推荐路径。

理解表、链、规则三层结构

nftables 围绕三个基础元素组织:

  • 表(Table):仅作命名空间,不绑定功能。常用协议族有 inet(IPv4+IPv6 同时生效,推荐)、ip(仅 IPv4)、ip6(仅 IPv6)
  • 链(Chain):分基础链(如 inputforward,挂载在内核 hook 点)和普通链(用于模块化跳转)。创建时需指定 hookpriority(数字越小越先执行)
  • 规则(Rule):匹配条件与动作写在同一行。支持集合 {22, 80, 443}、端口范围 80-8080、状态直写 ct state established,无需 -m conntrack 等额外模块加载

快速部署最小安全策略

6 行命令即可构建白名单式防护框架:

  • nft add table inet filter
  • nft add chain inet filter input { type filter hook input priority 0 ; policy drop ; }
  • nft add rule inet filter input iifname "lo" accept
  • nft add rule inet filter input ct state { established, related } accept
  • nft add rule inet filter input tcp dport { 22, 80, 443 } ct state new accept
  • nft add rule inet filter input icmp type echo-request accept

这套配置默认拒绝所有入站流量,只放行回环通信、已建立连接、SSH/HTTP/HTTPS 及 ping 请求,规则量比 iptables 减少约 40%,逻辑清晰无歧义。

处理 Docker 等容器场景

Docker 默认操作 iptables 链,易与手动规则冲突。nftables 下有两种稳妥方案:

  • 禁用 Docker 自动管理:启动 dockerd 时加 --iptables=false,再显式将容器网桥流量纳入 nftables,例如:
    nft add rule inet filter forward iifname "docker0" oifname "eth0" ct state new accept
  • 隔离规则空间:为容器 NAT 单独建 inet nat 表,或定期运行 nft list ruleset 检查是否出现意外插入的规则

确保规则重启后依然生效

nft 命令默认只影响运行时,需持久化保存:

  • 导出当前规则到配置文件:sudo nft list ruleset > /etc/nftables.conf
  • 启用服务自动加载:sudo systemctl enable nftables
  • 加载配置立即生效:sudo nft -f /etc/nftables.conf
  • (可选)禁用旧 iptables 服务避免干扰:sudo systemctl disable --now iptables ip6tables

不复杂但容易忽略。

相关文章

精彩推荐