记录一下那天晚上的排查过程。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 生成的策略能过,但优先找现成的布尔值,自己写模块容易越放越宽。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
