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

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

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

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

环境说明

 远程服务器的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;

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 服务器

ssh test

附注:

-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

文章来源:

Author:白菜
link:https://blog.baicai.me/article/2023/ssh_proxycommand/