先记住一句话:
SSH 端口转发 = 用一条安全的水管(SSH 隧道)把本来不通的水流(TCP 数据)引到你想去的地方。
我们先把所有术语翻译成“水管工语言”,再用三个生活小故事逐个演示。读完你就能自己画出水流图,再也不用死记。
一、角色对照表
| SSH 术语 | 水管工语言 | 备注 |
|---|---|---|
| 本地主机 host1 | 你家的水龙头 | 你坐在这台电脑前 |
| 远程主机 host2 | 远处的消防栓 | 真正想访问的服务 |
| 跳板机 host3 | 中间的那根长水管 | 必须能同时连 host1 和 host2 |
| 本地端口转发 -L | 把自家水龙头接到长水管上 | 数据方向:host1 → host3 → host2 |
| 远程端口转发 -R | 把消防栓接到长水管送回你家 | 数据方向:host2 → host3 → host1 |
| 动态端口转发 -D | 在自家装一台“万能分水器” | SOCKS 代理,能流向任意多个消防栓 |
二、故事 1:本地端口转发(固定水管)
场景:
你想用笔记本(host1)连公司内网的 Git 仓库(host2:22),但公司防火墙只让跳板机(host3)访问 Git 仓库。
水管图:
[host1:笔记本] ←→ [host3:跳板机] ←→ [host2:Git 仓库]
无法直达 | 可以直达
修水管命令:
ssh -L 9000:host2:22 user@host3
| 参数拆解 | 含义 |
|---|---|
-L |
Local(本地)转发 |
9000 |
你笔记本上的“临时水龙头”端口 |
host2:22 |
远端真正的 Git 仓库地址 |
user@host3 |
先 SSH 到跳板机 |
使用方法:
之后在本机执行 git clone ssh://localhost:9000/project.git
数据流:
git 命令 → 本地 9000 → 跳板机 → Git 仓库 22
三、故事 2:远程端口转发(反向水管)
场景:
你在公司内网有一台测试服务器(host2:8080),想让出差在外的同事(host1)访问,但公司 NAT 不给你开端口。
水管图:
[host1:同事电脑] ←← [host3:云服务器] ←← [host2:测试服务器]
只能收水 | 两边都能连
修水管命令(在 host2 上执行):
ssh -R 9000:localhost:8080 user@host3
| 参数拆解 | 含义 |
|---|---|
-R |
Remote(远程)转发 |
9000 |
host3(云服务器)上的监听端口 |
localhost:8080 |
host2 自己的 8080 |
user@host3 |
把水管插到云服务器 |
使用方法:
同事访问 http://host3:9000,请求就反向穿过 NAT 到达 host2:8080。
四、故事 3:动态端口转发(万能分水器)
场景:
你在咖啡厅,只能访问跳板机(host3),想同时刷 GitHub、拉 Docker、连 Redis,端口各不相同。你不想为每个服务都修一条固定水管。
修水管命令:
ssh -D 1080 user@host3
-
-D 1080在本地开一个 SOCKS5 代理(万能分水器)。 - 浏览器、Git、Docker CLI 只要设置 SOCKS5=127.0.0.1:1080,就能自动把任何目标端口的水流都引到 host3,再让它转发出去。
五、一张图总结三种模式
本地转发 -L
┌--------┐ ┌--------┐ ┌--------┐
│ host1 │ 9000 → │ host3 │ → 22 │ host2 │
└--------┘ └--------┘ └--------┘
远程转发 -R
┌--------┐ ┌--------┐ ┌--------┐
│ host1 │ 9000 ← │ host3 │ ← 8080 │ host2 │
└--------┘ └--------┘ └--------┘
动态转发 -D
┌--------┐ ┌--------┐ ┌----------------┐
│ host1 │1080 → │ host3 │ → ? │ host2:any_port │
└--------┘ └--------┘ └----------------┘
六、常见疑问速答
“本地”和“远程”是谁的视角?
命令里带-L/-R的那台主机就是“本地”。
-L表示本地监听端口,-R表示远端监听端口。-D 和 -L 区别?
-L是一对一固定通道;-D是 SOCKS 代理,可一对多。需要 root 吗?
不需要,只要能用 ssh 登录跳板机即可。
七、实战口诀
- 想“从家里连公司内网” → 用
-L - 想“让外网访问我家内网服务” → 用
-R - 想“一把梭所有端口” → 用
-D
把这三句口诀贴在显示器边,下次遇到任何转发需求,先问自己:“水要从哪流到哪?”然后对号入座即可。
本文由mdnice多平台发布