firewall-cmd 防火墙操作技巧详解(适用于 CentOS / RHEL 系列)
firewalld 是 CentOS 和 RHEL 默认的防火墙服务,而 firewall-cmd 是其命令行管理工具。相比传统的 iptables,它更易用、支持动态规则更新,并支持区域(zone)管理。
🧭 基础命令速查表
| 操作 | 命令 | 
|---|---|
| 查看防火墙状态 | firewall-cmd --state | 
| 启动防火墙服务 | systemctl start firewalld | 
| 设置开机自启 | systemctl enable firewalld | 
| 查看当前区域 | firewall-cmd --get-active-zones | 
| 查看某区域规则 | firewall-cmd --zone=public --list-all | 
| 查看已开放端口 | firewall-cmd --list-ports | 
| 查看已开放服务 | firewall-cmd --list-services | 
🚪 开放端口与服务
✅ 临时开放端口(重启后失效)
firewall-cmd --add-port=8080/tcp
✅ 永久开放端口(推荐)
firewall-cmd --permanent --add-port=8080/tcp
firewall-cmd --reload
✅ 开放常见服务(如 HTTP、SSH)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
❌ 移除端口与服务
有时候我们需要关闭之前开放的端口或服务,可以使用以下命令:
✅ 临时移除端口(重启后失效)
firewall-cmd --remove-port=8080/tcp
✅ 永久移除端口(推荐)
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload
✅ 移除已开放的服务(如 HTTP、SSH)
firewall-cmd --permanent --remove-service=http
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
📋 小技巧
- 确认端口是否已移除
firewall-cmd --list-ports - 确认服务是否已移除
firewall-cmd --list-services - 注意事项
- 移除规则后立即生效,但若使用 
--permanent,记得执行--reload才能写入配置文件。 - 建议在移除前先确认该端口/服务是否仍被业务使用,避免误操作导致服务中断。
 
 - 移除规则后立即生效,但若使用 
 
🌐 管理区域(Zone)
firewalld 使用区域来定义不同网络接口的安全级别,常见区域包括:
public:默认区域,适合公网环境internal:适合内网trusted:完全信任,所有流量允许
✅ 设置接口所属区域
firewall-cmd --zone=internal --change-interface=eth1
✅ 设置默认区域
firewall-cmd --set-default-zone=public
🧱 管理 IP 地址与源地址
✅ 允许某 IP 访问指定端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="8080" protocol="tcp" accept'
firewall-cmd --reload
✅ 拒绝某 IP 所有访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject'
firewall-cmd --reload
🧪 实战技巧:GitLab 容器端口放行
假设你运行了 GitLab 容器,映射了以下端口:
22→ SSH80→ HTTP443→ HTTPS
你可以这样放行:
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
🛠️ 故障排查技巧
- 
端口已开放但无法访问?
- 检查服务是否监听对应端口:
ss -tnlp | grep 8080 - 检查 SELinux 是否阻止:
getenforce(建议设置为Permissive或配置策略) 
 - 检查服务是否监听对应端口:
 - 
规则修改后无效?
- 是否加了 
--permanent? - 是否执行了 
firewall-cmd --reload? 
 - 是否加了 
 - 
容器无法访问外部?
- 检查是否启用了 
masquerade(地址伪装):firewall-cmd --zone=public --add-masquerade 
 - 检查是否启用了 
 
✅ 最佳实践建议
- 所有规则建议使用 
--permanent并--reload,确保重启后仍生效。 - 使用 
rich-rule精细控制 IP、端口、协议。 - 定期备份防火墙配置:
firewall-cmd --list-all > firewall-backup.txt - 配合 
systemctl管理防火墙服务状态,避免误关。 
