2.6.6 常见SSH故障排查

在生产环境中,SSH 故障通常由网络连通性、服务配置、认证机制或安全策略引起,应按“网络→服务→认证→策略”的顺序排查,避免盲目修改配置导致扩大影响。本节给出可执行的排查流程、典型命令、日志定位、配置示例与练习。

一、原理草图:SSH 连接链路与排查顺序

文章图片

二、连通性与端口检查(含命令解释)
1) 目标主机可达性

# ICMP 可达性
ping -c 4 192.168.10.20

# 路由路径
traceroute 192.168.10.20
  • -c 4:发送 4 次探测包,避免无休止输出

2) 端口可达性与端口变更

# 端口连通性
nc -zv 192.168.10.20 22

# 若 SSH 端口改为 2222
ssh -p 2222 user@192.168.10.20
  • -z:不发送数据,仅探测端口
  • -v:输出详细连接信息

3) 防火墙与安全组

# iptables 规则
iptables -L -n

# firewalld 规则
firewall-cmd --list-all

三、SSH 服务状态与配置语法(含示例)
1) 服务状态与重启

systemctl status sshd
systemctl restart sshd

2) 配置语法检查

sshd -t
# 无输出表示语法正确

3) 常见日志定位

# RHEL/CentOS
tail -f /var/log/secure

# Debian/Ubuntu
tail -f /var/log/auth.log

四、认证与权限问题(含示例与修复命令)
1) 密钥认证失败排查

# 检查公钥是否存在
ls -l ~/.ssh/authorized_keys

# 修复权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

2) 密钥格式兼容(PEM 转 OpenSSH)

ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
  • -m PEM:指定 PEM 格式
  • 适用于旧系统仅支持 PEM 的场景

3) 账户锁定与解锁

# 查看账户状态
passwd -S user

# 查看失败计数
faillock --user user

# 解锁
faillock --user user --reset

五、配置与策略冲突(含配置片段与解释)
1) 关键参数检查

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes
AllowUsers opsadmin devops
DenyUsers test
  • AllowUsersDenyUsers 同时存在时,优先拒绝
  • 修改后必须重启 sshd 生效

2) PAM 与 SELinux 影响

# SELinux 状态
getenforce

# 临时切换验证
setenforce 0

# PAM 规则
cat /etc/pam.d/sshd

六、连接异常与性能问题(带示例)
1) 登录缓慢(反向解析导致)

# /etc/ssh/sshd_config
UseDNS no
GSSAPIAuthentication no

修改后:

systemctl restart sshd

2) 连接后立刻断开(Shell 异常或 ForceCommand)

# 检查用户登录 shell
getent passwd user | cut -d: -f7

# 检查是否存在强制命令
grep -n "ForceCommand" /etc/ssh/sshd_config

3) 并发受限(MaxStartups/MaxSessions)

# /etc/ssh/sshd_config
MaxStartups 10:30:60
MaxSessions 10
  • MaxStartups 10:30:60:并发连接队列策略

七、标准化排查流程(可执行清单)

# 1. 网络连通性
ping -c 4 <host>
nc -zv <host> <port>

# 2. 服务状态
systemctl status sshd
sshd -t

# 3. 日志定位
tail -n 50 /var/log/secure

# 4. 认证与权限
ls -ld ~/.ssh
ls -l ~/.ssh/authorized_keys

# 5. 策略与限制
grep -E "AllowUsers|DenyUsers|PermitRootLogin" /etc/ssh/sshd_config
getenforce

八、排错演练(实操练习)
1) 练习一:端口更改后登录失败
- 将 /etc/ssh/sshd_configPort 2222
- 重启 sshd
- 使用 ssh -p 2222 user@host 连接
- 目标:验证端口变更后客户端命令调整

2) 练习二:密钥权限错误导致认证失败
- 将 authorized_keys 权限改为 644
- 尝试登录,观察日志 Authentication refused
- 修复为 600
- 目标:掌握权限对认证的影响

3) 练习三:UseDNS 影响登录速度
- 开启 UseDNS yes
- 测试登录耗时
- 改为 UseDNS no 后对比
- 目标:定位 DNS 反向解析导致的延迟