0%

ssh命令之ProxyCommand选项

一、背景介绍

有一台机器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
2
3
4
5
6
7
8
9
10
11
12
Host B
HostName %h
User dsl
Port 1046
IdentityFile ~/.ssh/id_dsa

Host C
HostName %h
User dsl
Port 1046
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -W %h:%p B

在A上执行ssh C命令,发现A与C成功建立SSH连接。根据以上所述,此时在A上应该有两个SSH进程,一个对应于“A与B的SSH连接”,另外一个对应于“A与C的SSH连接”。在A上执行ps -ef | grep 'ssh'命令,得到如下结果,得证。

1
2
7851  7689 15:55 S pts/10   ssh C
7852 7851 15:55 S pts/10 ssh -W C:1046 B

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
2
3
4
5
6
Host C
HostName %h
User dsl
Port 1046
IdentityFile ~/.ssh/id_rsa
ProxyCommand nc -X 5 -x B:8989 %h %p

在A上执行ssh C命令,发现A与C成功建立SSH连接。根据以上所述,此时在A上应该有一个NC进程和一个SSH进程,前者对应于“A与B的代理连接”,后者对应于“A与C的SSH连接”。在A上执行ps -ef | grep -e 'ssh' -e 'nc'命令,得到如下结果,得证。

1
2
8816  8089 16:08 S pts/10   ssh C
8817 8816 16:08 S pts/10 nc -X 5 -x B:8989 C 1046

四、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
您的支持将鼓励我继续分享!