这类问题我又碰上了一次。CentOS 7.9 把 sshd 的 Port 改成 2222 之后服务起不来,systemctl status 只报 bind: Permission denied,setenforce 0 再启动就正常,切回 enforcing 又挂,audit.log 里能看到 avc denied。firewalld 里 2222 早就放行了,用 nc 在同一个端口上监听却是通的,说明端口本身没被占。
第一反应是「有人手工改过 /etc/ssh 下文件的上下文,restorecon 之后配置又被改回默认」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。SELinux 的 ssh_port_t 只声明了 22,其他端口不允许 sshd 去绑定;改端口时只在 firewalld 里放行,没做 semanage port,绑定阶段就被拦;auditd 没开或者日志被轮转,avc 记录查不到,只能靠猜。
上来先看 sshd 允许绑哪些端口
semanage port -l | grep ssh_port_t
再往下把 2222 加进 ssh_port_t
semanage port -a -t ssh_port_t -p tcp 2222
接着确认配置文件的上下文正常
restorecon -Rv /etc/ssh && ls -Z /etc/ssh/sshd_config
从审计日志确认拒绝的对象
ausearch -m avc -ts recent | grep sshd
怎么算真的好了,看的是同一批现象。setenforce 1 的状态下 systemctl restart sshd 成功,ss -lntp 能看到 2222 在监听,audit.log 不再新增 avc denied。
提醒一点。semanage 的改动写在 targeted 的 ports.local 里,重装 policy 才会丢;不要拿 setenforce 0 当长期方案,等于把整套强制访问控制关掉了。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
