唯一真正生效的修改是编辑/etc/ssh/sshd_config,保留port 22并新增port 2222(1024–65535间未占用端口),再经sshd -t验证、防火墙reload、selinux授权及云安全组开放后,方可禁用22端口。

改 /etc/ssh/sshd_config 里的 Port 行是唯一真正生效的操作,其他地方动了也没用。直接删掉 Port 22、只留新端口,等于主动断网——必须先双端口并行验证稳定,再撤旧端口。
怎么改 sshd_config 才不丢连接
打开文件后别急着删 #Port 22,而是:
- 取消注释原行(去掉
#),保持Port 22不变 - 在它下面新增一行,比如
Port 2222(端口号必须在1024–65535范围内) - 用
sudo ss -tuln | grep :2222确认该端口没被其他进程占用 - 改完立刻执行
sudo sshd -t—— 返回空行才表示语法合法,否则systemctl restart sshd必失败
漏掉 sshd -t 验证,90% 的“重启后连不上”问题就出在这一步。
firewalld 或 ufw 放行但连不上?reload 漏了
加规则 ≠ 生效,必须 reload:
- CentOS/RHEL:
sudo firewall-cmd --permanent --add-port=2222/tcp之后,必须跟sudo firewall-cmd --reload - Ubuntu/Debian:
sudo ufw allow 2222/tcp后,用sudo ufw status确认状态为active且2222/tcp在列表里 - 云服务器(阿里云、AWS 等):安全组规则是独立一层,控制台里必须手动添加入方向 TCP 规则,端口填
2222,源地址别设成0.0.0.0/0,优先限制可信 IP 段
本地 ssh -p 2222 localhost 能通但外网不通?90% 是云安全组没开,不是系统防火墙问题。
SELinux 启用时 systemctl restart sshd 报 bind: Permission denied
RHEL/CentOS 默认启用 SELinux,它会拦截非标准端口绑定,日志里能看到明确拒绝记录:
- 先查当前允许的 SSH 端口:
sudo semanage port -l | grep ssh - 如果
2222不在输出中,执行:sudo semanage port -a -t ssh_port_t -p tcp 2222 - 若提示
semanage: command not found,RHEL/CentOS 8+ 需先装:sudo yum install policycoreutils-python-utils - Ubuntu 不用管 SELinux,跳过这步
临时 setenforce 0 能绕过,但不解决根本问题;永久禁用 SELinux 更不可取——补上下文才是正解。
所有依赖 SSH 的工具都得显式指定新端口
改完端口不是一劳永逸,后续使用全要适配:
-
scp、rsync、gitover SSH:全部加-P 2222(注意是大写P)或改对应配置中的Port字段 - CI/CD 流水线脚本(如 Jenkins、GitHub Actions):检查所有
ssh、scp命令是否带-p参数 -
~/.ssh/config可集中配置:Host myserver\n HostName 192.168.1.10\n Port 2222,之后直接ssh myserver即可
最容易被跳过的不是改配置,而是安全组和客户端适配——截至 2026 年 9 月,云厂商控制台里漏开安全组仍是最高频失联原因。











