MobaXterm RDP 经 SOCKS5 代理转发(gost + WSL)
背景
一批 RDP 服务器(107.150.x.x、152.32.x.x 等,端口 3389)只能通过本地的
SOCKS5/HTTP 代理 127.0.0.1:7890(Clash/mihomo 混合端口)访问。目标是让
MobaXterm 里的这些 RDP 会话走这个代理,并且能把其中一台分享给局域网内的同事使用。
关键结论:MobaXterm 的 RDP 不支持 SOCKS 代理
查证 .mxtsessions 格式与 MobaXterm 功能后确认:
- SSH 会话支持 SOCKS 代理(v6.6 起)
- VNC 内置查看器支持 SOCKS4/5、HTTP 代理
- RDP 会话只支持 SSH 网关(跳板机)或微软 RDP/TS Gateway,没有 SOCKS 代理字段
所以不能在 RDP 会话里直接“勾选走代理”。代理必须在 RDP 客户端外部完成——这正是
gost 做端口转发的用武之地。
方案:gost 本地端口转发
为每台目标分配一个本地端口,gost 监听该端口并把流量经 SOCKS5 代理转发到真实host:3389。RDP 客户端只连本地端口即可。
1 | |
为什么放在 WSL 里跑
WSL2 开启镜像网络(mirrored)后与 Windows 共享 localhost:WSL 内监听的127.0.0.1:1339x 端口,Windows 上的 MobaXterm 直接连 127.0.0.1:1339x 就能命中,
无需改会话文件;同时 WSL 内访问 127.0.0.1:7890 也能直达 Windows 侧的 Clash。
确认环境(WSL Ubuntu-22.04,已装 gost v3.2.6):
1 | |
端口映射
| 本地端口 | 目标主机:端口 | 备注 |
|---|---|---|
| 13389 | 107.150.96.199:3389 | |
| 13390 | 107.150.107.108:3389 | |
| 13391 | 107.150.108.154:3389 | |
| 13392 | 107.150.110.99:3389 | |
| 13393 | 152.32.233.216:3389 | |
| 13394 | 152.32.236.186:3389 | |
| 13395 | 152.32.236.244:3389 | |
| 13396 | 154.197.56.128:3389 | |
| 13397 | 165.154.172.91:3389 | |
| 13398 | 45.43.57.218:3389 | |
| 13399 | 107.150.100.161:3389 | 分享给同事 |
转发脚本
/root/start-rdp-proxy.sh(gost v3 语法,tcp://:port 即监听所有网卡 0.0.0.0):
1 | |
注意:gost v2 与 v3 共用
-L/-F,但子参数写法不同;本文是 v3。
若用nohup ... &在一次性的wsl bash -lc里跑,命令一退出进程会被 WSL 回收,
因此要用 systemd 常驻。
用 systemd 常驻(推荐)
WSL 已启用 systemd(/etc/wsl.conf 里 [boot] systemd=true)。
/etc/systemd/system/rdp-proxy.service:
1 | |
启用:
1 | |
踩坑:status=203/EXEC
通过 Windows UNC 路径(\\wsl.localhost\...)写脚本时,可能引入 CRLF 或丢掉执行位,
导致 systemd 报 203/EXEC。修复:
1 | |
自己用:导入会话
把会话文件里每个 RDP 的主机改成 127.0.0.1、端口改成对应本地端口(如 13389),其余
(会话名、保存的凭据引用 [common]/[96.99]、显示设置)保持不变。MobaXterm 里
Sessions → Import 导入即可。
分享给同事(局域网)
同事连的是本机的局域网 IP(非回环),例如:
1 | |
172.16.5.6 为 WLAN 网卡地址;172.18.224.1(Hyper-V 内部)与 100.96.1.205
(Cloudflare WARP)不可用于局域网分享。
必须放行 Windows 防火墙入站(管理员)
回环(自己用 127.0.0.1)不受防火墙影响,但局域网入站会被默认拦截。以管理员身份运行:
1 | |
同事连不上排查清单
按顺序排查(多数情况是第 1 条防火墙没加):
- 防火墙规则没加/被拦:用管理员跑上面的
New-NetFirewallRule;公司网络可能还有
组策略防火墙。验证:同事执行Test-NetConnection 172.16.5.6 -Port 13399,TcpTestSucceeded应为True。 - 不在同一局域网/子网:
172.16.5.6跨网段/经路由器不可达;确认同事与本机同一 LAN。 - IP 变了:WLAN 是 DHCP,重连 WiFi/重启路由后 IP 可能改变,重新查
Get-NetIPAddress。 - 服务没跑/端口没监听:WSL 内
systemctl is-active rdp-proxy与ss -ltn | grep 13399。 - Clash 没开:
127.0.0.1:7890不通则转发链路断;curl -x socks5h://127.0.0.1:7890 https://www.google.com自检。 - 镜像网络入站:确认
/etc/wsl.conf的[network] networkingMode=mirrored;
非镜像(NAT)模式下局域网无法经127.0.0.1命中 WSL 端口,需改用 Windows 侧netsh portproxy或hnsdiag/端口代理转发。 - 目标本身不可达:本机
curl -x socks5h://127.0.0.1:7890 http://107.150.100.161:3389
返回(52) Empty reply表示 TCP 已通(RDP 不是 HTTP,空回复属正常);返回连接拒绝
则代理到目标这一段有问题。 - Windows 已占用 13399:
netstat -ano | findstr 13399看是否被别的进程占了。
常用管理命令
1 | |
注意事项
- 本机关机/睡眠、或 Clash(7890)未开时,转发即中断。
- 局域网 IP 为 DHCP,变化后需重新告知同事。
- gost
tcp://:port监听 0.0.0.0,回环与局域网都可达;只想本机用可改成tcp://127.0.0.1:port。