很多刚接触Linux服务器的朋友在配置完Nginx或MySQL后,发现外网始终访问不了,排查半天才想起是防火墙没放行端口。firewalld是CentOS/RHEL 7以上系统默认的防火墙工具,规则比老的iptables直观,但命令不少,容易记混。本文把最常用的firewalld操作整理成一份速查清单。

先掌握firewalld的运行状态与zone概念
firewalld按zone(区域)管理规则,不同区域对不同来源的网络流量采用不同策略。默认区域是public,即对外部流量按规则放行、其余拒绝。日常运维大部分操作都集中在public区域上。查看当前状态与默认区域:
systemctl status firewalld
firewall-cmd --state
firewall-cmd --get-default-zone
firewall-cmd --list-all
放行端口与服务的常用命令
放行单个TCP端口、一段端口范围或常用服务,命令分别如下。注意firewalld有运行时配置与永久配置之分,只加 –permanent 不会立刻生效,需要 –reload 重新加载:
# 放行单个端口
firewall-cmd --permanent --add-port=8080/tcp
# 放行一段端口
firewall-cmd --permanent --add-port=10000-20000/tcp
# 放行服务(http、https、mysql等)
firewall-cmd --permanent --add-service=http
# 重新加载使永久配置生效
firewall-cmd --reload
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload
如果只想临时测试放行、重启后失效,去掉 –permanent 即可,例如 firewall-cmd –add-port=8080/tcp。生产环境建议始终配合 –permanent,避免重启后规则丢失导致服务突然不可访问。
设置默认拒绝与放行指定来源
对数据库这类仅限内网访问的服务,只放行指定来源IP会更安全:
# 仅允许指定IP访问3306
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.100 port port=3306 protocol=tcp accept'
firewall-cmd --reload
# 查看当前所有规则
firewall-cmd --list-all
firewall-cmd --permanent --list-rich-rules
防火墙误操作后如何紧急恢复
最典型的误操作是把SSH端口或22端口给移除了,导致远程连接全部断开。这种场景下,如果是云服务器,可以使用云控制台的VNC/网页终端登录;如果是物理机,则需要现场或带外管理。恢复方法很简单:重新放行22端口并reload。
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
顺带提醒:操作防火墙前先确认自己的SSH连接方式,避免把自己锁在门外;云服务器还需要同步检查安全组,安全组与系统防火墙是两层独立的防线,任何一层拒绝都会导致访问失败。
相关问答FAQs
- 问:firewall-cmd添加了规则但外网还是不通?答:检查是否遗漏了 –reload、是否放行在错误的zone,以及云安全组是否允许对应端口。
- 问:如何彻底关闭防火墙?答:不建议生产环境关闭,可执行 systemctl stop firewalld 临时停止,systemctl disable firewalld 取消开机自启,关闭后务必用安全组或其他方式兜底。
- 问:firewalld和iptables是什么关系?答:firewalld是iptables的上层管理工具,规则最终仍由内核netfilter执行,两者不能同时混用管理同一套规则。
firewalld本身并不复杂,难点在于分清运行时与永久配置、zone与安全组的关系。建议把常用命令保存成自己的速查笔记,涉及放行规则变更时先小范围验证再推广,网络问题就能少一大半。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!