一、本质区别(一句话)
| 维度 | iptables | firewalld |
|---|---|---|
| 本质 | 底层框架 | 上层管理工具 |
| 年代 | Linux 2.4+ (1998) | RHEL 7+ (2014) |
| 关系 | 是内核模块 | 调用iptables/nftables |
| 风格 | 命令行直接改规则 | 服务管理+区域概念 |
🔥 核心:firewalld 是 iptables 的管家,不是替代品!
二、配置方式对比
iptables:直接操作内核
# 直接改规则,即时生效
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 手动保存(重启不丢)
iptables-save > /etc/iptables/rules.v4
firewalld:通过服务管理
# 改配置,然后加载
firewall-cmd --add-port=80/tcp
firewall-cmd --runtime-to-permanent # 保存
# 或直接改文件
vim /etc/firewalld/zones/public.xml
systemctl reload firewalld
三、核心差异表
| 对比项 | iptables | firewalld | 谁赢了? |
|---|---|---|---|
| 学习曲线 | 陡峭(五链四表) | 平缓(区域概念) | ✅ firewalld |
| 细粒度控制 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ iptables |
| 动态重载 | ❌ 需重新应用 | ✅ 不中断连接 | ✅ firewalld |
| 配置文件 | 无标准(自己写脚本) | XML结构化 | ✅ firewalld |
| Docker兼容 | ✅ 直接操作 | ⚠️ 会冲突 | ✅ iptables |
| IPv6支持 | ✅ 完整 | ✅ 完整 | 平手 |
| 批量操作 | 脚本自己写 | rich-rule | 平手 |
| 默认策略 | 命令行设 | 区域预设 | 看习惯 |
四、实战场景选型指南
✅ 用 iptables 的场景
# 1. Docker/K8s 宿主机
Docker直接写iptables规则,firewalld经常冲突
# 2. 嵌入式/低配机器
没有firewalld服务,直接内核操作
# 3. 复杂NAT/策略路由
PREROUTING/POSTROUTING 只有iptables原生支持
# 4. 性能极致场景
少一层服务调用,毫秒级优势
✅ 用 firewalld 的场景
# 1. RHEL/CentOS 7+ 默认
不用白不用,系统原生
# 2. 桌面/工作站
图形化、区域切换方便
# 3. 简单服务暴露
就开几个端口,不想学iptables
# 4. 需要动态更新
reload不中断现有连接
五、冲突现场(Docker与firewalld)
# 经典问题:firewalld + Docker
# Docker启动后,iptables规则被清掉?
systemctl status firewalld
systemctl status docker
# 解决方案1:停用firewalld,用iptables(生产推荐)
systemctl stop firewalld
systemctl disable firewalld
yum install -y iptables-services
systemctl enable iptables
# 解决方案2:让Docker兼容firewalld
# Docker 20.10+ 已支持
vim /etc/docker/daemon.json
{
"iptables": false # 别让Docker动iptables
}
六、命令对照手册
| 操作 | iptables | firewalld |
|---|---|---|
| 开放端口 | iptables -A INPUT -p tcp --dport 80 -j ACCEPT | firewall-cmd --add-port=80/tcp |
| 永久开放 | iptables-save > /etc/iptables/rules.v4 | firewall-cmd --runtime-to-permanent |
| 删除规则 | iptables -D INPUT 行号 | firewall-cmd --remove-port=80/tcp |
| 封禁IP | iptables -A INPUT -s 1.2.3.4 -j DROP | firewall-cmd --add-rich-rule='rule family=ipv4 source address=1.2.3.4 drop' |
| 查看规则 | iptables -L -n -v | firewall-cmd --list-all |
| 默认策略 | iptables -P INPUT DROP | 改区域默认 |
| 日志 | iptables -A INPUT -j LOG | --add-rich-rule='... log prefix="DROP" ...' |
| NAT | iptables -t nat ... | ❌ 难用,建议iptables |
七、兼容模式(firewalld后端)
# firewalld 可以用 iptables 作为后端
cat /etc/firewalld/firewalld.conf
# FirewallBackend=iptables # 或 nftables
# 查看当前后端
firewall-cmd --get-default-zone
八、一句话总结
iptables 是内核刀,firewalld 是刀鞘
- 玩Docker/复杂NAT → iptables 直操
- 管简单服务器 → firewalld 省心
- 别一起用,会打架!
生产标准:
# CentOS 6: iptables
# CentOS 7/8: firewalld(但Docker宿主建议切iptables)
# Ubuntu: ufw(类似firewalld)或裸iptables
发表回复