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调试这个;因此这篇文章。)
在Mac OSX 10.9上使用OpenSSH_6.2p2:
1号航站楼:
nc -l 127.0.0.1 5000
2号航站楼:
ssh test@127.0.0.1 -p 5000
终端1然后输出:
OpenSSH_6.2p2
所以这个较新的客户端在连接时传输了该字符串。
在CentOS 6.3上使用OpenSSH_5.3p1:
终端1和2命令与上面完全相同。
但是终端1没有输出任何东西。 看起来这个老客户端在连接时没有发送任何内容。
TCP连接本身可以正常工作。这似乎是一种协议差异。但这些都显然是使用SSH"版本2"协议
这两台机器似乎能够毫无困难地相互通信。然而,我的隧道发生了一些奇怪的事情,我试图了解协议正在寻找什么,所以我可以调试。
有谁知道这里发生了什么?或者也许知道哪一方有简单的1,2,3类型解释,哪一方发送了该协议的内容以及有关版本差异的任何信息?
答案 0 :(得分:1)
这里介绍:https://tools.ietf.org/html/rfc4253#section-4.2
客户端和服务器都应该在连接时发送它们的版本字符串。然而,似乎在早期版本中,客户端在发送它的字符串之前正在等待服务器 - 这看起来像技术上的一个实现细节错误(可能在SSH 6.x中修复)但通常不会在实践中产生问题
如果有人有兴趣,这就是我想要解决的问题:https://github.com/bradleypeabody/proxyman/blob/master/README.md