改ssh端口后连不上,主因是防火墙、selinux或云安全组未同步放行;必须同时配置双端口、firewalld放行新端口并重载、为新端口添加selinux上下文(semanage port -a -t ssh_port_t -p tcp 新端口)。

直接改 Port 22 为新端口再重启 sshd,大概率连不上——不是配置没生效,而是防火墙、SELinux、云安全组这三层里至少有一层在拦你。
为什么改了配置还连不上?常见错误现象
改完 /etc/ssh/sshd_config,systemctl restart sshd 成功,但 ssh -p 2222 user@ip 提示 Connection refused 或超时,常见原因有:
-
ss -tulnp | grep :2222看不到sshd进程监听该端口 → 很可能是 SELinux 拦截(尤其 CentOS/RHEL) - 本地能
ssh -p 2222 localhost,但外网连不上 → 云平台安全组没开,或本地防火墙(firewalld/ufw)没放行 -
journalctl -u sshd -n 30出现bind: Permission denied→ SELinux 未授权新端口,不是配置语法错 -
sshd -t报错或无输出但服务起不来 → 配置文件有隐藏格式问题(如 DOS 换行符)、端口被其他进程占用
必须做的三件事:双端口 + 防火墙 + SELinux 上下文
别只改一行 Port。真实生效要同时满足:
- 在
/etc/ssh/sshd_config里写两行:Port 22和Port 2222(或其他 1024–65535 范围内未被占用的端口),验证成功前绝不删Port 22 - 防火墙放行新端口并 reload:
sudo firewall-cmd --add-port=2222/tcp --permanent && sudo firewall-cmd --reload(firewalld);或sudo ufw allow 2222(UFW) - SELinux 启用时必须添加端口上下文:
sudo semanage port -a -t ssh_port_t -p tcp 2222;若提示command not found,先装包:sudo yum install policycoreutils-python-utils(RHEL/CentOS)或sudo apt install policycoreutils-python-utils(Debian/Ubuntu)
验证是否真生效,不能只靠 ssh 连得上
连得上只是第一步,还得确认底层服务真正就位:
- 查监听:
ss -tulnp | grep ':2222'→ 必须看到sshd进程绑定到该端口 - 查状态:
systemctl status sshd→ 确保是active (running),没有failed或degraded - 查 SELinux 约束:
ausearch -m avc -ts recent | grep ssh→ 若有拒绝记录,说明上下文没生效或端口冲突 - 外网测试前,先关掉本地网络代理、检查路由器 NAT 是否转发 → 很多“连不上”其实是中间链路问题,不是服务器本身
最易被忽略的是:云服务器的安全组规则和本地防火墙是独立控制的,改了服务器上的 sshd_config 和 firewalld,不代表云平台允许流量进来。每次换端口,都要登录控制台手动加一条入方向 TCP 规则——这步漏掉,前面所有操作等于白做。











