端口转发模式总览
SSH 端口转发解决的问题不是“怎样连上服务器”,而是“怎样让一条本来就安全的 SSH 连接承载其他 TCP 流量”。
理解它只需要回答四个问题:
- 谁在监听端口?
- 谁负责连接最终目标?
- 哪一端能访问目标服务?
- 使用代理的客户端是否知道最终目标?
一张表分清三种模式
Section titled “一张表分清三种模式”| 模式 | 监听位置 | 目标连接由谁发起 | 最终目标是否固定 | 典型场景 |
|---|---|---|---|---|
本地转发 -L | 本机 | 远端 SSH 服务器 | 固定 | 访问远端数据库、内网管理页 |
远程转发 -R | 远端服务器 | 本机 | 固定 | 把本地开发服务暴露给远端 |
动态转发 -D | 本机 | 远端 SSH 服务器 | 不固定 | SOCKS5 访问多个内网域名 |
本地转发 -L
Section titled “本地转发 -L”本机应用 ↓ 连接 127.0.0.1:本地端口NetShuttle / ssh ↓ SSH 连接远端 SSH 服务器 ↓ 连接 db.internal:5432目标服务关键句:本地监听,远端执行连接。
远程转发 -R
Section titled “远程转发 -R”远端客户端 ↓ 连接 server.example.com:8080远端 SSH 服务器 ↓ 已建立的 SSH 连接本机 NetShuttle ↓ 连接 127.0.0.1:3000本地开发服务关键句:远端监听,本地执行连接。
动态转发 -D
Section titled “动态转发 -D”浏览器 / curl ↓ SOCKS5 请求包含目标和端口本机 NetShuttle ↓ SSH 连接远端 SSH 服务器 ↓ 每次请求动态连接各自目标多个内网服务关键句:本地监听,客户端决定目标。
如果只访问一个固定目标,用 -L
Section titled “如果只访问一个固定目标,用 -L”例如:
- 只访问远端内网的 PostgreSQL。
- 只访问远端
127.0.0.1上的管理页面。 - 本机软件不支持 SOCKS5,只能连接固定 host/port。
如果目标只能访问本机服务,用 -R
Section titled “如果目标只能访问本机服务,用 -R”例如:
- 远端服务器需要访问你的本地 Webhook。
- 测试服务器需要访问你电脑上的 API。
- 你希望同事通过一台中间服务器临时访问你的本地服务。
如果要访问多个远端目标,用 -D
Section titled “如果要访问多个远端目标,用 -D”例如:
- 浏览器需要同时打开多个内网域名。
curl、git或 SDK 只要支持 SOCKS5,就要访问不同内部地址。- 你不希望为每个目标各建一条
-L规则。
命令行与 NetShuttle 的对应关系
Section titled “命令行与 NetShuttle 的对应关系”| NetShuttle 字段 | 命令行概念 |
|---|---|
| 本地地址 / 本地端口 | -L、-R 的监听端,或 -D 的代理端 |
| 远程地址 / 远程端口 | -L 目标或 -R 目标 |
| Forwarding Mode | local、remote、dynamic |
| 规则启用开关 | 是否在当前隧道中启动该规则 |
| SSH 服务器 | 承载整个隧道的连接 |
-L 不是 VPN
Section titled “-L 不是 VPN”它只转发你配置的 TCP 目标。没有自动接管所有流量,也不处理 UDP。
-R 不是“反向外网穿透服务”
Section titled “-R 不是“反向外网穿透服务””它依赖远端 SSH 服务器愿意监听端口,也依赖远端防火墙、GatewayPorts 和 SSH 配置。它不是公网隧道平台。
-D 不是 HTTP 代理
Section titled “-D 不是 HTTP 代理”SOCKS5 代理和 HTTP CONNECT 代理协议不同。浏览器配置时必须选择 SOCKS5。
隧道断开不一定代表目标故障
Section titled “隧道断开不一定代表目标故障”先区分是 SSH 连接断开、本地监听失败,还是只有目标服务不可达。三者排错入口不同。