什么原因导致 SSH 错误:kex_exchange_identification:远程主机关闭连接?

什么原因导致 SSH 错误:kex_exchange_identification:远程主机关闭连接?

我在网上设置了一个任何人都可以公开访问的 SSH 服务器。因此,我收到了很多来自世界各地的 IP 的连接。奇怪的是,没有人真正尝试进行身份验证来打开会话。我自己可以毫无问题地进行连接和身份验证。

有时,我会error: kex_exchange_identification: Connection closed by remote host在服务器日志中看到该信息。这是什么原因造成的?

以下是 30 分钟的 SSH 日志(公共 IP 已被删除):

# journalctl SYSLOG_IDENTIFIER=sshd -S "03:30:00" -U "04:00:00"
-- Logs begin at Fri 2020-01-31 09:26:25 UTC, end at Mon 2020-04-20 08:01:15 UTC. --
Apr 20 03:39:48 myhostname sshd[18438]: Connection from x.x.x.207 port 39332 on 10.0.0.11 port 22 rdomain ""
Apr 20 03:39:48 myhostname sshd[18439]: Connection from x.x.x.207 port 39334 on 10.0.0.11 port 22 rdomain ""
Apr 20 03:39:48 myhostname sshd[18438]: Connection closed by x.x.x.207 port 39332 [preauth]
Apr 20 03:39:48 myhostname sshd[18439]: Connection closed by x.x.x.207 port 39334 [preauth]
Apr 20 03:59:36 myhostname sshd[22186]: Connection from x.x.x.83 port 34876 on 10.0.0.11 port 22 rdomain ""
Apr 20 03:59:36 myhostname sshd[22186]: error: kex_exchange_identification: Connection closed by remote host

以下是我的 SSH 配置:

# ssh -V
OpenSSH_8.2p1, OpenSSL 1.1.1d  10 Sep 2019
# cat /etc/ssh/sshd_config 
UsePAM yes
AddressFamily any
Port 22
X11Forwarding no
PermitRootLogin prohibit-password
GatewayPorts no
PasswordAuthentication no
ChallengeResponseAuthentication no
PrintMotd no # handled by pam_motd
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 /etc/ssh/authorized_keys.d/%u
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
KexAlgorithms [email protected],diffie-hellman-group-exchange-sha256
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
MACs [email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
LogLevel VERBOSE
UseDNS no
AllowUsers root
AuthenticationMethods publickey
MaxStartups 3:100:60

在搜索网络后,我看到一些参考资料MaxStartups表明这可能是导致此错误的原因,但在更改默认值(如我所示)sshd_config并尝试超过 3 次连接后,服务器明确地指示问题

Apr 20 07:26:59 myhostname sshd[31468]: drop connection #3 from [x.x.x.226]:54986 on [10.0.0.11]:22 past MaxStartups

那么,是什么原因造成的呢error: kex_exchange_identification: Connection closed by remote host

答案1

奇怪的是,没有人真正尝试进行身份验证来打开会话。

一些蜘蛛和服务初段扫描公共 ipv4 地址以查找开放服务,例如 salt master、ftp 服务器、RDP 以及 SSH 服务。这些蜘蛛通常只连接到服务而不执行任何有效的身份验证步骤。

kex_exchange_identification我在服务器日志中收到错误:远程主机关闭连接。这是什么原因造成的?

我还没有找到关于此问题的确凿答案,所以...是时候浏览源代码了。

在 OpenSSH 源代码中,kex_exchange_identification是交换服务器和客户端标识的函数(呃),以及指定错误如果 OpenSSH 服务器和客户端之间的套接字连接中断,则会发生这种情况(EPIPE),即客户端已经关闭其连接。

答案2

我刚刚遇到了这个确切的问题,原因是我在负载均衡器内部进行了端口转换,这意味着我的ssh连接到达了端口80而不是端口上的主机22

主机他们正确地终止了连接,返回到我的终端的错误消息如下;

~/Documents/Projects$ ssh -vvvvA [email protected]
OpenSSH_8.1p1, LibreSSL 2.7.3
debug1: Reading configuration data /Users/dave/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 47: Applying options for *
debug2: resolve_canonicalize: hostname xx.xx.xx.250 is address
debug2: ssh_connect_direct
debug1: Connecting to xx.xx.xx.250 [xx.xx.xx.250] port 22.
debug1: Connection established.
debug1: identity file /Users/dave/.ssh/id_rsa type 0
debug1: identity file /Users/dave/.ssh/id_rsa-cert type -1
debug1: identity file /Users/dave/.ssh/id_dsa type -1
debug1: identity file /Users/dave/.ssh/id_dsa-cert type -1
debug1: identity file /Users/dave/.ssh/id_ecdsa type -1
debug1: identity file /Users/dave/.ssh/id_ecdsa-cert type -1
debug1: identity file /Users/dave/.ssh/id_ed25519 type -1
debug1: identity file /Users/dave/.ssh/id_ed25519-cert type -1
debug1: identity file /Users/dave/.ssh/id_xmss type -1
debug1: identity file /Users/dave/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.1
debug1: kex_exchange_identification: banner line 0: HTTP/1.1 400 Bad Request
debug1: kex_exchange_identification: banner line 1: Server: nginx/1.14.0 (Ubuntu)
debug1: kex_exchange_identification: banner line 2: Date: Fri, 20 Nov 2020 09:30:23 GMT
debug1: kex_exchange_identification: banner line 3: Content-Type: text/html
debug1: kex_exchange_identification: banner line 4: Content-Length: 182
debug1: kex_exchange_identification: banner line 5: Connection: close
debug1: kex_exchange_identification: banner line 6:
debug1: kex_exchange_identification: banner line 7: <html>
debug1: kex_exchange_identification: banner line 8: <head><title>400 Bad Request</title></head>
debug1: kex_exchange_identification: banner line 9: <body bgcolor="white">
debug1: kex_exchange_identification: banner line 10: <center><h1>400 Bad Request</h1></center>
debug1: kex_exchange_identification: banner line 11: <hr><center>nginx/1.14.0 (Ubuntu)</center>
debug1: kex_exchange_identification: banner line 12: </body>
debug1: kex_exchange_identification: banner line 13: </html>
kex_exchange_identification: Connection closed by remote host

已修复内部端口转换,现在问题已消失。

答案3

当我注意到我尝试使用服务器 IP 进行连接而我本应该使用私有 IP 时,我解决了“kex_exchange_identification:远程主机关闭连接”的问题。

我的设置可能与你们所有人都相差甚远,只是想传递我自己的发现。

编辑

在某些托管服务提供商处,您将拥有两个 IP,一个是公共 IP,一个是私有 IP,在这种情况下您应该使用私有 IP。

你要么知道,要么不知道,我知道这并不适用于所有人,这就是为什么我说它可能是一个不同的设置。

在我使用私钥之前,其他答案都对我不起作用。

答案4

就我而言,openssh-server 的更新似乎改变了默认设置。明确指定PermitRootLogin即可/etc/ssh/sshd_config解决此问题。

回答最初的问题,以 root 身份登录而没有密钥(使用密码)可能会在您的配置中产生此错误。

相关内容