在 CentOS(以及 RHEL 系列)中,SELinux 常常是导致“权限明明对了却访问不了”的罪魁祸首。下面按从易到难、从排查到修复的顺序,系统讲一下 SELinux 排错方法。
getenforce
Enforcing:正在强制生效(最严格)Permissive:只记录不拦截(排错常用)Disabled:已关闭查看详细状态:
sestatus
setenforce 0 # 切到 Permissive
如果服务立刻正常 → 基本可以确定是 SELinux 问题
⚠️ 生产环境不要长期关 SELinux,应改策略而不是关掉
ausearch(最推荐)ausearch -m avc -ts recent
或指定服务:
ausearch -m avc -c httpd
常见字段解释:
scontext:源上下文(进程)tcontext:目标上下文(文件/端口)tclass:类型(file / dir / tcp_socket)denied:被拒绝的权限/var/log/audit/audit.loggrep avc /var/log/audit/audit.log
setroubleshoot(新手友好)安装:
yum install -y setroubleshoot-server
查看建议:
sealert -a /var/log/audit/audit.log
会直接告诉你:
ls -Z /var/www/html/
正确上下文应是:
httpd_sys_content_t
修复:
semanage fcontext -a -t httpd_sys_content_t "/data/web(/.*)?"
restorecon -Rv /data/web
例如 Nginx 用 8080:
semanage port -a -t http_port_t -p tcp 8080
查看端口策略:
semanage port -l | grep http
查看相关布尔:
getsebool -a | grep httpd
开启:
setsebool -P httpd_can_network_connect on
(-P 表示永久)
ls -Z 文件
restorecon -Rv /path
semanage fcontext -a -t 类型 "/path(/.*)?"
restorecon -Rv /path
audit2allowausearch -m avc -ts recent | audit2allow -M myfix
semodule -i myfix.pp
⚠️ 注意:
audit2allow 是“兜底方案”getenforcesetenforce 0 测试ausearch -m avcsealert -arestoreconsetenforce 1/tmp 或 home 拷过来的 → 上下文必错Disabled 切回 Enforcing 前必须 fixfiles onboot如果你有具体报错场景(如 Nginx / FTP / MySQL / 自定义服务),可以把 ausearch 或 sealert 的输出贴出来,我可以直接帮你写修复命令。