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

SSH 常见问题有哪些?如何进行故障排查和解决连接问题?

3月6日 21:32

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:网络诊断

最佳实践

  1. 启用详细日志:便于问题追踪
  2. 定期检查配置:确保配置正确
  3. 监控服务状态:及时发现异常
  4. 备份重要配置:快速恢复
  5. 使用版本控制:管理配置变更
  6. 文档化问题:积累经验
  7. 自动化测试:验证配置
  8. 建立应急预案:快速响应

掌握 SSH 故障排查技能,能够快速定位和解决问题,提高工作效率。

标签:SSH