SSH Tunnel 建立转发实现跳板开发

如何使用已经建立好 vpn 的机子作为跳板实现本地 ssh 开发

开始

公司常常需要我去客户的服务器上运行代码,但是往往会遇到下面几个问题:

  • vpn 千奇百怪,一个公司对应下载一个 vpn,污染我自己电脑的环境
  • 大部分 vpn 仅支持 win,对 macos 的支持往往有严重的问题

为此我一般借助的是公司的一个远程 win 服务器,远程连接桌面进行开发,但是未免太过繁琐,不如本地 ssh 来的优雅

后来了解到 SSH Tunnel 完美的解决了这个问题,这篇文章主要来描述一下我的解决方案

SSH Tunnel

SSH Tunnel 是一种利用 SSH 协议在客户端与服务器之间建立加密数据通道的技术。

简单来说就是:借用一条 SSH 连接,把本机到某个目标服务的网络流量转发过去。本质上是端口转发,它将本地机器或远程机器的某个端口,通过 SSH 连接映射到另一端的特定端口。

可以把它理解成:本机程序 -> 本机端口 -> SSH 加密通道 -> 跳板机 -> 内网服务

三种主要的隧道模式

SSH 隧道主要分为以下三类

1. 本地端口转发 (Local Port Forwarding)

将本地机器的端口转发到远程目标服务器。

命令格式:ssh -L [本地端口]:[目标地址]:[目标端口] [SSH服务器]

应用场景:你在家里想访问公司内网的一台数据库服务器。你可以先 SSH 连接到公司的跳板机,然后将本地 3306 端口映射到公司内网数据库的 3306 端口。

2. 远程端口转发 (Remote Port Forwarding)

将远程服务器的端口转发到本地机器。

命令格式:ssh -R [远程端口]:[目标地址]:[目标端口] [SSH服务器]

应用场景:内网穿透。你本地开发了一个网站,想给远方的朋友演示,但你没有公网 IP。你可以通过远程转发,将公网 VPS 的 8080 端口映射到你电脑的 80 端口。

3. 动态端口转发 (Dynamic Port Forwarding)

建立一个本地 SOCKS 代理服务器。

命令格式:ssh -D [本地端口] [SSH服务器]

应用场景:当你不确定要访问哪个具体端口,或者想让浏览器所有流量都通过 SSH 服务器中转时使用。

实践

假如你有一个可以连接上 vpn 的机子,希望通过这台机器访问 vpn 的网络环境,就可以使用该方法

具体参考如下 ssh config 配置:

## 跳板机 ##

Host 跳板机
  HostName xx.xx.2.33
  User admin

### 客户 ###

Host 客户测试
  HostName xx.xx.73.29
  User root
  ProxyJump 2.33

Host 客户正式
  HostName xx.xx.73.30
  User root
  ProxyJump 2.33

Host xx服务器
  HostName xx.xx.61.3
  User root
  ProxyJump 2.33