SSH使用ProxyCommand通过代理服务器远程连接其他服务器

OpenSSH 的客户端有一个 ProxyCommand 的选项，用于 SSH 客户端与服务器之间的隧道通信 (tunneling)。所谓的隧道技术，也称代理技术，是网络通信技术的一个普遍概念，就是把一条信道建立于另外一条信道之上。

SSH 会话基于一个 TCP 连接，如果我们把连接的两个端口各自的出口（也即入口）进行截获，就可以用其它的信道来传输。而且 SSH 仍然认为它用的是和另一端连接一条 TCP 连接。

ProxyCommand 指定一个命令（称为 Proxy），SSH 客户端将通过标准输入输出和这个命令启动后的进程进行正常的 SSH 通信，而 Proxy 连接着 SSH 服务器（一般是一个 Server Proxy，再由该 Server Proxy 连接服务器）。

环境说明

Copy
远程服务器的IP地址为 0.0.0.1，代号为X；
另一个远程服务器的IP为 0.0.0.2，代号为Y；
目前本机的IP地址为 0.0.0.3，代号为A，本地可以利用SSH客户端通过密钥或密码连接X和Y；

这里全部使用密钥的方式进行访问，本机 A 与 Y 之间无法进行访问。

本地的
～/.ssh/config
的配置文件信息如下，通过 X 连接到 Y；

Copy
Host X
HostName 0.0.0.1
User root
Port 22
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_1
Host Y
HostName 0.0.0.2
User root
Port 22
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_2
Host test
HostName 0.0.0.2
User root
Port 22
IdentityFile ~/.ssh/id_rsa_2
ProxyCommand ssh X -W %h:%p

测试本机通过 X 连接到 Y 服务器

Copy
ssh test

附注：

Copy
-W host:port
Requests that standard input and output on the client be forwarded to host on port over the secure channel. Implies -N, -T, ExitOnForwardFailure and
ClearAllForwardings, though these can be overridden in the configuration file or using -o command line options.

-W：该参数在OpenSSH 5.4及之后的版本才支持，参考官方的Release信息；
在使用-W之前，通常都是使用nc选项，nc允许你转发TCP/UDP数据包到指定（备用）位置并且基本上与ssh -W相同；

参考：
openssh