开始
公司常常需要我去客户的服务器上运行代码,但是往往会遇到下面几个问题:
- 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