概述

在 Linux 系统中,防火墙是网络安全的第一道防线。iptablesufwnftables 是三个最常被提及的防火墙工具,但它们处于不同的抽象层级,服务于不同的使用场景。

简单来说:

  • 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 内核中的包过滤框架 —— 真正干活的是它
  • iptablesnftables 是用户空间工具,将规则写入 netfilter 内核模块
  • iptables 对应的内核模块是 ip_tablesnftables 对应的是 nf_tables
  • ufw 不直接操作内核,它生成 iptablesnftables 命令来配置防火墙

历史演进

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 后端

参考链接