MobaXterm RDP 经 SOCKS5 代理转发(gost + WSL)

背景

一批 RDP 服务器(107.150.x.x152.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 做端口转发的用武之地。

参考:.mxtsessions 格式(Ruzgfpegk gist)MobaXterm 文档

方案:gost 本地端口转发

为每台目标分配一个本地端口,gost 监听该端口并把流量经 SOCKS5 代理转发到真实
host:3389。RDP 客户端只连本地端口即可。

1
RDP 客户端 → 127.0.0.1:13389  → gost → socks5://127.0.0.1:7890107.150.96.199:3389

为什么放在 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
2
echo HOME=$HOME; uname -m; gost -V
curl -s -o /dev/null -w "%{http_code}\n" -x socks5h://127.0.0.1:7890 https://www.google.com # 200 = 代理可用

端口映射

本地端口 目标主机:端口 备注
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env bash
set -euo pipefail
exec gost \
-L "tcp://:13389/107.150.96.199:3389" \
-L "tcp://:13390/107.150.107.108:3389" \
-L "tcp://:13391/107.150.108.154:3389" \
-L "tcp://:13392/107.150.110.99:3389" \
-L "tcp://:13393/152.32.233.216:3389" \
-L "tcp://:13394/152.32.236.186:3389" \
-L "tcp://:13395/152.32.236.244:3389" \
-L "tcp://:13396/154.197.56.128:3389" \
-L "tcp://:13397/165.154.172.91:3389" \
-L "tcp://:13398/45.43.57.218:3389" \
-L "tcp://:13399/107.150.100.161:3389" \
-F "socks5://127.0.0.1:7890"

注意:gost v2v3 共用 -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
2
3
4
5
6
7
8
9
10
11
12
[Unit]
Description=gost RDP forwarder via SOCKS5 127.0.0.1:7890
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/bash /root/start-rdp-proxy.sh
Restart=on-failure
RestartSec=3

[Install]
WantedBy=multi-user.target

启用:

1
2
3
4
systemctl daemon-reload
systemctl enable --now rdp-proxy.service
systemctl is-active rdp-proxy.service # active
ss -ltn | grep -Eo ':133[0-9][0-9]' | sort -u # 应列出 13389-13399

踩坑:status=203/EXEC

通过 Windows UNC 路径(\\wsl.localhost\...)写脚本时,可能引入 CRLF 或丢掉执行位,
导致 systemd 报 203/EXEC。修复:

1
2
3
sed -i 's/\r$//' /root/start-rdp-proxy.sh   # 去掉 \r
chmod +x /root/start-rdp-proxy.sh
# 且 ExecStart 显式用 bash 调用脚本,绕开 shebang/执行位问题

自己用:导入会话

把会话文件里每个 RDP 的主机改成 127.0.0.1、端口改成对应本地端口(如 13389),其余
(会话名、保存的凭据引用 [common]/[96.99]、显示设置)保持不变。MobaXterm 里
Sessions → Import 导入即可。

分享给同事(局域网)

同事连的是本机的局域网 IP(非回环),例如:

1
107.150.100.161172.16.5.6:13399

172.16.5.6 为 WLAN 网卡地址;172.18.224.1(Hyper-V 内部)与 100.96.1.205
(Cloudflare WARP)不可用于局域网分享。

必须放行 Windows 防火墙入站(管理员)

回环(自己用 127.0.0.1)不受防火墙影响,但局域网入站会被默认拦截。以管理员身份运行:

1
New-NetFirewallRule -DisplayName "WSL RDP forward 13399" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 13399 -Profile Any

同事连不上排查清单

按顺序排查(多数情况是第 1 条防火墙没加):

  1. 防火墙规则没加/被拦:用管理员跑上面的 New-NetFirewallRule;公司网络可能还有
    组策略防火墙。验证:同事执行 Test-NetConnection 172.16.5.6 -Port 13399
    TcpTestSucceeded 应为 True
  2. 不在同一局域网/子网172.16.5.6 跨网段/经路由器不可达;确认同事与本机同一 LAN。
  3. IP 变了:WLAN 是 DHCP,重连 WiFi/重启路由后 IP 可能改变,重新查 Get-NetIPAddress
  4. 服务没跑/端口没监听:WSL 内 systemctl is-active rdp-proxy
    ss -ltn | grep 13399
  5. Clash 没开127.0.0.1:7890 不通则转发链路断;
    curl -x socks5h://127.0.0.1:7890 https://www.google.com 自检。
  6. 镜像网络入站:确认 /etc/wsl.conf[network] networkingMode=mirrored
    非镜像(NAT)模式下局域网无法经 127.0.0.1 命中 WSL 端口,需改用 Windows 侧
    netsh portproxyhnsdiag/端口代理转发。
  7. 目标本身不可达:本机 curl -x socks5h://127.0.0.1:7890 http://107.150.100.161:3389
    返回 (52) Empty reply 表示 TCP 已通(RDP 不是 HTTP,空回复属正常);返回连接拒绝
    则代理到目标这一段有问题。
  8. Windows 已占用 13399netstat -ano | findstr 13399 看是否被别的进程占了。

常用管理命令

1
2
3
4
systemctl status rdp-proxy            # 状态
systemctl restart rdp-proxy # 改脚本后重启
journalctl -u rdp-proxy -f # 实时日志
systemctl disable --now rdp-proxy # 停止并取消自启

注意事项

  • 本机关机/睡眠、或 Clash(7890)未开时,转发即中断。
  • 局域网 IP 为 DHCP,变化后需重新告知同事。
  • gost tcp://:port 监听 0.0.0.0,回环与局域网都可达;只想本机用可改成
    tcp://127.0.0.1:port

MobaXterm RDP 经 SOCKS5 代理转发(gost + WSL)
https://kingjem.github.io/2026/06/23/MobaXterm-RDP经SOCKS5代理转发-gost/
作者
Ruhai
发布于
2026年6月23日
许可协议