解决ssh无法登录的问题
Ubuntu服务器22端口无法访问的排查与修复方案
一、先确保内部原因配置正确
零0 查看所有的配置文件
1 | # 搜索主配置+子配置中所有PasswordAuthentication行 |
✅ 若输出包含 /etc/ssh/sshd_config.d/xxx.conf:PasswordAuthentication yes → 子配置覆盖了主配置;
✅ 若输出显示主配置里有两行 PasswordAuthentication(一行 yes,一行 no)→ 重复配置导致生效的是 yes。
如果输出多行一样的passworAuthenticationd配置则说明,存在多个ssh配置文件,可能配置的ssh配置文件不是最优先级最前面的文件
所以要修改所有的ssh配置
腾讯云子配置文件1
sudo nano /etc/ssh/sshd_config.d/50-cloud-init.conf
不建议使用主配置把这个tx云文件删除后,是会读取主配置,但是服务器重启后这个文件仍会自动创建
一 -开启密钥登录(修改SSH配置)
1 | 1. 开启密钥登录(修改 SSH 配置) |
二 - 关闭密码登录(修改SSH配置)
第一步:编辑 SSH 配置文件(禁用所有密码认证)
登录 Ubuntu(密钥 / 密码方式,先确保密钥登录能正常用),执行命令编辑sshd_config:
sudo vi /etc/ssh/sshd_config
或用nano
找到以下配置项,按要求修改(注释的取消注释,值改为no):
1. 核心:禁用密码认证(最关键)
PasswordAuthentication no
2. 禁用挑战响应式密码认证(兜底,避免PAM密码登录)
ChallengeResponseAuthentication no
3. 可选(彻底禁用PAM相关密码兜底)
UsePAM no
4. 确保公钥认证开启(必须保留,否则会锁死)
PubkeyAuthentication yes
5. 禁用空密码登录(冗余但更安全)
PermitEmptyPasswords no
兜底密码登录,之后再密钥登录不上可能会锁死
UsePAM yes
6. 重载ssh 配置
强制重启1
2
3sudo pkill sshd && sudo systemctl start sshd
sudo systemctl restart sshd
三补充
四.验证修改项(大坑)
可能冗余的旧ssh仍然使得ssh可用密码登录,此时需要强杀旧ssh进程,特征是ssh生效的命令和ssh config不符
查看生效的SSH配置
1 | sudo sshd -T | grep -E "passwordauthentication|usepam|pubkeyauthentication" |
二、再分析外部原因
一、第一步:本地侧验证(Windows机器)——先确认IP/端口是否真的不通
1. 验证IP是否可达(排除IP错误)
在PowerShell执行:
1 | ping 175.27.253.177 |
✅ 若能ping通:说明IP正确,问题出在22端口/SSH服务。
❌ 若ping不通:
- 场景1(云服务器):ping ip需要所有端口保持 开放,防火墙全部放通
2. 精准测试22端口(替代脚本的检测,更直观)
在PowerShell执行(需先启用telnet,若提示telnet不存在,见下方备注):
1 | telnet 175.27.253.177 22 |
或用PowerShell原生命令(无需telnet):
1 | Test-NetConnection 175.27.253.177 -Port 22 |
✅ 正常结果:
TcpTestSucceeded = True(telnet会显示SSH-2.0-OpenSSH_...);❌ 异常结果:
TcpTestSucceeded = False→ 端口被拦截,继续下一步排查。
备注:启用Windows telnet的方法:
控制面板 → 程序 → 启用或关闭Windows功能 → 勾选「Telnet客户端」→ 确定。
二、第二步:Ubuntu服务器端检查(必须先登录Ubuntu!)
如果是云服务器,通过服务商的「控制台/VNC/远程终端」登录;如果是内网Ubuntu,直接接显示器/键鼠登录。
1. 检查SSH服务是否启动(核心)
执行命令:
1 | sudo systemctl status sshd |
✅ 正常状态:
active (running)(绿色);❌ 异常状态:
inactive (dead)→ 启动SSH服务:1
2sudo systemctl start sshd # 临时启动
sudo systemctl enable sshd # 设置开机自启
2. 检查SSH是否监听22端口
执行命令:
1 | sudo netstat -tulpn | grep sshd |
✅ 正常结果:
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN xxx/sshd(说明22端口被监听);❌ 无结果/端口不是22:
编辑SSH配置文件:
sudo vi /etc/ssh/sshd_config;找到
Port 22(若被注释/改了端口,恢复为22,或脚本中修改$sshPort为对应端口);重启SSH:
sudo systemctl restart sshd。
3. 检查Ubuntu本地防火墙(ufw)是否开放22端口
执行命令:
1 | sudo ufw status |
场景1:ufw未启用(状态
inactive)→ 无需操作;场景2:ufw已启用(状态
active)→ 强制开放22端口:1
2sudo ufw allow 22/tcp
sudo ufw reload # 重载规则
三、第三步:网络层配置
- 在云服务商放行端口
四、第四步:验证修复结果
回到Windows的PowerShell,重新执行端口测试:
1 | Test-NetConnection 175.27.253.188 -Port 22 |
测试端口连通性
五、权限问题(若22端口通了但仍连不上)
- 赋予文件权限
1
2
3chmod 700 /home/ubuntu/.ssh
chmod 600 /home/ubuntu/.ssh/authorized_keys
sudo systemctl restart sshd