SSH 故障排查是运维工程师必备的技能。掌握常见的 SSH 连接问题和解决方法,能够快速定位和解决问题。
常见连接问题
1. 连接超时
症状:连接请求长时间无响应
可能原因:
- 网络不通
- 防火墙阻止
- SSH 服务未运行
- 端口配置错误
排查步骤:
bash# 1. 测试网络连通性 ping server.example.com # 2. 测试端口是否开放 telnet server.example.com 22 # 或使用 nc nc -zv server.example.com 22 # 3. 检查本地防火墙 sudo iptables -L -n | grep 22 # 4. 检查服务器防火墙 ssh user@server "sudo iptables -L -n | grep 22" # 5. 检查 SSH 服务状态 ssh user@server "systemctl status sshd" # 或 ssh user@server "service ssh status"
解决方案:
bash# 修改端口配置 # /etc/ssh/sshd_config Port 2222 # 重启 SSH 服务 systemctl restart sshd # 配置防火墙规则 sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
2. 认证失败
症状:提示 "Permission denied (publickey,password)"
可能原因:
- 密钥不匹配
- 密钥权限错误
- 服务器配置问题
- 用户名错误
排查步骤:
bash# 1. 详细调试信息 ssh -vvv user@server # 2. 检查本地密钥 ls -l ~/.ssh/ cat ~/.ssh/id_rsa.pub # 3. 检查服务器授权密钥 ssh user@server "cat ~/.ssh/authorized_keys" # 4. 检查密钥权限 ssh user@server "ls -l ~/.ssh/" # 5. 测试密钥认证 ssh -i ~/.ssh/id_rsa user@server
解决方案:
bash# 修复本地密钥权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub # 修复服务器权限 ssh user@server "chmod 700 ~/.ssh" ssh user@server "chmod 600 ~/.ssh/authorized_keys" # 重新添加公钥 ssh-copy-id -i ~/.ssh/id_rsa.pub user@server # 检查服务器配置 ssh user@server "grep -i pubkey /etc/ssh/sshd_config"
3. 主机密钥验证失败
症状:提示 "WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!"
可能原因:
- 服务器重新安装
- IP 地址被重用
- 中间人攻击
排查步骤:
bash# 1. 查看主机密钥 ssh-keygen -l -f ~/.ssh/known_hosts # 2. 查看服务器主机密钥 ssh-keyscan -H server.example.com # 3. 比对密钥指纹 ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
解决方案:
bash# 删除旧的主机密钥 ssh-keygen -R server.example.com # 或手动编辑 known_hosts vim ~/.ssh/known_hosts # 重新连接并接受新密钥 ssh user@server
4. 连接断开
症状:连接在使用过程中突然断开
可能原因:
- 网络不稳定
- 防火墙超时
- 服务器资源限制
- Keep-alive 配置问题
排查步骤:
bash# 1. 检查网络稳定性 ping -i 1 server.example.com # 2. 检查服务器日志 ssh user@server "tail -f /var/log/auth.log" # 3. 检查系统资源 ssh user@server "free -h" ssh user@server "df -h"
解决方案:
bash# 客户端配置 # ~/.ssh/config Host * ServerAliveInterval 60 ServerAliveCountMax 3 # 服务器端配置 # /etc/ssh/sshd_config ClientAliveInterval 300 ClientAliveCountMax 3 # 使用 autossh 保持连接 autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" user@server
高级故障排查
1. 使用详细日志
bash# 客户端详细日志 ssh -vvv user@server # 服务器端详细日志 # /etc/ssh/sshd_config LogLevel VERBOSE # 查看日志 tail -f /var/log/auth.log
2. 测试特定配置
bash# 测试配置文件语法 sshd -t # 查看有效配置 sshd -T | grep -i password # 测试特定选项 ssh -o PreferredAuthentications=publickey user@server
3. 网络层诊断
bash# 跟踪路由 traceroute server.example.com # 检查 DNS 解析 nslookup server.example.com dig server.example.com # 检查 MTU ping -M do -s 1472 server.example.com
4. 性能分析
bash# 测量连接时间 time ssh user@server "echo 'test'" # 分析网络延迟 ping -c 10 server.example.com # 检查带宽 iperf3 -c server.example.com
常用排查命令
连接测试
bash# 基本连接测试 ssh user@server # 指定端口测试 ssh -p 2222 user@server # 使用特定密钥测试 ssh -i ~/.ssh/custom_key user@server # 禁用特定认证方法测试 ssh -o PreferredAuthentications=password user@server
状态检查
bash# 检查 SSH 服务状态 systemctl status sshd service ssh status # 检查监听端口 netstat -tuln | grep :22 ss -tuln | grep :22 # 检查进程 ps aux | grep sshd
日志分析
bash# 查看认证日志 tail -f /var/log/auth.log tail -f /var/log/secure # 查看失败登录 lastb -n 20 # 查看成功登录 last -n 20 # 搜索错误信息 grep "sshd" /var/log/auth.log | grep -i error
故障排查流程图
shell连接失败 ↓ 测试网络连通性 (ping) ↓ 测试端口开放 (telnet/nc) ↓ 检查 SSH 服务状态 ↓ 检查防火墙规则 ↓ 详细调试 (ssh -vvv) ↓ 检查认证配置 ↓ 检查密钥权限 ↓ 检查服务器日志 ↓ 解决问题
预防措施
1. 配置监控
bash# 监控 SSH 服务 systemctl enable sshd # 监控日志 tail -f /var/log/auth.log | grep sshd # 设置告警 # 使用 fail2ban 自动封禁
2. 定期维护
bash# 定期更新 SSH apt-get update && apt-get upgrade openssh-server # 定期检查配置 sshd -t # 定期清理日志 logrotate /etc/logrotate.d/ssh
3. 备份配置
bash# 备份配置文件 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 备份密钥 cp -r ~/.ssh ~/.ssh.bak # 备份已知主机 cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
工具推荐
1. 诊断工具
- ssh-keyscan:获取主机密钥
- ssh-keygen:密钥管理
- autossh:自动重连
- mosh:移动 SSH 客户端
2. 监控工具
- fail2ban:防止暴力破解
- logwatch:日志分析
- nagios:服务监控
- zabbix:综合监控
3. 网络工具
- tcpdump:抓包分析
- wireshark:网络分析
- nmap:端口扫描
- mtr:网络诊断
最佳实践
- 启用详细日志:便于问题追踪
- 定期检查配置:确保配置正确
- 监控服务状态:及时发现异常
- 备份重要配置:快速恢复
- 使用版本控制:管理配置变更
- 文档化问题:积累经验
- 自动化测试:验证配置
- 建立应急预案:快速响应
掌握 SSH 故障排查技能,能够快速定位和解决问题,提高工作效率。