SSH 端口转发详解:-L、-R、-D

0 阅读4分钟

在运维和开发中,SSH 端口转发是非常实用的技巧,它可以通过安全的 SSH 隧道把网络流量从一个端口导向另一个端口。SSH 提供三种主要方式:

选项类型作用
-LLocal(本地端口转发)本机端口 → 通过 SSH → 远程目标
-RRemote(远程端口转发)远程端口 → 通过 SSH → 本地目标
-DDynamic(动态端口转发)在本机生成 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