在CentOS 7时代,firewalld是默认防火墙,官方强推、文档齐全、自带区域/动态规则......
但绝大多数线上环境、自建机房、容器集群,依然清一色用iptables。
不是firewalld不够新,而是要的是稳、准、可预期。个人角度讲清楚:为什么原生firewalld叫好不叫座,iptables永远是老炮首选。
一、先搞懂:它俩到底是什么关系
一句话:
- iptables:直接操作内核netfilter,底层命令,无中间层。
- firewalld :基于iptables/nftables封装的上层服务,带守护进程、区域、zone、runtime/permanent 双配置。
关系很简单:firewalld 是皮,iptables 是骨。
二、为什么普遍抗拒原生firewalld?
1. 双配置坑死人:runtime与permanent分离
firewalld有两套规则:
- 运行时:
firewall-cmd --add-port=80/tcp(重启失效) - 永久:
--permanent并--reload
最容易犯的错:加了规则没加永久,reload 或重启后直接丢规则 。线上服务器一旦吞掉SSH/业务端口,就是生产事故。
iptables规则写进文件,service iptables save 一次搞定,所见即所得。
2. 中间层带来不可控:服务挂了=防火墙失控
firewalld是守护进程:
- 服务崩了、D-Bus异常、日志打满、内存溢出...... 都会导致规则不生效。
- 排查时要先看firewalld状态,再看规则,再看底层iptables映射,链路变长。
iptables 是内核级工具 ,没有服务依赖,只要内核在,规则就在。
3. Docker/K8s直接绕开firewalld,制造隐形冲突
容器生态是重灾区:
- Docker、kube-proxy直接操作 iptables 原生链(nat、filter、DOCKER 链)。
- firewalld看不到容器注入的规则,两边互不可见。
- 结果:你在firewalld封了IP,容器流量照样通;你开放端口,容器又给你覆盖。
线上集群几乎统一关闭 firewalld,纯用 iptables 管理,避免双层规则打架。
4. 复杂规则写起来更啰嗦,可读性反而下降
简单端口放行 firewalld 确实短:
css
firewall-cmd --add-service=http --permanent
但企业级规则(端口段、IP 白名单、端口转发、限速、过滤):
- firewalld要用rich-rule、direct、zone、source一堆概念。
- 语法不统一,复制粘贴容易错,回滚更麻烦。
iptables一条命令结构稳定,写脚本、做自动化、归档迁移都极方便。
5. 历史惯性与标准化:脚本/文档/架构全是iptables
- CentOS 6世代沉淀的运维脚本、自动化平台、安全基线全是iptables。
- 老运维肌肉记忆:
iptables -L -n、-A INPUT、-j DROP。 - 切换firewalld = 重写文档、重测脚本、重新培训,成本极高。
6. 动态规则对大多数场景是 "多余功能"
firewalld主打动态更新、不中断连接。但真实线上:
- 防火墙规则很少频繁变。
- 真要变更,维护窗口+备份+逐条生效,比"动态" 更安全。
- 动态反而带来规则状态不透明,排查更难。
7. 原生firewalld日志弱、调试难
- 日志分散、格式不统一。
- 排错要抓firewalld日志、iptables日志、内核日志三层。
- 复杂规则不生效时,你根本不知道是zone、policy、rich-rule哪层拦了。
iptables直接 -j LOG,内核日志一目了然。
三、iptables凭什么稳坐第一?
- 无中间层,稳定可预期
- 一套规则,重启不丢
- 与容器/虚拟化天然兼容
- 脚本化/自动化/编排极度友好
- 全行业通用,资料最多
- 排查链路短,出问题秒定位
对运维来说:少一层封装,少一万个坑。
四、firewalld 真的一无是处吗?
不是。它适合:
- 桌面 Linux、个人开发机
- 简单对外服务器、极少改规则
- 不跑容器、不用复杂网络
但在标准运维/生产/集群场景,它不是最优解。
五、线上标准做法:CentOS 7关闭firewalld启用iptables
直接给你可复制的生产级命令:
bash
# 停掉并禁用 firewalld
systemctl stop firewalld
systemctl disable firewalld
# 安装 iptables 服务
yum install -y iptables-services
# 启动并开机自启
systemctl start iptables
systemctl enable iptables
# 保存规则
service iptables save
六、总结:为什么大家不爱用原生firewalld?
- 双配置容易丢规则 → 事故风险
- 中间服务层 → 不稳定、不可控
- 与容器冲突 → 集群不兼容
- 复杂规则难写 → 自动化成本高
- 历史生态全是 iptables → 切换不划算