端口转发

SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯。

三种转发方式

  • -L 本地转发至远程机器
  • -R 远程机器转发到本地
  • -D 动态代理SOCKS4/5

机器准备

本地网络上 LocalA、B、C之间互通
本地网络只能访问RemoteA, RemoteB和RemoteC只能被RemoteA访问
下面将LocalA当作本机进行实验

1
2
3
4
5
6
7
8
9
10
11
+-------+       +----------+      +-----------+
| LocalA| | LocalB | | LocalC |
+-------+ +----------+ +-----------+
IP: 192.168.1.1/24

---------上边是本地网络机器,下边是远程网络机器----

+--------+ +----------+ +-----------+
| RemoteA| | RemoteB | | RemoteC |
+--------+ +----------+ +-----------+
IP: 192.168.122.1/24

本地转发

ssh -L localport:remotehost:remoteport root@RemoteA
localport: 本机端口(LocalA)
remotehost和remoteport可以是远程A,B,C三台机器的任意一台
访问本地ip:port可以直接访问远程机器的服务

场景:本地连接线上的数据库,或者需要连接客户内网机器远程debug, 一些工具比如Navicat之类的ssh隧道功能也是基于这一原理

远程转发

ssh -R remoteport:localhost:localport root@RemoteA

远程转发和本地转发正好相反
remoteport: RemoteA 远程机的端口
localhost:localport 可以是本地网络上A,B,C三台机器的任意一台
远程机器上访问本地(RemoteA)ip:port可以直接访问本地(LocalA)网络上的服务

场景:临时将本地开发环境放到公网给朋友演示

动态转发(代理)

ssh -L LocalA_host:localport root@RemoteA

该功能实际上实现了Socks代理,以代理方式连接到本地ip端口,可以访问远程网络上的任意服务。