CentOS 7 防火墙(firewalld)常用操作
📝 笔记摘要: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
--permanentpermanent 永久生效,没有这个参数重启后失效。
加完之后必须重新载入,不然当前还是不通: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-* 那一族是验证配置有没有生效的最好工具。
