SSH 端口转发应用实例

Published on Jun 08, 2020

案例一:使用本地端口转发解决 Mysql 客户端不支持 Google 两步验证的问题

公司项目使用的阿里云服务,出于安全考虑,数据库服务器仅开放了内网访问权限。 要想使用本地 Mysql 客户端 连接公司数据库的话,就需要使用 SSH隧道。 当然一般的 Mysql 客户端 都是支持基本的 SSH 隧道 连接的。 但是,同样出于安全考虑,公司的云服务器登录又使用了 google 两步验证。 而我使用的 Mysql 客户端 使用 SSH 隧道时,尚不支持 google 两步验证。 这时候,使用 SSH 本地端口转发就可以很好的解决这个问题。

本地端口转发的命令格式如下:

ssh -L [<本地主机>:]<本地主机端口>:<远程主机>:<远程主机端口> <SSH登录主机>

在本地电脑上执行如下命令:

ssh -L 33060:RDS数据库服务器:3306 ECS云服务器

然后使用本地 Mysql 客户端只需要访问本地的 33060 端口即可。

实际的数据传输流程大致如下:

data-transfer.png
  1. 本机的 Mysql 客户端将数据发送到本机的 33060 端口上;
  2. 本机的 SSH 客户端将 33060 端口收到的数据加密并转发到 ECS 云服务器的 SSH 服务端;
  3. ECS 云服务器的 SSH 服务端收到数据后解密并转发到 RDS 数据库服务器的 3306 端口;
  4. 最后再将 RDS 数据库服务器返回的数据原路返回到本机的 Mysql 客户端。

案例二:使用本地端口转发将虚拟机中的服务提供给内网其他用户访问

在项目开发过程中, 一般都是基于虚拟机, 比如我常使用的是 vagrant + virtual box 。 有时出于临时调试目的,会让前端/客户端临时调用自己本地环境的接口, 这个时候就需要将虚拟机 中的服务端口映射到宿主机的端口。这样才能让公司内其他同事访问到。

在宿主机执行如下命令:

ssh -L 0.0.0.0:80:192.168.10.10:9501 USER@192.168.10.10

如此便可以将宿主机 80 端口的请求全部转发到虚拟机的 9501 端口。

To be continued…