必须先保留原端口22并新增新端口(如2222),确认新端口连通后再禁用22;同步检查sshd配置语法、防火墙放行、selinux上下文及端口占用,缺一不可。

sshd_config 文件改端口这事本身不难,但直接改完就重启 sshd,十有八九会把自己锁在外面。核心问题不是“怎么改”,而是“怎么改完还能连上”。
修改 sshd_config 时必须保留至少一个可用端口
别一上来就把 Port 22 注释掉再写新端口。正确做法是先加新端口,确认能连上后再考虑是否删旧端口。
- 编辑
/etc/ssh/sshd_config,在文件任意空白处新增一行:Port 2222(数字选 1024–65535 之间、未被占用的) - 确保原
Port 22行没被注释(即保持Port 22生效),这样 22 和 2222 同时监听 - 用
ss -tlnp | grep :22和ss -tlnp | grep :2222验证两个端口是否都在 LISTEN 状态
防火墙不放行 = 白改
改了配置、重启了服务,但连不上?90% 是防火墙拦着。不同发行版命令不同,别套用错:
- CentOS/RHEL 7+(
firewalld):firewall-cmd --permanent --add-port=2222/tcp,然后firewall-cmd --reload - Ubuntu/Debian(
ufw):ufw allow 2222/tcp - 老系统用
iptables:iptables -I INPUT -p tcp --dport 2222 -j ACCEPT,并保存规则(如iptables-save > /etc/iptables/rules.v4)
重启 sshd 前必须测试配置语法
systemctl restart sshd 一旦失败,当前连接可能断开且无法恢复。务必先做两件事:
- 运行
sshd -t—— 返回空行才表示配置语法无误;若有报错,立刻修正 - 新开一个终端窗口,用新端口测试连接:
ssh user@localhost -p 2222,成功后再关旧连接 - 不要用
service sshd reload替代 restart:部分系统 reload 不重读端口配置,只生效部分参数
端口选错或冲突会导致启动失败
选端口不是随便填个四位数就行。常见踩坑点:
- 用
ss -tlnp | grep :<port></port>或lsof -i :<port></port>检查端口是否已被占用(比如dockerd、node、minikube常抢 2222、3000、8080) - 避免用 1–1023 的特权端口(除非你真想用 root 启动 sshd,不推荐)
- 别选 53(DNS)、67/68(DHCP)、123(NTP)这类敏感端口,即使当前没占,后续装服务容易冲突
sshd -t 过一遍、防火墙同步更新,这三步漏任何一步,都可能让运维变成“现场拔网线”。











