一、背景介绍
有一台机器A,欲与机器C建立SSH连接,但由于隔离限制(比如“存在防火墙”)该SSH连接不能直接建立。
ssh命令的“ProxyCommand”选项被设计用来解决以上问题。
二、含义
通过“ProxyCommand”选项,机器A能够灵活使用任意代理机制与机器C上的SSH Server端口建立连接,接着机器A上的SSH Client再与该连接进行数据交互,从而机器A上的SSH Client与机器C上的SSH Server之间建立了与一般“直接SSH连接”不太一样的“间接SSH连接”。不过由于“间接SSH连接”的透明性,逻辑上可认为机器A上的SSH Client与机器C上的SSH Server建立了“直接SSH连接”。
“直接SSH连接”示意图如图1,“间接SSH连接”示意图如图2。
图1
图2
常使用代理机制有两种,接下来进行介绍。
三、常使用代理机制
3.1、常使用代理机制1
“ProxyCommand”选项值形式为“ssh -W C:CPort -l USER -i PRIVATE_KEY -p BPort B”,原理:ssh命令自提供的代理机制,在机器A上另外单独建立与B的SSH连接(使用“-l USER -i PRIVATE_KEY -p BPort B”这些参数),该SSH连接的B端侧与机器C上的SSH Server端口(即“C:CPort”)建立连接,该SSH连接的A端侧与机器A上的SSH Client(即“最终欲建立‘间接SSH连接’在机器A上的SSH Client”)建立连接。
假定A上ssh_config配置文件内容如下:
1 | Host B |
在A上执行ssh C
命令,发现A与C成功建立SSH连接。根据以上所述,此时在A上应该有两个SSH进程,一个对应于“A与B的SSH连接”,另外一个对应于“A与C的SSH连接”。在A上执行ps -ef | grep 'ssh'
命令,得到如下结果,得证。
1 | 7851 7689 15:55 S pts/10 ssh C |
3.2、常使用代理机制2
“ProxyCommand”选项值形式为“nc -X 5 -x B:BPort C CPort”,原理:利用“nc”命令,在机器A上使用“nc”命令与代理服务器(即“-x B:BPort”,通过“-X 5”参数来指定与代理服务器的通信协议为“SOCKS4/SOCKS5/HTTPS”)建立代理连接,该代理连接的B端侧与机器C上的SSH Server端口(即“C CPort”)建立连接,该代理连接的A端侧与机器A上的SSH Client(即“最终欲建立‘间接SSH连接’在机器A上的SSH Client”)建立连接。
假定A上ssh_config配置文件内容如下:
1 | Host C |
在A上执行ssh C
命令,发现A与C成功建立SSH连接。根据以上所述,此时在A上应该有一个NC进程和一个SSH进程,前者对应于“A与B的代理连接”,后者对应于“A与C的SSH连接”。在A上执行ps -ef | grep -e 'ssh' -e 'nc'
命令,得到如下结果,得证。
1 | 8816 8089 16:08 S pts/10 ssh C |
四、ssh命令“端口转发”和“ProxyCommand”选项之间的关系
端口转发包括:本地转发,远端转发和动态转发。其中“本地转发”和“远端转发”属于“静态转发”(因为转发目标端口是固定的)。
“ProxyCommand”选项能够使用基于“动态转发”的代理机制(在外面封装“nc”命令层),而不能使用基于“静态转发”的代理机制。
参考文献: [1]man ssh_config [2]man ssh [3]https://serverfault.com/questions/337120/ssh-via-3rd-machine [4]https://www.lainme.com/doku.php/blog/2011/01/%E9%80%8F%E8%BF%87%E4%BB%A3%E7%90%86%E8%BF%9E%E6%8E%A5ssh [5]http://stackoverflow.com/questions/22635613/what-is-the-difference-between-ssh-proxycommand-w-nc-exec-nc