Ubuntu服务器22端口无法访问的排查与修复方案

一、先确保内部原因配置正确

零0 查看所有的配置文件

1
2
3
# 搜索主配置+子配置中所有PasswordAuthentication行
sudo grep -r "PasswordAuthentication" /etc/ssh/

✅ 若输出包含 /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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
1. 开启密钥登录(修改 SSH 配置)

# 编辑SSH主配置文件
sudo vi /etc/ssh/sshd_config
或用 nano--------------------
sudo nano /etc/ssh/sshd_config
或用 直接发送的方式-------------

sudo sed -i 's/#PubkeyAuthentication yes/PubkeyAuthentication yes/g' /etc/ssh/sshd_config

sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config

-----------按需配置
PubkeyAuthentication yes # 必须开启公钥认证
PasswordAuthentication yes # 暂时保留密码(测试完再关)
ChallengeResponseAuthentication no
PermitRootLogin no # 禁止root登录(用ubuntu用户)
AllowUsers ubuntu # 明确允许ubuntu用户登录(关键!)
AuthorizedKeysFile .ssh/authorized_keys # 公钥文件路径(默认,确认未被注释)
2. 修复目录权限,防止目录过宽

chmod 755 /home/ubuntu # 必须是755,不能是777
chown -R ubuntu:ubuntu /home/ubuntu/.ssh # 确保属主是ubuntu

3. 重启ssh

sudo systemctl restart sshd

4. 验证状态
- 验证 SSH 配置是否生效
- sudo sshd -t # 检查配置语法(无输出=语法正确)
- sudo systemctl status sshd # 确认服务是 running 状态

- sudo ufw status

二 - 关闭密码登录(修改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
3
sudo pkill sshd && sudo systemctl start sshd
sudo systemctl restart sshd

三补充

四.验证修改项(大坑)

可能冗余的旧ssh仍然使得ssh可用密码登录,此时需要强杀旧ssh进程,特征是ssh生效的命令和ssh config不符

查看生效的SSH配置

1
2
3
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
    2
    sudo 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
    2
    sudo ufw allow 22/tcp
    sudo ufw reload # 重载规则

三、第三步:网络层配置

  • 在云服务商放行端口

四、第四步:验证修复结果

回到Windows的PowerShell,重新执行端口测试:

1
Test-NetConnection 175.27.253.188 -Port 22

测试端口连通性

五、权限问题(若22端口通了但仍连不上)

  • 赋予文件权限
    1
    2
    3
    chmod 700 /home/ubuntu/.ssh
    chmod 600 /home/ubuntu/.ssh/authorized_keys
    sudo systemctl restart sshd