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 |
参考: