SSH不仅可以使用远程管理主机,还可以利用SSH客户端和SSH服务器之间的加密连接为其他服务实际中继服务,这一般称为SSH隧道(SSH Tunneling)或者SSH端口转发。
SSH端口转发分为三种类型:
- 动态端口转发
- 本地端口转发
- 远程端口转发
无论是哪种端口转发,整个过程都涉及四个角色:
- 业务客户端
- SSH客户端
- SSH服务器
- 业务服务端
这些角色进程并不要求都位于独立主机上,它们可以位于同一台主机上,使用localhost或者127.0.0.1进行网络访问。
本文基于这4种角色来简要说明这三种端口转发的过程。三种端口转发都依赖SSH客户端和SSH服务器建立一个加密连接在二者之间转发数据。
动态端口转发
动态端口转发主要用于使能访问SSH客户端地址的进程通过SSH隧道访问SSH服务器能访问的服务。它的一般场景是:
- 业务客户端需要访问多个无法直接访问的服务
- 业务客户端可以访问- SSH客户端所在机器的某个端口
- SSH服务器可以访问这些服务
在这种场景下,SSH客户端为这些客户端提供SOCKS5代理功能。SOCKS5说明可以参考之前的文章<<SOCKS5和Danted分析>>。
访问过程可理解为:
- SSH客户端与- SSH服务器之间建立加密连接
- SSH客户端在指定端口启动- SOCKS5服务器
- 业务客户端使用- SOCKS5协议连接- SSH客户端监听的代理端口
- SSH客户端将请求通过加密连接发送到- SSH服务器
- SSH服务器将相关请求发送到- SOCKS5协议中指定的目标地址
如图所示:
 
以上图中IP/端口为示例,启用的SSH命令格式为:
| 1 | ssh -D 1234 -N root@2.2.2.2 | 
本地端口转发
本地端口转发和动态端口转发场景类似,但只需要访问一个无法直接连通的服务:
- 业务客户端需要某个无法直接访问的服务
- 业务客户端可以访问- SSH客户端所在机器的某个端口
- SSH服务器可以访问这个服务
访问过程可理解为:
- SSH客户端与- SSH服务器之间建立加密连接
- SSH客户端在指定端口启动代理
- 业务客户端使用原生协议访问- SSH客户端监听的代理端口
- SSH客户端将请求通过加密连接发送到- SSH服务器
- SSH服务器将相关请求发送到指定的目标地址
如图所示:
 
以上图中IP/端口为示例,启用的SSH命令格式为:
| 1 | ssh -L 1.1.1.1:1234:2.2.2.3:80 -N root@2.2.2.2 | 
远程端口转发
远程端口访问主要用于使能够访问SSH服务端地址的进程来访问SSH客户端能访问的服务。它的一般场景为:
- SSH客户端与- SSH服务器之间建立加密连接
- SSH服务端在指定端口启动代理
- 业务客户端使用原生协议访问- SSH服务端监听的代理端口
- SSH服务端将请求通过加密连接发送到- SSH客户端
- SSH客户端将相关请求发送到指定的目标地址
如图所示:
 
以上图中IP/端口为示例,启用的SSH命令格式为:
| 1 | ssh -R 2.2.2.2:1234:1.1.1.2:80 -N root@2.2.2.2 | 
参考: