一、简介
OpenSSH
的客户端有一个 ProxyCommand
的选项,用于 SSH 客户端
与服务器
之间的隧道通信(tunneling)
。所谓的隧道技术,也称代理技术,是网络通信技术的一个普遍概念,就是把一条信道建立于另外一条信道之上。
SSH
会话基于一个 TCP
连接,如果我们把连接的两个端口各自的出口(也即入口)进行截获,就可以用其它的信道来传输。而且 SSH
仍然认为它用的是和另一端连接一条 TCP
连接。
ProxyCommand
指定一个命令(称为 Proxy
),SSH
客户端将通过标准输入输出和这个命令启动后的进程进行正常的 SSH
通信,而 Proxy
连接着 SSH
服务器(一般是一个 Server Proxy
,再由该 Server Proxy
连接服务器)。Proxy
和 Server Proxy
之间组成了一条隧道,如果两者之间用 HTTP
协议进行通信,则整个系统便称为tunneling SSH over HTTP
,当然也可以使用 UDP
、TCP
、IP
以及其它任意的可行的协议。
SSH ProxyCommand
相对于 SOCKS
、HTTP
或者其它的Proxy
技术来说更简单。因为它工作在进程间的文件 IO
通信,用任何支持 socket
的编程语言,都能轻易地编写出一个可用的 Proxy,复杂度只落在隧道本身。想一想,如果没有 ProxyCommand
,你需要改变或侵入操作系统的 TCP 子系统
才能实现 SSH 隧道
。ProxyCommand
提供了方便应用隧道的接口,网络程序都应该提供这样的接口,而不是完全依赖于 socket。
因为一个会话就会启动一个 ProxyCommand 进程,所以只有在会话依赖于连接的协议上才能使用这种技术。
二、实践
环境说明
- 远程服务器的IP地址为
180.0.0.1
,代号为X
; - 另一个远程服务器的IP为
180.0.0.2
,代号为Y
; - 目前本机的IP地址为
10.0.0.1
,代号为A
,本地可以利用SSH客户端通过密钥或密码连接X
和Y
;
这里实际使用的为全部使用密钥的方式进行访问,暂时X
与Y
之间无法通过密钥进行访问。
2.1、通过ssh原生支持的指令实现
A
本地的~/.ssh/config
的配置文件信息如下,通过X连接到Y;
Host X |
原理分析:
- 本地
A
机器通过ProxyCommand
先与X
建立一个SSH
连接,并把这个连接当作一个代理使用; X
在与Y
建立SSH
连接,使用的认证方式为A
的认证密钥,因此不需要将认证密钥存放在X
端;A
与Y
就建立了一个间接的SSH
连接;
困惑:
目前遇到一个现象,当我们通过X
连接到Y
之后,在将X
上的sshd
杀掉之后,发现在A
上与Y
建立的连接依旧保持通畅,但是再次新建通过X
访问Y
的链接无法成功建立,怀疑这与sshd的机制有关系,是否会保持已有的会话连接?后续继续分析一下,此处保留困惑。
2.2、借助nc来实现
一些说明:
-W
:该参数在OpenSSH 5.4
及之后的版本才支持,参考官方的Release信息;
在使用-W
之前,通常都是使用nc
选项,nc
允许你转发TCP/UDP
数据包到指定(备用)位置并且基本上与ssh -W
相同;
待补充!!!