跳转到内容

端口转发模式总览

SSH 端口转发解决的问题不是“怎样连上服务器”,而是“怎样让一条本来就安全的 SSH 连接承载其他 TCP 流量”。

理解它只需要回答四个问题:

  1. 谁在监听端口?
  2. 谁负责连接最终目标?
  3. 哪一端能访问目标服务?
  4. 使用代理的客户端是否知道最终目标?
模式监听位置目标连接由谁发起最终目标是否固定典型场景
本地转发 -L本机远端 SSH 服务器固定访问远端数据库、内网管理页
远程转发 -R远端服务器本机固定把本地开发服务暴露给远端
动态转发 -D本机远端 SSH 服务器不固定SOCKS5 访问多个内网域名
本机应用
↓ 连接 127.0.0.1:本地端口
NetShuttle / ssh
↓ SSH 连接
远端 SSH 服务器
↓ 连接 db.internal:5432
目标服务

关键句:本地监听,远端执行连接。

远端客户端
↓ 连接 server.example.com:8080
远端 SSH 服务器
↓ 已建立的 SSH 连接
本机 NetShuttle
↓ 连接 127.0.0.1:3000
本地开发服务

关键句:远端监听,本地执行连接。

浏览器 / 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 字段命令行概念
本地地址 / 本地端口-L、-R 的监听端,或 -D 的代理端
远程地址 / 远程端口-L 目标或 -R 目标
Forwarding Modelocal、remote、dynamic
规则启用开关是否在当前隧道中启动该规则
SSH 服务器承载整个隧道的连接

它只转发你配置的 TCP 目标。没有自动接管所有流量,也不处理 UDP。

它依赖远端 SSH 服务器愿意监听端口,也依赖远端防火墙、GatewayPorts 和 SSH 配置。它不是公网隧道平台。

SOCKS5 代理和 HTTP CONNECT 代理协议不同。浏览器配置时必须选择 SOCKS5。

先区分是 SSH 连接断开、本地监听失败,还是只有目标服务不可达。三者排错入口不同。