ssh_exchange_identification:连接被远程主机关闭(不使用hosts.deny)

ssh_exchange_identification:连接被远程主机关闭(不使用hosts.deny)

我是不是使用hosts.allowhosts.deny,此外,SSH 可在我的 Windows 计算机(同一台笔记本电脑,不同的硬盘驱动器)上运行,但不能在我的 Linux 计算机上运行。

ssh -vvv root@host -p port给出:

OpenSSH_6.6, OpenSSL 1.0.1f 6 Jan 2014
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 20: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to host [host] port <port>.
debug1: Connection established.
debug1: identity file /home/torxed/.ssh/id_dsa type -1
debug1: identity file /home/torxed/.ssh/id_dsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.6
ssh_exchange_identification: read: Connection reset by peer

在Windows机器上,一切正常,所以我检查了安全日志,其中的行是相同的,服务器对待两台不同的“机器”没有什么不同,并且它们都通过公钥身份验证被允许。

因此得出的结论是,这一定是我本地 ArchLinux 笔记本电脑的问题……但是什么呢?

[torxed@archie ~]$ cat .ssh/known_hosts 
[torxed@archie ~]$ 

所以这不是问题...

[torxed@archie ~]$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

与防火墙设置没有冲突(目前)。

[torxed@archie ~]$ ls -la .ssh/
total 20
drwx------  2 torxed users 4096 Sep  3  2013 .
drwx------ 51 torxed users 4096 May 11 11:11 ..
-rw-------  1 torxed users 1679 Sep  3  2013 id_rsa
-rw-r--r--  1 torxed users  403 Sep  3  2013 id_rsa.pub
-rw-r--r--  1 torxed users  170 May 11 11:21 known_hosts

权限似乎很好(在服务器上相同)。也尝试在不进行配置的情况下获得/etc/ssh/ssh_config相同的结果,除了客户端中进行的大量自动配置最终会出现相同的错误。

答案1

最初发布于 Ask Ubuntu

如果您已经排除了任何“外部”因素,以下一组步骤通常有助于缩小范围。因此,虽然这不能直接回答您的问题,但它可能有助于追踪错误原因。

故障排除sshd

我发现在任何此类情况下通常非常有用的是启动sshd而不让它守护进程。我的问题是,既没有syslog也没有auth.log表现出任何有意义的东西。

当我从终端启动它时,我得到:

# $(which sshd) -Ddp 10222
/etc/ssh/sshd_config line 8: address family must be specified before ListenAddress.

好多了!此错误消息使我能够看到问题所在并修复它。两个日志文件都不包含此输出。

注意:至少在 Ubuntu 上这是满足绝对路径要求的$(which sshd)最佳方法。sshd否则你会得到以下错误:sshd re-exec requires execution with an absolute path。使-p 10222监听sshd该替代端口,覆盖配置文件 - 这样它就不会与潜在运行的sshd实例发生冲突。确保在这里选择一个自由端口。

最后:连接到备用端口 ( ssh -p 10222 user@server)。

这种方法多次帮助我发现问题,无论是身份验证问题还是其他类型的问题。要获得真正详细的输出stdout,请使用$(which sshd) -Ddddp 10222(注意添加dd以增加详细程度)。如需更多调试良好性检查man sshd


这种方法的主要优点是它允许您检查sshd配置没有必须sshd在默认端口上重新启动。通常情况下这不应该干扰现有的 SSH 连接,但我已经看到了。因此,这允许人们在(可能)切断对远程服务器的访问之前验证配置文件(例如,我对某些 VPS 甚至物理服务器都进行了验证,我需要支付额外费用才能获得带外访问)到机器)。

答案2

您还可能拥有一台内存严重碎片化的主机,以至于无法分配连续内存的页面来分叉托管 SSH 会话的进程。

在这种情况下,您可以收到以下消息之一:

ssh_exchange_identification: read: Connection reset by peer

或者:

Connection closed by aaa.bbb.ccc.ddd

取决于主机在跳出之前能走多远。

如果内存碎片是明显的原因,解决方案是通过其他方式访问服务器并重新启动一些相关服务。我发现 Apache 和 MySQL 是虚拟机上的罪魁祸首,因为虚拟机没有交换分区。如果失败,请重新启动主机。

答案3

以防万一,因为这发生在我身上。确保您的主机中正在运行 sshd!

这是一个愚蠢的失败,但可能确实是你的问题。

答案4

ssh_exchange_identification: read: Connection reset by peer我在一个循环启动 16 个或更多 ssh 会话的脚本中遇到了这个问题。 sshd 显然跟不上;添加短暂的睡眠(显然是解决方法... :D 反对者)解决了我的问题:

for i in $(seq 32)
do
    ssh -f root@$HOST "./test_server -p $(expr $BASE_PORT + $i)" > svr${i}.out
    # for > 8 connections, ssh has ssh_exchange_identification issues
    sleep 0.1
done

相关内容