我该如何修复"kex_exchange_identification: read: Connection reset by peer"的错误?

81
我希望你能在GitLab管道中使用PRIVATE_KEY来使用scp复制数据。
错误信息如下:
kex_exchange_identification: read: Connection reset by peer
Connection reset by x.x.x.x port 22
lost connection

管道日志:
$ mkdir -p ~/.ssh

$ echo "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_rsa

$ chmod 600 ~/.ssh/id_rsa

$ eval "$(ssh-agent -s)"
Agent pid 22

$ ssh-add ~/.ssh/id_rsa
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

$ ssh-keyscan -H $IP >> ~/.ssh/known_hosts
# x.x.x.x:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10
# x.x.x.x:22 SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.10

$ scp -rv api.yml root@$IP:/home/services/test/

Executing: program /usr/bin/ssh host x.x.x.x, user root, command scp -v -r -t /home/services/test/

OpenSSH_8.6p1, OpenSSL 1.1.1l  24 Aug 2021
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Authenticator provider $SSH_SK_PROVIDER did not resolve; disabling
debug1: Connecting to x.x.x.x [x.x.x.x] port 22.
debug1: Connection established.
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa type -1
debug1: identity file /root/.ssh/id_ecdsa-cert type -1
debug1: identity file /root/.ssh/id_ecdsa_sk type -1
debug1: identity file /root/.ssh/id_ecdsa_sk-cert type -1
debug1: identity file /root/.ssh/id_ed25519 type -1
debug1: identity file /root/.ssh/id_ed25519-cert type -1
debug1: identity file /root/.ssh/id_ed25519_sk type -1
debug1: identity file /root/.ssh/id_ed25519_sk-cert type -1
debug1: identity file /root/.ssh/id_xmss type -1
debug1: identity file /root/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.6
kex_exchange_identification: read: Connection reset by peer
Connection reset by x.x.x.x port 22
lost connection

3
当通过ssh连接华芸NAS时,遇到了这个问题。检查 /usr/builtin/etc/ipblock/ipblock.deny 看看是否有任何IP被阻止。我认为这与 /etc/hosts.deny 有些类似。 - dibery
这是一个较新的问题吗(例如,与某些软件的特定版本有关?OpenSSH)?— 来自 Super User(2019)、Unix & Linux(2019)、Super User(2020)、Nixcraft(2021)和 Ask Ubuntu(2022)的一些错误消息。 - Peter Mortensen
那么,是否有一个更早的规范问题?答案没有提供任何版本信息。 - Peter Mortensen
这与GitLab有关吗?所有答案都不具体说明,没有明确指出它是否实际上在GitLab上。 - Peter Mortensen
一次服务器重启解决了我的问题。 - jbrahy
17个回答

62
kex_exchange_identification: read: Connection reset by peer

当SSH客户端连接到SSH服务器时,服务器会向客户端发送版本字符串。您收到的错误意味着在客户端等待来自服务器的数据时,即在TCP连接打开后立即,客户端与服务器之间的TCP连接被“异常关闭”。

从实际情况来看,可能意味着以下两种情况之一:

  1. SSH服务器进程出现故障(崩溃),或者它检测到一些严重问题导致其立即退出。
  2. 某个防火墙正在干扰与ssh服务器的连接。

看起来ssh-keyscan程序能够连接到服务器并获取版本字符串而没有错误。因此,SSH服务器进程显然能够与客户端通信而不会崩溃。

您应该与连接到x.x.x.x主机及其所连接网络的管理员交谈,以查看他们是否可以从他们的角度确定问题。有可能是防火墙或ssh服务器进程本身将多个连接(首先是ssh-keyscan进程,然后是scp程序)视为入侵企图,并阻止第二个连接尝试。


17
你的评论让我在苦苦思索了一个小时后得以解决问题。原来是我连接的 VPN 出了问题,现在一切都正常了。 - silverbackbg
1
谢谢,这正是我的情况。我不得不重新启动服务器,因为它完全锁住了我。不过这确实有帮助。 - LinusGeffarth
2
此外,如果SSH错误是间歇性的,可能是由于防火墙上达到了某个限制规则。降低连接速率可能会使其正常工作。 - laffuste
对我来说,启用VPN就解决了问题。我无法使用非VPN连接连接到SSH。 - undefined

25

我也遇到过同样的问题。我重新启动了服务器,然后问题就解决了。


2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community
1
那是什么类型的服务器?操作系统、版本、版本号等等?远程还是本地?虚拟还是真实硬件? - Peter Mortensen
1
还曾经在一个 LXC 容器上工作过。 - Martin Braun
错误的地址和端口给我造成了这个问题。 - undefined
在我的情况下,不仅仅是SSH连接出现问题,端口80和81也有问题。重新启动解决了这个问题。在遇到问题之前,我是通过另一台远程机器进行连接隧道的。然后我在出现问题的机器上配置了WiFi网络。也许这就是原因,另一个网卡开始工作,另一个IP地址变得可用。 - undefined
显示剩余3条评论

6

TL;DR:
找到服务器端监听 SSH 端口的进程并将其关闭,然后重新启动 ssh 服务。这应该可以解决问题。

在客户端:

ssh account@ip -pPORT

kex_exchange_identification: read: Connection reset by peer

我在服务器端尝试了它:

service ssh status

[ ok ] sshd is running.

service ssh restart

[ ok ] Restarting OpenBSD Secure Shell server: sshd.

但是客户端的ssh命令仍然失败,出现相同的kex_exchange_identification错误。

