RemoteForward是唯一可行路径,因为VSCode端口转发仅支持本地转发(-L),无法让远程服务器进程访问本地代理;而RemoteForward(-R)可将远程127.0.0.1:17897加密转发至本地127.0.0.1:7897,绕过防火墙与Clash监听限制,且无需暴露代理端口。

远程开发中想让服务器复用本地代理(比如 Clash、Clash Verge),必须用 RemoteForward,而不是 VSCode 自带的端口转发 UI —— 后者只做本地转发(-L),对代理场景完全无效。
为什么 RemoteForward 是唯一可行路径
VSCode 的图形化端口转发(点击状态栏端口 → “Forward”)本质是 SSH -L 本地转发,只能把远程服务“拉到本地”。但你要解决的是反向问题:让远程服务器上的进程(如 codex、curl、pip)能走你本机的代理。这需要远程机器主动发起连接并命中一个“看起来像本地代理”的端口,再由 SSH 隧道把它送回你本机代理进程 —— 这正是 RemoteForward(-R)的职责。
常见错误是误以为设置 HTTP_PROXY=http://192.168.x.x:7897 就行,结果 curl -v http://google.com 直接超时。根本原因:Clash 默认只监听 127.0.0.1:7897,不接受局域网连接;而开发板/服务器和你 PC 不在同一个网络命名空间里,192.168.x.x 对它来说是外部地址,还可能被防火墙拦截。
-
RemoteForward绕过所有网络暴露问题:它让远程机器访问自己的127.0.0.1:17897,SSH 自动把流量加密送回你 PC 的127.0.0.1:7897 - 不需要改 Clash 设置,不用开防火墙,不暴露代理端口到局域网
- VSCode Remote-SSH 连接时会自动读取
~/.ssh/config并建立隧道,无需手动ssh -R
RemoteForward 配置必须显式绑定 127.0.0.1
很多教程写 RemoteForward 17897 127.0.0.1:7897,但实际在 Linux/macOS 服务器上容易失败,报 Warning: remote port forwarding failed for listen port 17897。这是因为 OpenSSH 默认尝试监听 *:17897(所有接口),而多数服务器禁用了 GatewayPorts,拒绝非 loopback 绑定。
正确写法必须带上监听地址:
Host my-server HostName 192.168.1.100 User dev RemoteForward 127.0.0.1:17897 127.0.0.1:7897 ExitOnForwardFailure yes ServerAliveInterval 30
-
127.0.0.1:17897明确告诉 sshd 只监听本地回环,避免权限拒绝 -
ExitOnForwardFailure yes让连接失败时立刻报错,而不是静默忽略 —— 否则你以为转发成功了,其实没生效 - 端口号别用 7897、8080 这类常见值,选 17897、27897 等避开冲突
- 连上后在服务器跑
ss -tlnp | grep ':17897',看到127.0.0.1:17897在 LISTEN 状态才算真正就位
环境变量设置要匹配转发端口且排除本地地址
远程服务器上设 HTTP_PROXY,目标必须是你自己监听的那个端口(127.0.0.1:17897),不是你本机的 7897 —— 后者根本不可达。
同时 NO_PROXY 必须包含 localhost 和 127.0.0.1,否则代理自身请求(比如查 DNS、连 Clash API)也会被循环转发,导致卡死或 503 错误。
export HTTP_PROXY=http://127.0.0.1:17897 export HTTPS_PROXY=http://127.0.0.1:17897 export ALL_PROXY=http://127.0.0.1:17897 export NO_PROXY=localhost,127.0.0.1,::1
- 不要写成
http://localhost:17897—— 某些工具(如旧版curl)对localhost解析不稳定,统一用127.0.0.1 -
ALL_PROXY是为支持socks5://协议的工具(如某些 Go CLI),一并设上更稳妥 - 改完
~/.bashrc后要source ~/.bashrc或新开终端,env | grep PROXY确认生效
Clash Verge 用户注意 listen 地址和端口确认
Clash Verge 默认监听 127.0.0.1:7897(HTTP)和 127.0.0.1:7890(SOCKS),但不同版本 UI 位置不同。务必手动确认:
- 打开 Clash Verge → Settings → General → “Allow LAN” 必须关闭(保持默认)
- Settings → Profiles → 点击当前配置右下角 “Edit” → 查看
port和socks-port值 - 命令行验证:
lsof -i :7897或ss -tlnp | grep ':7897',确保有进程监听127.0.0.1:7897 - 如果 Clash 启用了 TUN 模式或系统代理,
HTTP_PROXY可能被绕过 —— 测试时临时关闭 TUN,用纯 HTTP 代理模式
最易被忽略的点:Clash 的 allow-lan 默认是 false,但它在配置文件里可能被手动改成 true;一旦开启,127.0.0.1:7897 就不再是唯一入口,RemoteForward 转发反而可能被跳过。始终以 lsof 实际监听为准。


















