Skip to content

SSH连接错误 "kex_exchange_identification: read: Connection reset by peer" 解决方案

问题概述

当使用 SSH 或 SCP 连接远程服务器时,可能会遇到以下错误:

none
kex_exchange_identification: read: Connection reset by peer
Connection reset by x.x.x.x port 22
lost connection

此错误发生在 SSH 密钥交换阶段,表明 TCP 连接在建立后立即被异常关闭。以下是导致此问题的常见原因及解决方法。

常见原因与解决方案

1. 服务器端 SSH 服务问题

WARNING

如果服务器端 SSH 进程异常,即使服务显示运行中,实际可能无法正常处理连接。

解决方法:

bash
# 检查 SSH 服务状态
sudo systemctl status sshd

# 彻底重启 SSH 服务
sudo systemctl restart sshd

# 如果仍无效,查找并杀死相关进程后重启
sudo netstat -ap | grep :22
sudo kill <PID>  # 替换为实际的进程ID
sudo systemctl start sshd

2. 防火墙或网络配置问题

检查项目:

  • 服务器防火墙设置(iptables/ufw)
  • 路由表配置
  • 网络接口状态

解决方法:

bash
# 检查防火墙规则
sudo iptables -L

# 检查路由表
route -n

# 如果有异常的路由条目,删除它们
sudo route del 192.168.50.0/24 via 192.168.50.1

3. 主机访问控制限制

DANGER

错误配置 hosts.allow 和 hosts.deny 文件会导致连接被拒绝

检查方法:

bash
# 检查访问控制配置
cat /etc/hosts.allow
cat /etc/hosts.deny

解决方法:

  • 确保 /etc/hosts.allow 包含允许的IP范围:sshd: 你的IP或网段
  • 注释掉 /etc/hosts.deny 中的 ALL: ALL 规则
  • 或者使用命令临时修复:sudo sed -i 's/ALL: ALL/#ALL: ALL/g' /etc/hosts.deny

4. SSH 配置问题

可能原因:

  • 版本不兼容
  • 配置错误
  • 密钥文件权限问题

解决方法:

bash
# 检查 SSH 配置
sudo sshd -t

# 修复密钥文件权限
chmod 600 ~/.ssh/id_rsa
chmod 644 ~/.ssh/known_hosts

# 检查目录权限(CentOS 特定)
mkdir /var/empty/sshd
chmod 0711 /var/empty/sshd

5. 网络连接冲突

可能场景:

  • 同时有线和无线连接使用相同IP
  • 代理设置冲突
  • DNS 解析问题

解决方法:

  • 禁用不必要的网络连接
  • 检查并更新 DNS 设置(如改用 8.8.8.8 和 8.8.4.4)
  • 检查代理设置

诊断步骤

当遇到此错误时,建议按照以下步骤排查:

bash
# 详细模式查看连接过程
ssh -vvv user@server

# 测试端口连通性
telnet server 22
bash
# 查看认证日志
tail -f /var/log/auth.log

# 监控 SSH 连接
sudo tcpdump -i any dst 目标IP and src 源IP and dst port 22

特殊情况处理

GitLab CI/CD 管道中的问题

在 GitLab 管道中使用 SSH 时,确保:

  1. 正确设置 SSH 密钥权限
  2. 添加服务器到 known_hosts
  3. 避免同时多个连接尝试
bash
# GitLab CI 示例配置
before_script:
  - mkdir -p ~/.ssh
  - echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - eval "$(ssh-agent -s)"
  - ssh-add ~/.ssh/id_rsa
  - ssh-keyscan -H $SERVER_IP >> ~/.ssh/known_hosts

系统升级后的兼容性问题

升级 OpenSSH 后可能需要重启服务:

bash
# Arch Linux 等系统升级后
sudo systemctl restart sshd

总结

"kex_exchange_identification: read: Connection reset by peer" 错误通常由服务器端问题引起,包括 SSH 服务异常、防火墙配置、访问控制限制或网络问题。通过系统性的排查,大多数情况下可以快速定位并解决此问题。

TIP

如果以上方法均无效,建议查看服务器系统日志(/var/log/auth.log 或 /var/log/secure)获取更详细的错误信息。