selinux 限制服务仅能绑定带对应标签的端口,如 httpd 默认仅允许监听 http_port_t 标签端口(80、443等);使用非标端口(如82)需先执行 semanage port -a -t http_port_t -p tcp 82 添加标签,再同步配置防火墙放行及服务监听设置。

SELinux 会限制服务只能绑定它认可的端口,比如 httpd 默认只允许监听 80、443 等带 http_port_t 标签的端口。想用 82、8080 或 9000 这类非标准端口?必须先给端口打上对应的服务类型标签,否则启动就报 Permission denied。
查当前哪些端口已标记
运行命令查看所有已定义的端口标签:
-
semanage port -l—— 列出全部端口与类型映射 -
semanage port -l | grep http_port_t—— 只看 HTTP 类端口(常见有 80, 443, 8008, 8009, 8443) -
semanage port -l -C—— 仅显示你本地手动添加或修改过的条目(便于复盘)
给自定义端口加标签
假设你要让 httpd 监听 82/TCP,就得把 82 加入 http_port_t 类型:
semanage port -a -t http_port_t -p tcp 82- 执行后再次
grep http_port_t就能看到82出现在列表里 - 如果提示
Command not found,先装工具:yum install policycoreutils-python-utils(RHEL/CentOS)或dnf install policycoreutils-python-utils(Fedora/RHEL 9+)
改标签或删标签
端口标错类型、换服务用途、或者清理测试配置时会用到:
- 把 82 改成 SSH 类型:
semanage port -m -t ssh_port_t -p tcp 82 - 彻底移除 82 的
http_port_t绑定:semanage port -d -t http_port_t -p tcp 82 - 删除前建议先确认存在:
semanage port -l | grep ':82'
配合其他必要步骤
只加 SELinux 端口标签还不够,得同步处理两件事:
-
防火墙放行:比如用 firewalld:
firewall-cmd --add-port=82/tcp --permanent && firewall-cmd --reload -
服务配置更新:改
/etc/httpd/conf/httpd.conf中的Listen 82,再重启服务:systemctl restart httpd - 若仍失败,用
sealert -a /var/log/audit/audit.log查具体拒绝原因,日志里会明确指出缺哪个上下文











