为什么 OpenSSH 6.x 客户端在连接时发送字符串而 5.x 却不发送?

为什么 OpenSSH 6.x 客户端在连接时发送字符串而 5.x 却不发送?

TL;DR:为什么 OpenSSH 6.x 的 ssh 客户端在连接时立即发送字符串“OpenSSH_6.2p2”,而 OpenSSH 5.x 客户端却不发送任何内容?


我正在尝试通过 HTTP/S 代理使 ssh 隧道正常工作。我可以使用 http CONNECT 请求获得正确隧道化的 TCP 连接。它可以在我的 Mac OSX 10.9 上的 SSH 客户端上正常工作,但无法在运行旧 OSX 的旧 Mac 上正常工作。

这导致了以下奇怪的现象,我无法解释。(对于熟悉 SSH 协议的人来说,这可能是一个愚蠢的问题,但经过一番搜索后,我找不到该协议应该是什么样子的简单解释,并且希望不必阅读整个 RFC 来调试这个问题;因此写了这篇文章。)


在带有 OpenSSH_6.2p2 的 Mac OSX 10.9 上:

1号航站楼:

nc -l 127.0.0.1 5000

2 号航站楼:

ssh [email protected] -p 5000

然后终端 1 输出:

OpenSSH_6.2p2

所以这个较新的客户端在连接时传输了该字符串。


在带有 OpenSSH_5.3p1 的 CentOS 6.3 上:

终端1和2的命令与上面完全相同。

但终端1没有输出任何东西。 看起来这个老客户端在连接时没有发送任何东西。


据我所知,TCP 连接本身工作正常。这似乎是协议差异。但显然它们都使用 SSH“版本 2”协议。

这两台机器似乎能够毫无问题地通过 SSH 互相连接。但是我的隧道出现了一些奇怪的情况,我正在尝试了解协议正在寻找什么,以便进行调试。

有人明白这里发生了什么吗?或者知道哪里有一个简单的 1,2,3 类型的解释,说明哪一方针对此协议发送了什么,以及有关版本差异的任何信息?

答案1

这里介绍一下:https://www.rfc-editor.org/rfc/rfc4253#section-4.2

客户端和服务器都应该在连接时发送其版本字符串。然而,在早期版本中,客户端似乎在等待服务器发送其字符串之前 - 这似乎是一个实现细节,从技术上讲是一个错误(可能在 SSH 6.x 中已修复),但在实践中通常不会造成问题。

如果有人感兴趣的话,这就是我试图解决的问题:https://github.com/bradleypeabody/proxyman/blob/master/README.md

相关内容