firewalld 与 iptables 对比
1. 核心结论
firewalld 和 iptables 都用于管理 Linux 主机防火墙规则,但它们不是同一层面的概念。
| 对象 | 定位 | 规则组织方式 | 典型发行版 |
|---|---|---|---|
| firewalld | 动态防火墙管理服务 | zone、service、port、rich rule | RHEL/CentOS 7+、Rocky、Alma、Fedora |
| iptables | 传统防火墙规则管理工具 | table、chain、rule | CentOS 6、旧版 Linux 系统 |
| nftables | 新一代 Linux 防火墙框架 | table、chain、set、rule | 现代 Linux 发行版 |
需要注意:firewalld 是上层管理服务,底层后端可对接 iptables 或 nftables;在现代发行版中,firewalld 常见后端已经是 nftables。
2. firewalld 基础
2.1. 服务管理
systemctl status firewalld
systemctl start firewalld
systemctl stop firewalld
systemctl restart firewalld
systemctl enable firewalld
systemctl disable firewalld
firewalld 支持动态加载规则,很多临时规则无需重启服务即可生效。
2.2. 查看状态与区域
firewall-cmd --state
firewall-cmd --get-default-zone
firewall-cmd --get-active-zones
firewall-cmd --list-all
firewall-cmd --list-ports
firewall-cmd --list-services
zone 是 firewalld 的核心抽象,用于表达不同网络环境下的信任级别和放行策略。
| 常见 zone | 含义 |
|---|---|
public | 默认公共网络区域,信任度较低。 |
trusted | 信任区域,通常允许所有连接。 |
drop | 丢弃入站连接,不返回响应。 |
dmz | 隔离区,适合暴露少量服务。 |
2.3. 放行端口
临时放行端口,重载或重启 firewalld 后可能失效。
firewall-cmd --add-port=80/tcp
firewall-cmd --add-port=30000-32767/tcp
永久放行端口需要添加 --permanent,并通过 --reload 让配置生效。
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
2.4. 删除端口规则
firewall-cmd --remove-port=80/tcp
firewall-cmd --permanent --remove-port=80/tcp
firewall-cmd --reload
2.5. 放行服务
firewalld 内置了 service 抽象,可用服务名替代具体端口。
firewall-cmd --get-services
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
服务定义通常位于 /usr/lib/firewalld/services/ 或 /etc/firewalld/services/。
2.6. 放行指定来源
firewall-cmd --permanent --add-source=192.168.1.100/32
firewall-cmd --reload
如果只允许指定网段访问某个端口,可以使用 rich rule。
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
firewall-cmd --reload
2.7. ICMP 控制
firewall-cmd --permanent --add-icmp-block=echo-request
firewall-cmd --permanent --remove-icmp-block=echo-request
firewall-cmd --reload
禁止 ping 只能减少探测可见性,不能替代访问控制和服务加固。
2.8. 伪装与端口转发
开启 IP 伪装常用于内网主机通过网关出网。
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
端口转发示例:将本机 8080 转发到 192.168.1.200:80。
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=192.168.1.200:toport=80
firewall-cmd --reload
3. iptables 基础
3.1. iptables 规则模型
iptables 使用 table、chain、rule 组织规则。
| 层级 | 说明 | 示例 |
|---|---|---|
| table | 按处理目标划分规则集合 | filter、nat、mangle |
| chain | 按报文流向划分处理链 | INPUT、OUTPUT、FORWARD |
| rule | 匹配条件与动作 | 放行 22 端口、拒绝某来源 IP |
常见内置链:
| 链 | 作用 |
|---|---|
INPUT | 处理进入本机的流量。 |
OUTPUT | 处理本机发出的流量。 |
FORWARD | 处理经过本机转发的流量。 |
3.2. 服务管理
CentOS 6 等传统环境常见命令如下:
service iptables status
service iptables start
service iptables stop
service iptables restart
chkconfig iptables on
chkconfig iptables off
部分 systemd 环境可能使用 iptables-services。
systemctl status iptables
systemctl enable --now iptables
3.3. 查看规则
iptables -L
iptables -L -n
iptables -L -n --line-numbers
iptables -S
iptables-save
其中 -n 表示不解析域名和服务名,--line-numbers 用于显示规则行号,便于按行删除规则。
3.4. 常用放行规则
放行 SSH:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
放行 HTTP 与 HTTPS:
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
放行端口段:
iptables -A INPUT -p tcp --dport 30000:32767 -j ACCEPT
放行指定来源 IP:
iptables -A INPUT -s 192.168.1.100/32 -j ACCEPT
3.5. 基础安全规则
回环接口和已建立连接通常应优先放行。
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
默认拒绝所有入站流量应放在明确放行规则之后。
iptables -P INPUT DROP
远程操作防火墙时,修改默认拒绝策略前必须先确认 SSH 端口已经放行,否则可能导致远程连接中断。
3.6. 删除规则
先查看行号:
iptables -L INPUT -n --line-numbers
按行号删除规则:
iptables -D INPUT 3
也可以按完整规则删除:
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
3.7. 保存规则
CentOS 6 常用:
service iptables save
通用方式:
iptables-save > /etc/sysconfig/iptables
不同发行版的规则保存路径和恢复机制可能不同,应以当前系统的 iptables 服务配置为准。
3.8. 清空规则
iptables -F
iptables -X
iptables -Z
清空规则前应确认当前策略。如果默认策略是 DROP,清空放行规则可能导致所有入站流量被拒绝。
4. firewalld 与 iptables 对比
| 维度 | firewalld | iptables |
|---|---|---|
| 定位 | 动态防火墙管理服务 | 传统规则管理工具 |
| 抽象方式 | zone、service、port、rich rule | table、chain、rule |
| 动态变更 | 支持 runtime 与 permanent 分离 | 通常直接修改内核规则 |
| 易用性 | 更适合常规运维管理 | 更适合精确规则控制 |
| 持久化 | --permanent 后 --reload | 依赖 iptables-save 或发行版服务 |
| 学习成本 | 相对低 | 相对高 |
| 适用场景 | 现代发行版、常规主机防火墙 | 旧系统、精细规则、历史环境 |
5. 生产选型建议
5.1. 优先选择 firewalld 的场景
- 使用 RHEL/CentOS 7+、Rocky Linux、AlmaLinux、Fedora 等现代发行版。
- 只需要管理常规端口、服务、来源地址和区域。
- 团队希望规则更易读、更易维护。
- 需要区分临时规则与永久规则。
5.2. 继续使用 iptables 的场景
- 系统版本较旧,默认只提供传统 iptables。
- 已有大量历史脚本依赖 iptables 命令。
- 需要直接控制 table、chain、rule 等底层规则。
- 迁移到 firewalld 或 nftables 的成本暂时较高。
5.3. 运维注意事项
- 不建议同时用多个工具随意改同一套防火墙规则,避免实际规则与管理工具状态不一致。
- 远程服务器变更防火墙前,应先确认 SSH 放行规则,并准备回滚命令。
- 生产环境优先使用永久规则,但应先用临时规则验证效果。
- 防火墙只负责主机侧流量控制,仍需结合云安全组、负载均衡、服务认证和系统加固。
6. 高频命令速记
6.1. firewalld 高频命令
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --remove-port=80/tcp
firewall-cmd --reload
6.2. iptables 高频命令
iptables -L -n --line-numbers
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -D INPUT 3
iptables-save
iptables -F
关联文档
- Linux 网络服务:Linux 网络服务配置与排查基础。
- Linux 系统管理:系统服务、日志与生产管理基础。
- Linux 基础:Linux 基础命令与系统对象。
- 网络基础:网络协议与分层模型基础。
