selinux拒绝服务外连的典型表现是服务能监听本地端口但无法访问外部api或数据库,日志报connection refused或超时,而手动curl/telnet却通;根源常为布尔值未开启,如httpd_can_network_connect,需用getsebool检查、setsebool开启,并通过ausearch或sealert分析avc日志定位具体拒绝项。

SELinux 拒绝服务向外建连,典型表现是服务能正常启动、监听本地端口,但无法访问外部 API、数据库或代理目标,日志里常出现 Connection refused 或超时,而 curl/telnet 手动测试却通——这往往不是网络或服务问题,而是 SELinux 布尔值未开启。
确认是不是 SELinux 在拦截
先排除干扰:运行 getenforce。若返回 Enforcing,再执行 setenforce 0 临时切宽容模式;立刻重试服务的外连操作(如重启 httpd 后 curl 外部地址)。若此时成功,基本锁定 SELinux。别忘了之后用 setenforce 1 恢复强制模式。
查相关布尔值是否启用
多数服务外连依赖预定义布尔值,比如:
-
Web 服务(httpd/nginx)连外网:需
httpd_can_network_connect -
数据库客户端(如 mysql/mariadb)连远程库:需
mysqld_connect_any或mysql_connect_any -
SSH 代理、rsync over ssh、自定义脚本发起连接:可能涉及
ssh_sysadm_login或通用allow_network_connect(依策略版本而异)
查当前状态:getsebool -a | grep -E "(httpd|mysql|ssh|network)"。临时开启:setsebool httpd_can_network_connect on;永久生效加 -P 参数:setsebool -P httpd_can_network_connect on。
看 AVC 日志定位具体拒绝项
即使开了布尔值,仍可能因上下文或策略细节被拦。运行:
-
ausearch -m avc -ts recent -c httpd(替换httpd为你的服务进程名) - 或更直观:
sealert -a /var/log/audit/audit.log(需已装setroubleshoot)
输出中会明确指出“comm="httpd" exe="/usr/sbin/httpd" name="example.com" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket”,并提示缺哪条规则,甚至建议执行 setsebool 或 audit2allow ——但优先用布尔值,而非直接生成策略。
注意端口与上下文的隐含限制
有些外连失败并非布尔值问题,而是目标端口类型不匹配。例如 httpd 尝试连 Redis 的 6379 端口,但该端口未标记为 redis_port_t,SELinux 默认只允许连 http_port_t、ftp_port_t 等白名单端口。查当前允许项:semanage port -l | grep -E "(http|redis|mysql)";若缺失,添加:semanage port -a -t redis_port_t -p tcp 6379。











