唯一真正生效的修改点是直接改/etc/ssh/sshd_config中的port行,需保留port 22并新增port 2222(1024–65535间未占用端口),再依次通过sshd -t验证语法、防火墙放行并reload、selinux用semanage port -a添加端口上下文、云安全组同步开放,最后测试成功才禁用22端口。

直接改 /etc/ssh/sshd_config 里的 Port 行
这是唯一真正生效的修改点,其他文件如 /etc/init.d/sshd 或 /etc/hosts.deny 都不控制端口监听。打开配置文件后,找 #Port 22 这一行:
- 不要删掉它,先取消注释(去掉开头的
#),再复制一行改成新端口,比如Port 2222 - 端口号必须在
1024–65535范围内;避开80、443、3306等常见服务端口,用sudo ss -tuln | grep :2222确认没被占用 - 改完别急着重启,先运行
sudo sshd -t检查语法——返回空行才表示合法
防火墙必须放行新端口,且 reload 才生效
光改配置文件,连接照样被拒绝。系统防火墙(firewalld 或 ufw)和云厂商安全组是两层独立策略,缺一不可:
- Ubuntu/Debian:
sudo ufw allow 2222/tcp,再确认sudo ufw status显示2222/tcp在列表里,且状态为active - CentOS/RHEL:
sudo firewall-cmd --permanent --add-port=2222/tcp,然后一定要执行sudo firewall-cmd --reload(漏掉这步等于没加) - 云服务器(阿里云、AWS 等):控制台里安全组必须手动添加入方向规则,协议选
TCP,端口填2222,源地址建议限制为可信 IP 段
SELinux 启用时,semanage port 必须补上
CentOS/RHEL 默认启用 SELinux,它会拦截非标准端口的绑定,导致 systemctl restart sshd 失败,日志里出现 bind: Permission denied:
- 先查当前允许的 SSH 端口:
sudo semanage port -l | grep ssh - 如果新端口不在输出里,就执行:
sudo semanage port -a -t ssh_port_t -p tcp 2222 - 若提示
command not found,RHEL/CentOS 8+ 需装:sudo yum install policycoreutils-python-utils;Ubuntu 不用管
systemctl restart sshd 后连不上?先别慌
重启后旧连接不会断,但新连接走新配置。连不上大概率卡在这几个环节:
- 本地测试最快:
ssh -p 2222 localhost—— 如果本机都连不上,说明服务根本没监听新端口,回退检查配置和 SELinux - 外网连不上但内网可以?90% 是云安全组没开,不是系统防火墙问题
- 改完立刻删掉
Port 22行?危险。应先验证ssh -p 2222稳定可用至少 10 分钟,再注释掉原端口并重启 - 所有依赖 SSH 的脚本(
scp、rsync、CI 流水线)都得显式加-p 2222,或改对应配置里的Port字段
semanage 命令不执行,sshd 就起不来,但错误日志藏在 /var/log/audit/audit.log 里,不像常规报错那么直观。











