修改SSH端口需先备份配置、双端口过渡(保留Port 22和新增Port 2222)、防火墙放行并reload、SELinux添加端口上下文、云安全组同步开放,验证成功后才禁用22端口。

Port 行不等于端口就通了——漏掉防火墙、SELinux 或安全组中的任意一环,都会导致新端口连不上,而且你大概率会被自己锁在外面。
修改 /etc/ssh/sshd_config 中的 Port 配置
核心动作是启用并设置 Port 指令,但不能只改一行就重启:
- 先备份:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak - 编辑文件:
sudo nano /etc/ssh/sshd_config,找到#Port 22这一行 - 取消注释,改为
Port 2222(或其他 1024–65535 范围内未被占用的端口) - 强烈建议**先保留原
Port 22行**,即写成两行:Port 22和Port 2222,验证成功后再删旧的 - 改完务必运行
sudo sshd -t检查语法,无输出才表示配置合法
防火墙必须放行新端口,且 reload 才生效
UFW 或 firewalld 加了规则但没 reload,等于没加;iptables 规则不持久化,重启后失效:
- UFW(Ubuntu/Debian):
sudo ufw allow 2222/tcp→ 再执行sudo ufw reload(仅allow不够) - firewalld(CentOS/RHEL/Rocky):
sudo firewall-cmd --permanent --add-port=2222/tcp→ 必须跟sudo firewall-cmd --reload - iptables(传统方式):
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT→ 保存规则,如sudo iptables-save > /etc/iptables/rules.v4 - 云服务器(阿里云、AWS、腾讯云等):系统防火墙开了还不够,**控制台里的安全组必须同步放行该端口**
SELinux 启用时会拦截非标准端口绑定
CentOS/RHEL 默认开启 SELinux,它默认只允许 ssh_port_t 类型绑定到少数几个端口(如 22、2222、2022),设成 Port 22022 就会报 bind: Permission denied:
- 检查是否启用:
sestatus,输出为enforcing或permissive就需处理 - 查当前允许的 SSH 端口:
sudo semanage port -l | grep ssh - 添加新端口上下文:
sudo semanage port -a -t ssh_port_t -p tcp 22022(把 22022 换成你的端口) - 若提示
command not found,先装依赖:sudo yum install policycoreutils-python-utils(RHEL/CentOS)或sudo apt install policycoreutils-python-utils(Debian/Ubuntu)
测试连接前必须保持原会话不断开
这是最常被跳过的致命步骤——一旦新端口不通,你就彻底失联:
- 重启服务:
sudo systemctl restart sshd(OpenSSH 支持平滑重启,原连接不会断) - 新开终端窗口,立刻测试:
ssh -p 2222 username@your_server_ip - 连上后执行几个命令(如
ls、whoami),确认会话稳定、无延迟、无断连 - 失败时别慌,先看日志:
sudo journalctl -u sshd -n 50 -f或sudo tail -f /var/log/auth.log - 如果连不上,立即回退:恢复
sshd_config,再sudo systemctl restart sshd
Port 2222 变成一堵看不见的墙。


















