Linux 防火墙:iptables vs ufw vs nftables 对比与选型
概述
在 Linux 系统中,防火墙是网络安全的第一道防线。iptables、ufw、nftables 是三个最常被提及的防火墙工具,但它们处于不同的抽象层级,服务于不同的使用场景。
简单来说:
- iptables — 内核防火墙的"老牌"命令行接口,基于
netfilter框架,统治了 Linux 防火墙生态近 20 年 - nftables — iptables 的替代者,同样基于
netfilter,但架构更现代、语法更简洁、性能更好 - ufw — 站在前两者之上的前端工具,目标是简化防火墙配置("Uncomplicated Firewall"),底层后端可以是 iptables 或 nftables
关系图解
┌─────────────────────────────────────────────────┐
│ 用户(你) │
├─────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ ufw / firewalld │ │
│ │ (上层前端工具,简化操作) │ │
│ └──────────────┬───────────────────────────┘ │
│ │ 自动生成底层规则 │
│ ┌──────────────▼───────────────────────────┐ │
│ │ iptables / nftables CLI / nft │ │
│ │ (底层命令行工具,直接操作规则) │ │
│ └──────────────┬───────────────────────────┘ │
│ │ 通过系统调用下发规则 │
│ ┌──────────────▼───────────────────────────┐ │
│ │ netfilter(内核子系统) │ │
│ │ ┌───────────┐ ┌───────────┐ │ │
│ │ │ ip_tables │ │ nf_tables │ │ │
│ │ │ (旧内核) │ │ (新内核) │ │ │
│ │ └───────────┘ └───────────┘ │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
核心关系:
netfilter是 Linux 内核中的包过滤框架 —— 真正干活的是它iptables和nftables是用户空间工具,将规则写入netfilter内核模块iptables对应的内核模块是ip_tables,nftables对应的是nf_tables- ufw 不直接操作内核,它生成
iptables或nftables命令来配置防火墙
历史演进
2004 ─── iptables 成为主流(替代 ipchains)
│
├── Red Hat 引入 system-config-firewall
├── Ubuntu 引入 ufw(2008)
│
2014 ─── nftables 合并入 Linux 内核 3.13
│
2016 ─── Debian 9 / Ubuntu 16.04 开始推荐 nftables
│
2018 ─── RHEL 8 默认使用 nftables
│
2020 ─── iptables 在大部分发行版中被标记为"旧版"
│
2024+ ─── nftables 成为绝对主流,但 iptables 兼容层依然存在
详细对比
功能对比
| 维度 | iptables | ufw | nftables |
|---|---|---|---|
| 本质 | 底层防火墙工具 | 上层前端封装 | 底层防火墙工具(iptables 替代者) |
| 首次发布 | 2001 | 2008 | 2014(内核 3.13) |
| 语法风格 | 链式、参数多而长 | 简洁自然语言 | 结构化、类编程语言 |
| 学习曲线 | 陡峭 | 平缓 | 中等 |
| 配置方式 | 命令行 | 命令行 + 配置文件 | 命令行 + 脚本文件 |
| 规则保存 | 需额外工具(iptables-save) | 自动 | 内置 nft list ruleset |
| 批量修改 | 不支持,需全部导出再导入 | 不支持,逐个操作 | 原生支持原子化加载 |
| 性能 | 链式遍历,规则多时慢 | 同后端(由 iptables/nftables 决定) | 集合+映射优化,大规则集更快 |
| IPv4/IPv6 统一 | 分离(iptables + ip6tables) | 自动处理 | 统一处理 |
| 表与链 | 4 表 5 链(固定) | 抽象为"应用规则" | 表+链+集合+映射(灵活) |
| 内核模块 | ip_tables | 无独立内核模块 | nf_tables |
| 内核版本要求 | 全部 | 无特殊要求 | Linux ≥ 3.13(推荐 ≥ 4.10) |
| 并发规则集 | 不支持 | 不支持 | 原生支持(原子替换) |
| 集合/字典 | 不支持 | 不支持 | 原生支持(性能关键) |
| 调试能力 | trace 需额外模块 | 日志需额外配置 | 内置 nft monitor |
| 向后兼容 | — | 可通过 ufw backend 切换 |
通过 iptables-legacy / iptables-nft |
语法对比
| 操作 | iptables | ufw | nftables |
|---|---|---|---|
| 允许 SSH 入站 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
ufw allow ssh |
nft add rule inet filter input tcp dport 22 accept |
| 禁止某 IP | iptables -A INPUT -s 1.2.3.4 -j DROP |
ufw deny from 1.2.3.4 |
nft add rule inet filter input ip saddr 1.2.3.4 drop |
| 查看规则 | iptables -L -n -v |
ufw status verbose |
nft list ruleset |
| 开放端口 80 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT |
ufw allow 80/tcp |
nft add rule inet filter input tcp dport 80 accept |
| 清空规则 | iptables -F |
ufw reset |
nft flush ruleset |
如何选择
选型流程图
你是什么用户?
│
├── 普通桌面用户 / 刚接触 Linux
│ └── ▶ ufw(最简单的选择,不用想太多)
│
├── 服务器管理员 / DevOps
│ ├── 需要快速开放/关闭端口 → ufw
│ └── 管理复杂规则集(NAT、转发、限流)→ nftables
│
├── 网络安全工程师 / 高级运维
│ ├── 偏好现代语法和性能 → nftables
│ └── 维护旧系统(CentOS 6 等)→ iptables
│
└── 发行版默认怎么配?
├── Ubuntu 22.04+ + ufw 前端 = ufw + nftables 后端
├── RHEL 9 / Rocky 9 + firewalld = firewalld + nftables 后端
├── Debian 12 = nftables 是默认后端
└── 老旧系统(CentOS 6 / Debian 8)= iptables
推荐策略
| 场景 | 推荐 | 原因 |
|---|---|---|
| 个人桌面(Ubuntu) | ufw | 一行命令开放/关闭端口,足够用 |
| 个人桌面(其他发行版) | ufw 或发行版自带工具 | 简单够用 |
| VPS / 云服务器 | ufw 或 nftables | ufw 适合简单场景,nftables 适合复杂场景 |
| 生产环境(简单规则) | ufw | 规则少,ufw 最省事 |
| 生产环境(复杂规则) | nftables | NAT、端口转发、限流、黑名单,nftables 更强大 |
| 老旧系统维护 | iptables | 系统不原生支持 nftables,没必要折腾 |
| 防火墙/网络安全产品开发 | nftables | 性能、原子化加载、集合映射,满足高级需求 |
一句话总结
- ufw = 傻瓜相机 —— 开机即用,适合日常
- nftables = 单反相机 —— 功能强大,适合专业场景
- iptables = 胶片相机 —— 经典,但该退役了
当前发行版默认情况
| 发行版 | 默认防火墙工具 | 底层后端 |
|---|---|---|
| Ubuntu 24.04+ | ufw + iptables-nft | nftables |
| Ubuntu 22.04 | ufw + iptables-nft | nftables |
| Debian 12 | nftables(iptables 别名指向 nft) | nftables |
| RHEL 9 / Rocky 9 / AlmaLinux 9 | firewalld | nftables |
| RHEL 8 / Rocky 8 | firewalld | nftables |
| CentOS 7 | firewalld | iptables(旧版内核) |
| Fedora 38+ | firewalld | nftables |
| Arch Linux | 无默认(可选择 iptables/nftables) | 取决于安装 |
| openSUSE | firewalld | nftables |
| Alpine Linux | iptables(最小化系统) | iptables |
注意:现代发行版即使安装了
iptables命令,它往往是指向nftables后端的兼容层iptables-nft,而非传统的iptables-legacy。可以通过iptables --version确认。
兼容性与共存
iptables 命令的三个变体
现代 Linux 系统中可能存在三个 iptables:
| 命令 | 说明 |
|---|---|
iptables-legacy |
传统 iptables,使用 ip_tables 内核模块 |
iptables-nft |
兼容层,但底层使用 nf_tables 内核模块 |
iptables |
通常是上面两者之一的符号链接 |
# 查看当前 iptables 指向哪个版本
iptables --version
# Ubuntu 22.04+:iptables v1.8.7 (nf_tables)
# CentOS 7:iptables v1.4.21 (legacy)
# 切换默认版本(Debian/Ubuntu)
update-alternatives --config iptables
ufw 后端切换
# 查看当前 ufw 后端
grep -i backend /etc/default/ufw
# 手动切换:编辑 /etc/default/ufw,修改 IPT_SYSCTL 相关配置
# Ubuntu 22.04+ 默认使用 nftables 后端