SELinux 通过端口标签与进程域匹配控制网络服务绑定权限;若进程监听未授权端口(如82),即使防火墙放行也会报Permission denied;需用semanage port为端口添加http_port_t等标签,并确保进程运行在正确domain(如httpd_t),再通过sesearch验证策略、ausearch/sealert排查拒绝原因。

SELinux 通过端口标签和进程域(domain)的匹配来控制网络服务能否绑定指定端口。如果进程尝试监听一个未被授权的端口,即使防火墙放行、配置文件正确,也会因 SELinux 拒绝而报 Permission denied(如 bind() to 0.0.0.0:82 failed (13: Permission denied))。
查看当前端口标签分配
系统预定义了常见服务的端口类型,例如:
-
http_port_t:用于标准 Web 服务,含80, 443, 8008, 8009, 8443, 9000等 TCP 端口 -
ssh_port_t:对应22/TCP -
reserved_port_t:未明确分配类型的端口(如82、3131),默认禁止服务绑定
执行以下命令列出所有已标记端口,并筛选 HTTP 相关项:
semanage port -l | grep http
为非标准端口添加或修改标签
若要让 httpd 或 nginx 监听 82/TCP,需将其关联到 http_port_t 类型:
- 新增端口标签:semanage port -a -t http_port_t -p tcp 82
- 若端口已存在但类型错误(如误标为
reserved_port_t),先删除再添加,或直接修改:semanage port -m -t http_port_t -p tcp 82 - 确认变更是否生效:semanage port -l -C(仅显示本地自定义项)
验证进程与端口的 SELinux 上下文匹配
端口打上标签只是前提,还需确保进程运行在正确的 domain 中:
- 检查 Web 服务进程标签:ps auxZ | grep httpd → 应看到
system_u:system_r:httpd_t:s0 - 确认端口上下文是否允许
httpd_t绑定:sesearch -A -s httpd_t -t http_port_t -c tcp_socket -p name_bind(需安装setools-console) - 若无输出,说明策略未允许该操作,需检查策略包是否完整或是否误删了相关规则
排查与修复典型拒绝问题
当服务启动失败时,按顺序执行:
- 查 SELinux 审计日志:ausearch -m avc -ts recent | grep nginx 或 journalctl -t setroubleshoot
- 提取关键信息:关注
avc: denied { name_bind }、scontext=httpd_t、tcontext=reserved_port_t - 用 sealert -a /var/log/audit/audit.log 获取可读建议(如提示“将端口 82 加入 http_port_t”)
- 完成端口标记后,重启服务:systemctl restart httpd,再用 curl -v http://localhost:82 测试

