接着我停止了服务器端的ssh服务(作为root用户):

service ssh stop

[ ok ] Stopping OpenBSD Secure Shell server: sshd.

以下客户端SSH命令仍然出现相同的"kex_exchange_identification"错误。这很奇怪;如果没有进程监听该端口,应该是"Connection refused"错误。
可能是服务器端监听SSH端口的进程已经停止运行,即使重新启动/停止服务也无法解决问题。因此,查找并终止该进程可能会解决问题。
这里的PORT是在"服务器/etc/ssh/sshd_config"中定义的SSH端口,默认为22。以root身份执行:
netstat -ap | grep PORT

tcp 0 0 0.0.0.0:PORT 0.0.0.0:* LISTEN 8359/sshd
tcp6 0 0 [::]:PORT [::]:* LISTEN 8359/sshd

kill 8359
netstat -ap | grep PORT

no result

service ssh start

[ ok ] Starting OpenBSD Secure Shell server: sshd.

netstat -ap | grep PORT

tcp 0 0 0.0.0.0:PORT 0.0.0.0:* LISTEN 31418/sshd: /usr/sb
tcp6 0 0 [::]:PORT [::]:* LISTEN 31418/sshd: /usr/sb

以下客户端 ssh 命令执行成功。

4

在我更改了我的Apple ID密码后,我遇到了这个问题,所以我更新了我的Apple ID并重新启动了我的Mac。现在它可以正常工作。

git pull origin master

输出:

kex_exchange_identification: read: Connection reset by peer
Connection reset by 20.205.243.166 port 22
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

重启确实解决了那个问题。 - leymannx
它是在GitLab上吗?还是其他地方?GitHub? - Peter Mortensen

2
我遇到了同样的问题并已通过以下方式解决:
  1. 检查两台机器上是否运行着sshd。

  2. 检查是否存在任何防火墙规则,这可能会阻止您成功连接。

    iptables -L

  3. 在服务器上使用tcpdump检查使用ssh时接收的数据包:

    tcpdump -i any dst 目标IP和src 源IP和dst端口22

输出将仅显示3个数据包正在共享,并且服务器关闭了连接。

  1. 检查hosts.allow是否仅允许某些主机进行sshd连接并拒绝所有其他主机。

    cat /etc/hosts.allow

输出可能包括: sshd: IP范围子网范围

此外,请检查hosts.deny是否拒绝了某个IP范围进行sshd连接:

cat /etc/hosts.deny

输出可能包括: sshd: ALL

如果第4点是您的原因,则将您尝试进行ssh连接的机器IP添加为服务器机器上允许的主机。 按照以下步骤操作,然后您就可以开始了。


2
我建议检查路由表,这可能是一个原因。在我的情况下,在 Ubuntu 20.04(Focal Fossa)上,当使用SSH连接到服务器时出现相同的错误消息时,我添加了一个本地网络路由条目以进行恢复。它突然消失了,只剩下默认路由。
route -n Kernel IP routing table Destination     Gateway

输出:

Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 enp1s0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 enp1s0  # <= disappeared

似乎第一个SYN已经通过,但ACK似乎被不完整的路由表过滤了。

1

对于那些在将FreeBSD升级到13.1后尝试通过ssh登录时遇到问题的人,请参见 Bug 263489. sshd does not work after reboot to 13.1-RC4

升级后,先前的sshd守护程序(OpenSSH<8.2)仍然以新配置(OpenSSH>=8.2)运行。 解决方案是停止,然后重新启动sshd守护程序。 FreeBSD 13.1发布说明现在提到了这一点,并且在13.1之后,freebsd-update脚本将自动重新启动该守护程序。


1
与Naoki Ogawa类似,我遇到了路由表的问题。在我的情况下,我有一个额外的本地网络路由。
作为root用户:
route

输出:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         RT-AX92U-3E20   0.0.0.0         UG    100    0        0 eno1
link-local      0.0.0.0         255.255.0.0     U     1000   0        0 virbr1
192.168.50.0    RT-AX92U-3E20   255.255.255.0   UG    10     0        0 eno1
192.168.50.0    0.0.0.0         255.255.255.0   U     100    0        0 eno1

我只是在本地网络(192.168.50.0)上删除了网关:
route del 192.168.50.0/24 via 192.168.50.1

问题已得到解决。

1
在CentOS 7.9.2009上创建空目录。
mkdir /var/empty/sshd
chmod 0711 /var/empty/sshd

这对我有帮助。

感谢您对Stack Overflow社区做出贡献的兴趣。这个问题已经有很多答案了,其中包括一个已经得到社区广泛验证的答案。您确定您的方法之前没有提到过吗?如果是这样的话,能否解释一下您的方法与以往的方法有何不同,以及在什么情况下您的方法可能更好,并且为什么您认为之前的答案不够满意。请您友好地修改您的回答并给出解释。 - Jeremy Caney

1

每当我尝试通过SSM或终端连接到我的Amazon Linux 2实例时,我都会遇到相同的问题:

为什么它显示了错误消息:“/etc/hosts.deny”文件指定哪些IP地址不被允许连接到主机。而我已经在/etc/hosts.deny中添加了“ALL:ALL”,它将拒绝所有IP地址连接到实例(服务器)。

解决方案:只需停止实例并编辑用户数据,然后运行命令即可。

sed -i 's/ALL: ALL/#ALL: ALL/g' /etc/hosts.deny

这将注释hosts.deny文件。完成后,启动实例(服务器)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接