SSH 故障排查是系统管理员和开发人员必备的技能。当 SSH 连接出现问题时,需要系统地诊断和解决各种连接、认证和配置问题。
常见连接问题
1. 连接超时
症状:
shellssh: 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. 连接被拒绝
症状:
shellssh: 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. 密码认证失败
症状:
shelluser@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. 公钥认证失败
症状:
shellPermission 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. 配置文件错误
症状:
shellBad 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 连接问题。