为什么要关闭 SELinux 和防火墙
刚拿到一台 Linux 服务器,准备部署网站或者跑应用,结果发现端口死活连不上、服务启动了但外部访问不了——这种情况十有八九是 SELinux 或者防火墙在”保护”你。
SELinux(Security-Enhanced Linux)是 Linux 内核层面的强制访问控制机制,防火墙(Firewalld / iptables)则是网络层面的访问控制。它们的设计初衷都是为了安全,但很多生产环境和测试场景下,它们反而会成为你排查问题的最大障碍。
本文会带你一步步关闭 SELinux 和防火墙,并教你如何确认它们已经真正停掉了。
第一步:检查当前状态
在动手之前,先看看 SELinux 和防火墙分别是什么状态。执行以下两条命令:
# 查看 SELinux 状态
getenforce
# 查看 Firewalld 状态
systemctl status firewalld

getenforce 会返回三个值之一:
- Enforcing——正在强制执行安全策略(需要关闭)
- Permissive——只记录违规行为但不阻止(算半关状态)
- Disabled——已完全关闭(目标状态)
防火墙那边,systemctl status firewalld 会告诉你它是 active (running) 还是 inactive (dead)。
第二步:关闭 SELinux
临时关闭(立即生效,重启失效)
如果你只是临时调试,用 setenforce 0 可以立即把 SELinux 切换到 Permissive 模式:
setenforce 0
getenforce
# 输出应为 Permissive

永久关闭(重启后依然生效)
临时关闭不够,重启后 SELinux 又会恢复原样。要永久关闭,需要修改配置文件:
vi /etc/selinux/config
找到 SELINUX= 这一行,把值改为 disabled:
# 修改前
SELINUX=enforcing
# 修改后
SELINUX=disabled

保存退出后,重启服务器才能让永久配置生效:
reboot
重启后用 getenforce 确认,应该输出 Disabled。
第三步:关闭 Firewalld 防火墙
临时停止(立即生效,重启失效)
systemctl stop firewalld
永久关闭(禁止开机自启)
systemctl disable firewalld
验证一下:
systemctl status firewalld
# 应显示 inactive (dead)
如果是 iptables 怎么关
有些系统(比如 Ubuntu)用的是 ufw,有些老系统用的是原生 iptables,处理方式稍有不同:
UFW(Ubuntu 默认)
ufw disable
ufw status
# 应显示 Status: inactive
iptables 清空规则
iptables -F
iptables -X
iptables -Z
-F 清空所有规则链,-X 删除自定义链,-Z 把计数器归零。但这种方式重启后会失效,要想持久化需要额外安装 iptables-persistent 包。
关闭之后还是连不上怎么办
SELinux 和防火墙都关了,但还是访问不了?按这个顺序排查:
- 服务是否在监听——用
ss -tlnp | grep 端口号确认端口是否处于 LISTEN 状态 - 云平台安全组——阿里云、腾讯云、AWS 等都有网络层面的安全组,需要在控制台放行端口
- 服务本身绑定地址——有些服务默认只监听
127.0.0.1,需要改为0.0.0.0 - 路由和网络配置——确认服务器的网关、DNS 配置是否正确
安全提醒
关闭 SELinux 和防火墙确实能省去很多麻烦,但也意味着你失去了一层重要的安全防护。在生产环境中,更推荐的做法是:
- 保留防火墙,只放行需要的端口,而不是一刀切全关
- SELinux 设为 Permissive 先跑一段时间,等确认没规则冲突后再完全关闭
- 使用云平台安全组作为第一层防护,比系统防火墙更可靠
对于刚入门的朋友,先关掉排障是完全可以的。等你的运维能力上来了,再逐步把安全策略加回来也不迟。
总结
排查网络问题的标准流程:先关 SELinux,再关防火墙,然后逐层检查服务和网络配置。记住这三条命令就够了:
setenforce 0 # 临时关 SELinux
systemctl stop firewalld # 临时关防火墙
systemctl disable firewalld # 永久关防火墙
掌握这些,以后遇到”服务启动了但访问不了”的问题就不会慌了。










暂无评论内容