iptables直接操作netfilter规则链,原生支持SNAT/DNAT;firewalld是其封装层,通过区域和服务建模,地址转换需启用masquerade,底层仍调用iptables规则。

iptables 和 firewalld 都是 Linux 上管理 netfilter 内核框架的用户态工具,但它们的管理逻辑、配置习惯和适用场景有本质区别。关键不在“谁更好”,而在于“谁管什么、怎么管”。
iptables:规则即配置,静态写死在链上
iptables 直接操作内核 netfilter 的规则链,把每条策略写进具体的表(如 filter、nat)和链(如 INPUT、POSTROUTING)。规则按顺序逐条匹配,顺序错一条,策略就可能失效。
- 配置命令就是执行动作,比如 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 203.0.113.5,这条规则立即生效,也立即写入内存中的 nat 表
- 重启后规则丢失,必须手动保存:CentOS/RHEL 执行 service iptables save 或 iptables-save > /etc/sysconfig/iptables
- 没有“区域”或“服务”概念,所有控制靠 IP、端口、协议、状态等字段硬匹配
- 地址转换(SNAT/DNAT)是原生能力,直接在 nat 表中完成,无需额外抽象层
firewalld:用区域和服务建模,动态调用底层规则
firewalld 不直接写规则,而是用 zone(区域)和服务(service)来描述策略意图,再由后台自动生成并加载对应的 iptables(或 nftables)规则。它本质是 iptables 的封装层,不是替代品。
- 一个网卡可归属一个 zone(如 public、internal),每个 zone 有一套默认行为(如 public 默认拒绝除 ssh/dhcpv6-client 外所有入站)
- 开放端口推荐用服务名:firewall-cmd --add-service=http,比写 --add-port=80/tcp 更安全——服务定义里已包含端口、协议、辅助模块(如 conntrack)
- 地址转换需启用 masquerade:firewall-cmd --zone=external --add-masquerade --permanent,它最终仍是在 nat 表的 POSTROUTING 链插入 SNAT 规则
- 支持运行时与永久配置分离,--reload 即刻生效,不中断连接,也不需重启服务
配置文件与持久化方式完全不同
两者落地到磁盘的方式不兼容,不能混用。
- iptables 规则存为纯文本文件:/etc/sysconfig/iptables(RHEL/CentOS)或 /etc/iptables/rules.v4(Debian/Ubuntu),格式是可读的规则列表
- firewalld 配置分散在多个 XML 文件中:/etc/firewalld/zones/ 存区域策略,/etc/firewalld/services/ 存服务定义,/etc/firewalld/firewalld.conf 控制全局行为
- firewalld 的 --permanent 参数表示写入这些 XML 文件,不加则只影响当前运行时
- 两个工具不可共存;启用 firewalld 后,系统会自动停用 iptables 服务
选哪个?看你的角色和需求
运维脚本或网络设备场景倾向 iptables;日常服务器管理、多网卡环境或需要频繁调整策略的场景,firewalld 更省心。
- 你要做路由器、NAT 网关、端口映射,且规则固定,用 iptables 更直接、更可控
- 你维护一台 Web 服务器,只需放行 http/https/ssh,偶尔加个新端口,firewalld 的 zone + service 模型更直观、容错性更强
- 考试中,“支持地址转换”是 iptables 的典型特征;而“基于区域的动态策略管理”是 firewalld 的核心考点
- CentOS 7+、RHEL 8+ 默认用 firewalld;CentOS 6 及更早版本只有 iptables


















