乐闻世界logo
搜索文章和话题

SSH 常见故障有哪些排查方法和解决方案?

2月19日 19:29

SSH 故障排查是系统管理员和开发人员必备的技能。当 SSH 连接出现问题时,需要系统地诊断和解决各种连接、认证和配置问题。

常见连接问题

1. 连接超时

症状

shell
ssh: connect to host hostname port 22: Connection timed out

排查步骤

bash
# 检查网络连通性 ping hostname # 检查端口是否开放 telnet hostname 22 nc -zv hostname 22 # 检查防火墙 sudo iptables -L -n | grep 22 sudo ufw status # 检查 SSH 服务状态 sudo systemctl status sshd sudo netstat -tlnp | grep :22

解决方案

  • 检查服务器防火墙规则
  • 确认 SSH 服务正在运行
  • 检查网络路由和连通性
  • 验证端口是否被正确监听

2. 连接被拒绝

症状

shell
ssh: connect to host hostname port 22: Connection refused

排查步骤

bash
# 检查 SSH 服务状态 sudo systemctl status sshd # 检查 SSH 配置 sudo sshd -t # 检查监听端口 sudo netstat -tlnp | grep sshd # 查看错误日志 sudo tail -f /var/log/auth.log

解决方案

  • 启动 SSH 服务:sudo systemctl start sshd
  • 修复配置错误:sudo sshd -t
  • 检查端口配置是否正确
  • 查看系统日志获取详细错误信息

认证问题

1. 密码认证失败

症状

shell
user@hostname's password: Permission denied, please try again.

排查步骤

bash
# 检查用户账户 id username grep username /etc/passwd # 检查密码认证是否启用 sudo grep "PasswordAuthentication" /etc/ssh/sshd_config # 检查账户状态 sudo passwd -S username # 查看认证日志 sudo tail -f /var/log/auth.log | grep "Failed password"

解决方案

  • 确认密码正确
  • 检查账户是否被锁定
  • 验证密码认证是否启用
  • 重置用户密码

2. 公钥认证失败

症状

shell
Permission denied (publickey).

排查步骤

bash
# 客户端检查 ls -la ~/.ssh/ ssh-add -l # 服务器端检查 ls -la ~/.ssh/authorized_keys cat ~/.ssh/authorized_keys # 检查权限 stat ~/.ssh stat ~/.ssh/authorized_keys # 详细调试 ssh -vvv user@hostname

解决方案

bash
# 修复文件权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub # 检查 SELinux getenforce restorecon -R -v ~/.ssh # 添加密钥到服务器 ssh-copy-id user@hostname

配置问题

1. 主机密钥验证失败

症状

shell
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

解决方案

bash
# 删除旧的主机密钥 ssh-keygen -R hostname # 或手动删除 sed -i '/hostname/d' ~/.ssh/known_hosts # 重新连接 ssh user@hostname

2. 配置文件错误

症状

shell
Bad configuration option

排查步骤

bash
# 测试配置文件 ssh -F ~/.ssh/config user@hostname # 测试服务器配置 sudo sshd -t # 查看详细错误 sudo sshd -T

解决方案

  • 修复配置文件语法错误
  • 检查配置选项是否正确
  • 参考官方文档验证配置

性能问题

1. 连接建立缓慢

排查步骤

bash
# 详细调试 ssh -vvv user@hostname # 检查 DNS 解析 time nslookup hostname dig hostname # 检查 GSSAPI 认证 ssh -o GSSAPIAuthentication=no user@hostname

解决方案

bash
# ~/.ssh/config Host * GSSAPIAuthentication no UseDNS no AddressFamily inet

2. 数据传输慢

排查步骤

bash
# 测试网络速度 iperf3 -c hostname # 检查加密算法 ssh -Q cipher # 测试不同算法 ssh -c aes256-ctr user@hostname

解决方案

bash
# 启用压缩 ssh -C user@hostname # 使用更快的加密算法 ssh -c chacha20-poly1305@openssh.com user@hostname # 调整 MTU ssh -o IPQoS=lowdelay user@hostname

日志分析

关键日志位置

bash
# 系统认证日志 /var/log/auth.log # Debian/Ubuntu /var/log/secure # CentOS/RHEL # SSH 守护进程日志 journalctl -u sshd # 详细连接日志 sudo tail -f /var/log/auth.log | grep sshd

常见日志模式

bash
# 成功登录 grep "Accepted" /var/log/auth.log # 失败登录 grep "Failed" /var/log/auth.log # 无效用户 grep "Invalid user" /var/log/auth.log # 连接关闭 grep "Disconnected" /var/log/auth.log

高级调试技巧

1. 使用 strace

bash
# 跟踪 SSH 客户端 strace -e trace=network ssh user@hostname # 跟踪 SSH 守护进程 sudo strace -p $(pidof sshd)

2. 使用 tcpdump

bash
# 捕获 SSH 流量 sudo tcpdump -i eth0 -w ssh.pcap port 22 # 分析流量 sudo tcpdump -r ssh.pcap -A | grep "SSH"

3. 使用 wireshark

bash
# 捕获并分析 sudo tshark -i eth0 -f "port 22" -Y "ssh"

预防措施

1. 定期测试

bash
# 测试配置 sudo sshd -t # 测试连接 ssh -o ConnectTimeout=5 user@hostname "echo OK"

2. 监控脚本

bash
#!/bin/bash # SSH 健康检查脚本 HOST="hostname" USER="username" if ssh -o ConnectTimeout=10 -o BatchMode=yes $USER@$HOST "echo OK" > /dev/null 2>&1; then echo "SSH connection OK" else echo "SSH connection FAILED" # 发送告警 fi

3. 配置备份

bash
# 定期备份配置 sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d) # 备份密钥 tar -czf ssh_backup_$(date +%Y%m%d).tar.gz ~/.ssh/

SSH 故障排查需要系统性的方法和耐心,通过逐步排除问题根源,可以有效地解决大多数 SSH 连接问题。

标签:SSH