SELinux 中使用 semanage port 添加非标准端口,核心是为端口打上对应服务类型标签(如 http_port_t、ssh_port_t),否则服务启动会报 Permission denied;需先查现有标签、安装 policycoreutils-python-utils 工具(RHEL/CentOS/Fedora)、执行 semanage port -a -t 类型 -p 协议 端口,再同步放行防火墙并更新服务配置重启。

在 Linux 中使用 semanage port 添加非标准端口,核心是给端口打上对应服务类型的 SELinux 标签。SELinux 默认只允许服务绑定它认可的端口(比如 httpd 只能绑 http_port_t 标签的端口),直接改服务配置监听 82、8080 或 2222 这类端口会报 Permission denied。
查清当前端口标签现状
先确认目标服务已有的端口范围,避免重复或冲突:
-
semanage port -l | grep http_port_t—— 看 HTTP 类默认端口(如 80、443、8008、8443) -
semanage port -l | grep ssh_port_t—— 查 SSH 允许的端口(通常只有 22) -
semanage port -l -C—— 只显示你本地手动添加/修改过的条目,方便清理或复盘
安装 semanage 工具(如未预装)
部分系统(如 RHEL/CentOS 8+、Fedora)默认不带 semanage,需手动安装:
- RHEL/CentOS 8+ / Rocky/AlmaLinux:
yum install policycoreutils-python-utils或dnf install policycoreutils-python-utils - Ubuntu/Debian 不依赖此工具,SELinux 管理方式不同,一般无需
semanage port
为端口添加对应服务类型标签
语法统一为:semanage port -a -t [类型] -p [协议] [端口号],例如:
- 让
httpd监听 8080:semanage port -a -t http_port_t -p tcp 8080 - 让
sshd使用 2222:semanage port -a -t ssh_port_t -p tcp 2222 - 让 Nginx 或自定义 Web 服务用 9000:
semanage port -a -t http_port_t -p tcp 9000
执行后,再用 semanage port -l | grep [类型] 验证是否成功加入列表。
配套动作不能少
仅加 SELinux 标签还不够,必须同步完成以下两步:
-
防火墙放行:用
firewall-cmd --permanent --add-port=端口号/tcp(RHEL系)或ufw allow 端口号/tcp(Ubuntu/Debian) -
服务配置更新:修改服务自身配置(如
/etc/ssh/sshd_config加Port 2222,或/etc/httpd/conf/httpd.conf改Listen 8080),然后重启服务


















