selinux 通过端口标签(如http_port_t)与进程域(如httpd_t)匹配控制网络绑定权限;若端口未标记或进程域不匹配,即使配置正确、防火墙放行,也会因策略拒绝导致permission denied错误。

SELinux 对网络端口的控制,核心在于“端口标签”与“进程域”的匹配。即使服务配置正确、防火墙已放行,只要端口没被赋予对应进程可绑定的安全类型,就会报 Permission denied(比如 bind() to 0.0.0.0:82 failed (13: Permission denied))。这不是配置错误,而是 SELinux 的强制策略在起作用。
查看当前端口标签分配
系统预置了常用端口类型,例如:
- http_port_t:涵盖 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(仅显示本地自定义项)
验证进程与端口上下文是否匹配
打上标签只是前提,还需确保进程运行在正确的 domain 中:
- 检查 Web 进程标签:ps auxZ | grep httpd → 应看到类似
system_u:system_r:httpd_t:s0 - 确认策略是否允许该 domain 绑定该端口类型: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 测试











