端口转发实战案例
这篇文档用完整场景把 -L、-R、-D 串起来。每个案例都包含目标、拓扑、命令、NetShuttle 配置和验证方式。
案例一:访问远端内网 PostgreSQL
Section titled “案例一:访问远端内网 PostgreSQL”- 你在公司 Wi-Fi 下。
- PostgreSQL
db.internal:5432只允许开发服务器dev.example.com访问。 - 你不想在本地安装 SSH 隧道脚本。
使用 -L,因为目标固定且由远端服务器发起连接。
ssh -N -L 127.0.0.1:15432:db.internal:5432 user@dev.example.comNetShuttle
Section titled “NetShuttle”- 模式:本地转发
-L - 本地:
127.0.0.1:15432 - 远端:
db.internal:5432 - SSH:
dev.example.com
psql -h 127.0.0.1 -p 15432 -U app_user app_db案例二:打开只监听在远端 localhost 的 Grafana
Section titled “案例二:打开只监听在远端 localhost 的 Grafana”Grafana 只在开发服务器本机监听:
127.0.0.1:3000ssh -N -L 127.0.0.1:13000:127.0.0.1:3000 user@dev.example.comhttp://127.0.0.1:13000关键点:远程目标也写 127.0.0.1,因为连接是从远端服务器发出的。
案例三:把本地 Next.js 开发服务提供给测试服务器
Section titled “案例三:把本地 Next.js 开发服务提供给测试服务器”- 本地服务:
127.0.0.1:3000 - 测试服务器:
test.example.com - 测试服务器中的脚本需要请求你的本地服务。
使用 -R,因为监听发生在远端,目标在你的电脑。
ssh -N -R 127.0.0.1:18080:127.0.0.1:3000 user@test.example.com在测试服务器验证
Section titled “在测试服务器验证”curl http://127.0.0.1:18080如果只绑定远端 127.0.0.1,只有测试服务器自己可以访问,这是最安全的默认方式。
案例四:接收远端 Webhook
Section titled “案例四:接收远端 Webhook”第三方测试系统只能请求 test.example.com 网络中的地址。你的本地 Webhook 监听 127.0.0.1:9000。
ssh -N -R 127.0.0.1:19000:127.0.0.1:9000 user@test.example.com然后让第三方系统请求:
http://test.example.com:19000/webhook如果测试服务器 18080 只监听 localhost,需要同时配置 GatewayPorts 和远程防火墙。
案例五:通过 SOCKS5 访问多个内网服务
Section titled “案例五:通过 SOCKS5 访问多个内网服务”你需要在浏览器里访问:
grafana.internal:3000wiki.internal:8080api.internal:443ssh -N -D 127.0.0.1:1080 user@dev.example.comCLI 验证
Section titled “CLI 验证”curl --socks5-hostname 127.0.0.1:1080 http://grafana.internal:3000curl --socks5-hostname 127.0.0.1:1080 http://wiki.internal:8080为什么不用三条 -L
Section titled “为什么不用三条 -L”可以,但每次新增目标都要增加规则。SOCKS5 更适合“目标列表可变”的浏览和调试场景。
案例六:ProxyJump 与端口转发的区别
Section titled “案例六:ProxyJump 与端口转发的区别”ProxyJump
Section titled “ProxyJump”ssh -J user@jump.example.com user@target.internal它解决的是“怎样通过跳板机建立到目标主机的 SSH 连接”。
本地端口转发
Section titled “本地端口转发”ssh -L 127.0.0.1:15432:db.internal:5432 user@jump.example.com它解决的是“让本机某个端口通过 SSH 服务器访问另一个 TCP 目标”。
如果目标本身是 SSH 主机,优先考虑 ProxyJump。
如果目标是数据库、HTTP 或其他 TCP 服务,端口转发更直接。
NetShuttle 中两者可以同时存在:先配置 proxyJumpID 连接目标服务器,再基于该连接创建端口转发。
| 问题 | 选择 |
|---|---|
| 本机访问一个固定远端目标 | -L |
| 远端访问一个固定本机目标 | -R |
| 本机访问多个远端目标 | -D |
| 只是通过跳板机 SSH 到另一台机器 | ProxyJump |
| 浏览器必须使用 SOCKS5 | -D |
| 只暴露一次本地预览 | -R,用完即关 |
- SSH 连接本身是否已建立。
- 监听端是否出现端口。
- 监听地址是
127.0.0.1还是0.0.0.0。 - 目标服务是否从正确一侧可达。
- 防火墙和安全组是否放行。
- DNS 是由本机解析还是由远端解析。
- 停止隧道后端口是否释放。