为什么大家都用iptables,不愿碰原生firewalld?

在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凭什么稳坐第一?

  1. 无中间层,稳定可预期
  2. 一套规则,重启不丢
  3. 与容器/虚拟化天然兼容
  4. 脚本化/自动化/编排极度友好
  5. 全行业通用,资料最多
  6. 排查链路短,出问题秒定位

对运维来说:少一层封装,少一万个坑


四、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 → 切换不划算

最后用人话总结就是:iptables 看似古老,却是生产环境的 "极简、可靠、透明" 。firewalld更像 "易用但易错" 的玩具,好看不好用

相关推荐
艾力奋会展服务2 小时前
艾力奋展会方案的技术深度解析
安全·人脸识别·智能签到
枷锁—sha2 小时前
【SRC】前后端分离与API接口渗透
服务器·网络·安全·网络安全·系统安全
何中应2 小时前
Jenkins构建完,jar包启动不起来?
linux·运维·jenkins
jimmyleeee2 小时前
大模型安全之三:数据污染
安全
柏木乃一2 小时前
Linux进程信号(1):信号概述,信号产生part 1
linux·运维·服务器·c++·信号·signal
暴力求解2 小时前
Linux---进程(一):初识进程
linux·运维·服务器
Zero_Era2 小时前
智能设备金融级安全芯片——LKT4304
安全·金融
淡唱暮念2 小时前
Linux系统使用夸克网盘CLI上传服务器数据至网盘教程,解决大数据备份苦恼
linux·服务器·ubuntu
risc1234562 小时前
Elasticsearch 8.x+搭建集群一 (RPM/DEB 安装方式)
安全·elasticsearch·jenkins