在 CentOS 中排查 SELinux 相关问题,一般按下面的思路和步骤来做。
getenforce
# 或
sestatus
常见状态:
Enforcing:强制模式(会拦截并写日志)Permissive:宽容模式(只记录不拦截)Disabled:已关闭如果是问题排查,建议先切到 Permissive 验证:
setenforce 0
重启后失效,仅用于验证是否为 SELinux 导致
ausearchausearch -m avc -ts recent
或指定时间:
ausearch -m avc -ts today
journalctljournalctl -t setroubleshoot
journalctl | grep AVC
cat /var/log/audit/audit.log | grep AVC
sealert 自动分析(推荐)sealert -a /var/log/audit/audit.log
或针对某条:
sealert -l "*"
它会给出:
setenforce 0
# 再测试你的服务/命令
如果 Permissive 下正常,基本可以确定是 SELinux 限制。
查看文件上下文:
ls -Z /path/to/file
修复上下文:
restorecon -Rv /path
或修改:
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
查看端口允许情况:
semanage port -l | grep http
添加端口:
semanage port -a -t http_port_t -p tcp 8080
查看 AVC:
ausearch -m avc -c httpd
生成策略模块(谨慎):
grep httpd /var/log/audit/audit.log | audit2allow -M myhttpd
semodule -i myhttpd.pp
getenforce 确认状态setenforce 0 验证是否 SELinux 问题ausearch / sealert 看 AVC 日志Enforcing 测试如果你有 具体报错或服务(如 Nginx / FTP / MySQL / SSH),可以把 AVC 日志贴出来,我可以帮你精确分析。