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 时,确保:
- 正确设置 SSH 密钥权限
- 添加服务器到 known_hosts
- 避免同时多个连接尝试
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)获取更详细的错误信息。