10
0
0

CentOS 7 防火墙(firewalld)常用操作

2026-10-17
2026-10-17

📝 笔记摘要:CentOS 7 防火墙(firewalld)常用操作

1.firewalld 是什么?CentOS 7 开始默认用 firewalld 管防火墙,底层还是 netfilter/iptables,但不再让你直接敲 iptables 规则,而是通过网络区域(zone)+ 服务(service)+ 端口(port)三个概念来管理。最大的好处是改完不用重启机器,规则即时生效且不会打断已有连接。

概念上分两层:
  运行时配置 = 当前真正生效的,重启就没了
  永久配置 = 写在磁盘上的,重启还在
  两者互不干扰,所以经常出现「我明明加了,怎么不生效」

2.两个配置层的关系(这是最容易踩坑的地方):

改运行时:立刻生效,但重启服务后消失
改永久:不立刻生效,重启服务后生效
--permanent 这个参数就是用来切换到永久层的
⚠️ 官方明确说了:想「立刻生效 + 重启也在」,要执行两条命令,缺一不可:

firewall-cmd --add-port=443/tcp                    # 运行时,立刻生效
firewall-cmd --permanent --add-port=443/tcp       # 永久,重启也在

firewall-cmd --reload 的作用 = 把永久配置刷新进运行时,同时清掉所有没写进永久层的临时改动

3.基础操作:

启动: systemctl start firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用: systemctl disable firewalld
开机启用: systemctl enable firewalld

4.systemctl 常用命令:

systemctl 是 CentOS 7 的服务管理工具,把之前 service 和 chkconfig 的功能合到了一起。
启动服务: systemctl start firewalld.service
关闭服务: systemctl stop firewalld.service
重启服务: systemctl restart firewalld.service
查看状态: systemctl status firewalld.service
开机启用: systemctl enable firewalld.service
开机禁用: systemctl disable firewalld.service
是否开机启动: systemctl is-enabled firewalld.service
已启用的服务列表: systemctl list-unit-files | grep enabled
启动失败的服务列表: systemctl --failed

5.firewall-cmd 查询类:

查看版本: firewall-cmd --version
查看帮助: firewall-cmd --help
查看运行状态: firewall-cmd --state
查看默认区域: firewall-cmd --get-default-zone
查看当前生效的区域和网卡: firewall-cmd --get-active-zones
查看某网卡属于哪个区: firewall-cmd --get-zone-of-interface=eth0
查看某区域放行的端口: firewall-cmd --zone=public --list-ports
查看某区域放行的服务: firewall-cmd --zone=public --list-services
查看某区域的完整配置: firewall-cmd --zone=public --info-all

6.开启端口(重点):

# 添加并写入永久配置
firewall-cmd --zone=public --add-port=80/tcp --permanent

--permanent permanent 永久生效,没有这个参数重启后失效。
加完之后必须重新载入,不然当前还是不通:

firewall-cmd --reload

查看是否真的加上了(对结果判断很有用):

firewall-cmd --zone=public --query-port=80/tcp

返回 yes 说明开了,返回 no 就是没开。
删除:

firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --reload

⚠️ 注意:不写 --zone 会走默认区域(public),看着像加对了,其实可能加到别的地方去了。写全 --zone=public 更保险。

7.放行服务而不是端口:

系统预定义了一批服务名(比如 http、https、ssh、cockpit),放行服务更省事,也不用记端口号。

firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload

http 服务对应的就是 80/tcp,https 对应 443/tcp。

8.panic 模式(把自己锁门外时用):

拒绝所有包: firewall-cmd --panic-on
取消拒绝: firewall-cmd --panic-off
查看是否拒绝: firewall-cmd --query-panic
⚠️ 这是运行时改动,重启服务就没了。而且开了以后 SSH 立刻断,只能去控制台的 VNC 里执行 --panic-off 救回来。

💡 补充几个原文没写的:

云服务器还要看安全组。 firewall-cmd 放行了不等于能连上,阿里云/腾讯云这类还得在控制台把端口加进安全组,两边都得配。排查「本机能通外网连不上」时先确认这个。

Docker 是个例外。 docker 会自己改 iptables,firewall-cmd 加的规则对容器不一定生效。容器要访问外网,通常得在 firewalld 里把 docker0 或相关接口放行。

CentOS 7 要停止维护了。 2024-06-30 官方已停止维护,新服务器建议直接上 CentOS Stream 或 Rocky/AlmaLinux,防火墙命令基本一样。

🔥 一句话总结:firewall-cmd 记两条就够——加 --permanent 才持久,加完 --reload 才生效;--query-* 那一族是验证配置有没有生效的最好工具。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!