在运维和开发中,SSH 端口转发是非常实用的技巧,它可以通过安全的 SSH 隧道把网络流量从一个端口导向另一个端口。SSH 提供三种主要方式:
| 选项 | 类型 | 作用 |
|---|---|---|
-L | Local(本地端口转发) | 本机端口 → 通过 SSH → 远程目标 |
-R | Remote(远程端口转发) | 远程端口 → 通过 SSH → 本地目标 |
-D | Dynamic(动态端口转发) | 在本机生成 SOCKS 代理,所有流量走 SSH 隧道 |
1. ssh -L: 本地端口转发
作用:在本地开一个端口,将这个本地端口上的流量发送到 SSH 服务器再转发到指定目标。
命令语法:
ssh -L [本地监听IP:本地端口]:目标主机:目标端口 user@SSH服务器
比如:
ssh -L 127.0.0.1:8000:localhost:80 user@server
上面命令表示:
- 在本地监听端口
8000 - 向 SSH 服务器发起连接
- SSH 服务器再把流量发送到服务器本地的
localhost:80服务
实际访问方式:
访问本机 http://127.0.0.1:8000 等价于访问 SSH 服务器的 localhost:80。(ssh.com)
实例:解决云服务器 OpenClaw Gateway 只能本地访问问题
假设你有一台云服务器(IP 为 1.2.3.4),上面运行了 OpenClaw Gateway,但服务只能监听本地回环地址(127.0.0.1),PC 无法直接访问。
解决办法:把远程本地回环地址的服务转发到你 PC 的本地端口。命令如下:
ssh -L 8080:127.0.0.1:8000 user@1.2.3.4
解释:
- 把你电脑本地的
8080端口转发到云服务器的127.0.0.1:8000 - 之后你在 PC 浏览器访问
http://127.0.0.1:8080就等同访问 OpenClaw Gateway - SSH 隧道会安全地把请求发送到远程服务器并反向返回响应
2. ssh -R: 远程端口转发
作用:在 SSH 服务器一侧开一个端口,并将该端口上的流量通过 SSH 隧道发送到本地或其他主机。
语法:
ssh -R [远程监听IP:远程端口]:目标主机:目标端口 user@SSH服务器
典型用途:让远程服务器能访问你本地机上的服务(类似反向代理)。(DigitalOcean)
实例:让云服务器通过本地 PC 的 Clash 代理上网
场景: 你本地 PC 配置了 Clash 代理(比如 SOCKS5 或 HTTP 代理),但云服务器只能访问互联网直连而不能走本地代理。可以用远程端口转发把云服务器的流量通过 SSH 通道转发到你的 PC 代理。
假设本地 Clash 监听端口是 7890,SSH 登录用户是 user,云服务器 IP 是 1.2.3.4,可以用:
ssh -R 1080:127.0.0.1:7890 user@1.2.3.4
解释:
- 在远程服务器(1.2.3.4)上开放端口
1080,并把这个端口的流量转发到你 PC 的 Clash 代理127.0.0.1:7890 - 云服务器上的应用如果设置代理地址为
127.0.0.1:1080就能走你电脑的 Clash 代理上网
⚠️ 注意:如果希望云服务器的 1080 端口对公网也能访问,还需要在服务器 SSH 配置里启用 GatewayPorts yes。(ssh.com)
3. ssh -D: 动态端口转发(SOCKS 代理)
作用:在本地开启一个 SOCKS 代理端口,所有发送到这个端口的流量都通过 SSH 隧道发往远端 SSH 服务器,然后由 SSH 服务器根据目标 IP 动态转发到目的地(类似 VPN)。(Oracle 文档)
语法:
ssh -D [本地监听IP:]端口 user@SSH服务器
示例:
ssh -D 1080 user@server
此时你本地会有一个 SOCKS5 代理监听 127.0.0.1:1080,在系统或应用里把代理设置为它即可。
实例:把 PC 指定端口的请求通过云服务器代理发出
假设云服务器网络环境更优(或者具备海外出口,你想让流量从云服务器出去),可以借助动态端口转发实现:
ssh -D 1080 user@1.2.3.4
解释:
- 在本地开启一个 SOCKS5 代理端口
1080 - 你在浏览器、命令行工具或其他应用里把代理设置为
127.0.0.1:1080 - 所有发到
1080的网络请求都会被 SSH 隧道带到云服务器,由云服务器代为发出 - 这样你就实现了类似“云端代理”的效果
小结对比
| 转发方式 | 主要用途 | 使用模式 |
|---|---|---|
-L | 本地访问远程服务 | PC → SSH → 指定远程 |
-R | 让远程访问本地服务 / 反向代理 | 远程 → SSH → 本地 |
-D | 搭建动态 SOCKS 代理 | 本地 SOCKS → SSH → 远程再发出 |
常见 SSH 端口转发选项(用于增强实用性)
| 选项 | 含义 |
|---|---|
-N | 不执行远端命令,仅建立隧道 |
-f | 后台执行 SSH 隧道 |
-C | 压缩传输数据 |
示例(后台建立隧道):
ssh -f -N -L 8080:127.0.0.1:8000 user@server