在 Linux 服务器运维中,firewalld 与 iptables 常常被放在一起比较,但很多人忽略了一个核心事实:iptables 既是用户态命令行工具,也代表一套直接作用于内核 netfilter 的规则体系;而 firewalld 只是一个动态管理防火墙的前端守护进程,它自身并不过滤数据包,而是把管理指令翻译成底层后端规则。理解这一点,是看清两者后端差异的起点。

一、架构定位与后端实现区别
iptables 作为传统工具,直接通过 netfilter 框架在内核中维护 table、chain 和 rule。管理员执行一条 iptables 命令,内核便立即增减对应规则,所有配置以命令行或脚本形式保存在用户自定义的 shell 文件里,系统重启后需手动恢复或依赖 iptables-save 与 iptables-restore。这种扁平化的规则链结构在处理简单策略时很直观,但规则一多就容易混乱,且修改时缺乏事务保护。
firewalld 则引入了中间层守护进程,默认后端在新版发行版中已切换为 nftables,在旧版仍可用 iptables 作为后端。它用“区域(zone)”和“服务(service)”抽象网络信任级别,配置写入 XML 文件,由 firewalld 动态编译成底层规则。用户只需把网卡加入某个 zone,或放行某个预定义 service,不必关心具体四表五链。这种封装让策略可读性更强,也方便按场景切换整套规则。
1.1 后端可替换性
firewalld 的后端并非固定不变。通过修改配置文件中的 FirewallBackend 参数,可指定为 iptables 或 nftables。这意味着同一套 firewalld 命令,在不同机器上可能生成完全不同的底层规则。而 iptables 工具本身若直接运行,永远调用内核的 iptables 兼容模块,不存在后端抽象。
这种差异带来一个实操问题:当一台机器用 firewalld 管理、另一台用裸 iptables 脚本时,排错方式完全不同。前者要看 firewall-cmd 状态和 zone 配置,后者要直接 iptables -L 查链。运维团队若混用,极易出现“明明放行了却不通”的误会。
二、规则存储与生效机制对比
iptables 的规则是瞬时态为主。用命令行加的规则只在内存生效,写在 rc.local 或网络脚本里才能持久。每次大改前如果没 save,重启就丢。而且它改规则是覆盖式思考:你删一条链,依赖它的跳转可能全断。对于线上业务,直接 iptables -F 清空是高危动作。
firewalld 把配置拆成运行时(runtime)和永久(permanent)两套。运行时改了立刻生效,但重启还原;加了 --permanent 才写盘,配合 reload 平滑应用。它还能利用事务特性,批量更新失败可回退,不像 iptables 那样容易因一条错命令让 SSH 自己把自己挡在外面。
2.1 配置文件形态
iptables 持久化常靠 /etc/sysconfig/iptables 或类似单文件,内容是一行行命令。firewalld 的永久配置分散在 /etc/firewalld/zones/ 等目录的 XML 中,每个 zone 独立描述接口绑定与放行服务。后者对人更友好,版本管理时也更容易 diff 出改了哪块策略。
| 对比维度 | iptables | firewalld |
|---|---|---|
| 底层定位 | 直接操作 netfilter 规则 | 前端工具,后端可为 iptables 或 nftables |
| 配置持久化 | 需手动 save 或写启动脚本 | 区分运行时与永久,XML 存储 |
| 管理抽象 | 表链规则,偏底层 | 区域与服务,偏业务语义 |
| 生效方式 | 命令即生效,易断连 | 支持 reload,可回退 |
三、适用场景与选型建议
如果维护的是轻量容器主机、古老发行版,或需要精细控制每一个 mark 和 connlimit 模块,直接用 iptables 或编写 iptables 脚本反而更可控,没有中间层开销,也方便对接自定义程序。很多网络实验环境仍偏爱 iptables,就是因为它的行为完全透明。
对于多网卡、多业务混布的云服务器,firewalld 的区域模型能大幅降低心智负担。比如公网网卡放 public 区只开 80 和 443,内网网卡放 trusted 区全通,用一条命令就能整体切换策略套件。再加上后端 nftables 的性能优势,新项目更推荐 firewalld 加 nftables 组合。
注意:生产机若已从 iptables 迁移到 firewalld,就不要再用 iptables 命令直接改规则,否则 firewalld reload 时会被覆盖,造成策略漂移。
四、常见误区澄清
有人认为 firewalld 和 iptables 是二选一的内核模块,这不对。firewalld 在 iptables 后端模式下,本质还是调用 iptables 做底层落地。还有人觉得 nftables 出现后 iptables 就废了,其实 iptables 命令在多数系统只是 nft 兼容层封装,真正淘汰的是旧内核模块写法,不是管理习惯。
另一个误区是“firewalld 更安全”。安全取决于规则写没写对,不在于用哪个工具。firewalld 只是降低了复杂规则出错概率,若把网卡误绑到 trusted 区,一样全网裸奔。运维者仍须理解后端链走向,才能真正确认数据包被哪条规则放过或丢弃。