iptables vs firewalld 区别对照(实战简略版)


一、本质区别(一句话)

维度iptablesfirewalld
本质底层框架上层管理工具
年代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

三、核心差异表

对比项iptablesfirewalld谁赢了?
学习曲线陡峭(五链四表)平缓(区域概念)✅ 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
}

六、命令对照手册

操作iptablesfirewalld
开放端口iptables -A INPUT -p tcp --dport 80 -j ACCEPTfirewall-cmd --add-port=80/tcp
永久开放iptables-save > /etc/iptables/rules.v4firewall-cmd --runtime-to-permanent
删除规则iptables -D INPUT 行号firewall-cmd --remove-port=80/tcp
封禁IPiptables -A INPUT -s 1.2.3.4 -j DROPfirewall-cmd --add-rich-rule='rule family=ipv4 source address=1.2.3.4 drop'
查看规则iptables -L -n -vfirewall-cmd --list-all
默认策略iptables -P INPUT DROP改区域默认
日志iptables -A INPUT -j LOG--add-rich-rule='... log prefix="DROP" ...'
NATiptables -t nat ...❌ 难用,建议iptables

七、兼容模式(firewalld后端)

# firewalld 可以用 iptables 作为后端
cat /etc/firewalld/firewalld.conf
# FirewallBackend=iptables   # 或 nftables

# 查看当前后端
firewall-cmd --get-default-zone

八、一句话总结

iptables 是内核刀,firewalld 是刀鞘

  • Docker/复杂NATiptables 直操
  • 简单服务器firewalld 省心
  • 别一起用,会打架!

生产标准:

# CentOS 6: iptables
# CentOS 7/8: firewalld(但Docker宿主建议切iptables)
# Ubuntu: ufw(类似firewalld)或裸iptables

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注