我是不是使用hosts.allow
或hosts.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
如果您已经排除了任何“外部”因素,以下一组步骤通常有助于缩小范围。因此,虽然这不能直接回答您的问题,但它可能有助于追踪错误原因。
故障排除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