ssh的高级用法 - ProxyCommand

一、简介

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

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

ProxyCommand 指定一个命令(称为Proxy),SSH 客户端将通过标准输入输出和这个命令启动后的进程进行正常的 SSH 通信,而 Proxy 连接着SSH 服务器(一般是一个 Server Proxy,再由该 Server Proxy 连接服务器)。ProxyServer Proxy 之间组成了一条隧道,如果两者之间用 HTTP 协议进行通信,则整个系统便称为tunneling SSH over HTTP,当然也可以使用 UDPTCPIP 以及其它任意的可行的协议。

SSH ProxyCommand 相对于 SOCKSHTTP 或者其它的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客户端通过密钥或密码连接XY

这里实际使用的为全部使用密钥的方式进行访问,暂时XY之间无法通过密钥进行访问。

2.1、通过ssh原生支持的指令实现

A本地的~/.ssh/config的配置文件信息如下,通过X连接到Y;

Host X
HostName 180.0.0.1
User bugwz
Port 18001
PreferredAuthentications publickey
IdentityFile ~/.ssh/bugwz_181
Host Y
HostName 180.0.0.2
User bugwz
Port 18002
PreferredAuthentications publickey
IdentityFile ~/.ssh/bugwz_182
Host test
HostName 180.0.0.2
User bugwz
Port 18002
IdentityFile ~/.ssh/bugwz_182
ProxyCommand ssh X -W %h:%p

原理分析:

  • 本地A机器通过ProxyCommand先与X建立一个SSH连接,并把这个连接当作一个代理使用;
  • X在与Y建立SSH连接,使用的认证方式为A的认证密钥,因此不需要将认证密钥存放在X端;
  • AY就建立了一个间接的SSH连接;

困惑:

目前遇到一个现象,当我们通过X连接到Y之后,在将X上的sshd杀掉之后,发现在A上与Y建立的连接依旧保持通畅,但是再次新建通过X访问Y的链接无法成功建立,怀疑这与sshd的机制有关系,是否会保持已有的会话连接?后续继续分析一下,此处保留困惑。

2.2、借助nc来实现

一些说明:

在使用-W之前,通常都是使用nc选项,nc允许你转发TCP/UDP数据包到指定(备用)位置并且基本上与ssh -W相同;

待补充!!!

Author: bugwz
Link: https://bugwz.com/2019/10/09/ssh-proxycommand/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.