firewalld的运行时规则与永久配置分离,--permanent仅修改配置文件,--reload才将永久规则合并到运行时且不中断长连接;必须先确认服务活跃、无冲突防火墙,再执行永久添加/删除规则并重载,最后验证生效状态及连接持续性。

关键在于理解 firewalld 的“运行时规则”与“永久配置”是两个独立层,--permanent 只改配置文件,--reload 才把配置合并进当前运行环境——这个过程不重置连接状态,所以长连接(如数据库连接、SSH 会话、WebSocket、HTTP/2 流)全部保持畅通。
确认当前防火墙处于活跃且可热更新状态
先确保服务在运行,且不是靠 iptables-legacy 或其他冲突服务接管:
- 检查 firewalld 是否运行:
firewall-cmd --state(返回running即可) - 验证未被禁用:
systemctl is-enabled firewalld(应为enabled) - 确认没有其他防火墙(如 ufw、iptables.service)正在运行:
systemctl list-units --type=service | grep -E "(ufw|iptables)",如有需停用并屏蔽
所有变更必须走“永久+重载”流程
临时规则(不带 --permanent)只存于内存,重启或 reload 后即消失,不可用于生产;而永久规则若不 reload,永远不生效——这是线上误配的最常见原因。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 开放 HTTP/HTTPS 服务:
firewall-cmd --permanent --add-service=http && firewall-cmd --permanent --add-service=https - 开放自定义端口(如 API 端口 8081):
firewall-cmd --permanent --add-port=8081/tcp - 移除旧端口(如停用测试端口 9000):
firewall-cmd --permanent --remove-port=9000/tcp - 执行统一重载:
firewall-cmd --reload(注意:不是 restart,也不用加 sudo,除非当前用户无权限)
验证规则已真正加载到运行时
不能只看命令没报错,要确认规则实际存在于当前运行环境:
- 查当前区域所有开放服务:
firewall-cmd --list-services(应含 http、https) - 查当前开放端口:
firewall-cmd --list-ports(应含 8081/tcp) - 精准验证某端口是否被放行:
firewall-cmd --query-port=8081/tcp(返回yes才算成功) - 检查连接未中断:从另一终端
ss -tnp | grep :22或netstat -tnp | grep ESTAB,确认 SSH 或应用连接仍为ESTABLISHED
需要源 IP 控制时,必须用富规则而非端口命令
--add-port 是全网放行,无法限制访问者。若要求“仅运维跳板机 10.10.5.100 能连管理端口 2222”,必须用富规则,并注意顺序:
- 允许指定 IP 访问:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.5.100" port port="2222" protocol="tcp" accept' - 拒绝其他所有 IP 访问该端口(放在允许规则之后):
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="2222" protocol="tcp" reject' - 执行
firewall-cmd --reload生效 - 验证:
firewall-cmd --list-rich-rules查看规则顺序是否正确

















