记录一下那天晚上的排查过程。CentOS 7.9 开着 SELinux enforcing,nginx 反代到 127.0.0.1:9000 的 php-fpm,页面一直 502,error.log 是 connect() failed (13: Permission denied),目录权限都给了 755。

刚开始盯着「targeted 策略把 /www 下的日志目录标成了 var_log_t」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。httpd_can_network_connect 没打开,nginx 进程被禁止发起网络连接。少数情况下是php-fpm 监听的 9000 端口没打上 http_port_t 标签。

少数情况下是audit 日志被关掉,拒绝记录没留下,看起来像根本没拦。

先看 audit 里的拒绝记录

ausearch -m avc -ts recent | tail -20

然后确认相关布尔值状态

getsebool -a | grep -E 'httpd_can_network_connect|httpd_can_network_relay'

再往下打开反代需要的布尔值

setsebool -P httpd_can_network_connect 1

补齐端口和目录标签

semanage port -a -t http_port_t -p tcp 9000 && restorecon -Rv /www

隔了一天再看,现象没变,说明不是偶发。

那几天正好在做别的变更,先把时间线对齐才敢动手。

别只看报错消失,验证要多做一步。nginx 反代返回 200,ausearch 里不再出现新的 avc denied,semanage port -l 里 9000 是 http_port_t。

容易忽略的是,setsebool 不加 -P 重启就还原;audit2allow 生成的策略能过,但优先找现成的布尔值,自己写模块容易越放越宽。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189