为什么需要这套架构
场景很简单:家里有一台 Windows 工作站和一台 Linux 服务器,人在外面时想用 Mac 笔记本远程连回去干活。
问题:
- 家宽没有公网 IP(运营商 NAT)
- 不想给每台远程设备都装 Tailscale(Mac 只用 Windows App 连 RDP,不装额外软件)
- 需要稳定低延迟(选离自己近的云节点,直连几毫秒)
- VPS 偶尔要下载 GitHub / Docker Hub 的东西,需要出墙
最终方案:一台百元级国内 VPS,同时干三件事——Tailscale DERP 中继、socat 端口转发 RDP、Clash 代理出墙。
架构总览
┌─────────────────────┐
│ 国内 VPS (近你所在城市) │
│ Tailscale: 100.64.0.2 │
│ │
│ ① DERP 中继节点 │
│ ② socat 13389→3389 │
│ ③ Clash 代理出墙 │
│ ④ Cloudflare Tunnel │
└──────┬──────┬───────┘
│ │
Tailscale 隧道│ │ 公网 IP:13389
│ │
┌────────────────┘ └──────────────┐
│ │
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ 家里 Windows PC │ │ Mac 笔记本 (外出) │
│ Tailscale: │ │ 不装 Tailscale │
│ 100.64.0.1 │ │ Windows App → │
│ RDP: 3389 │◄──────────────────│ VPS公网IP:13389 │
│ Clash: 7890/7897 │ └──────────────────┘
└──────────────────┘
│
│ Tailscale 直连 / DERP
▼
┌──────────────────┐
│ 本地 Linux 服务器 │
│ Tailscale: │
│ 100.64.0.3 │
│ LAN: 192.168.1.100│
└──────────────────┘
注意:上图的
100.64.0.x是示例 Tailscale IP,实际地址在你登录 Tailscale 后由系统分配,替换成你自己的即可。
核心思路:VPS 既是 Tailscale 网络的成员(能直接访问家里的 Tailscale IP),又有公网 IP(外面的 Mac 能直接连)。socat 把公网端口转发到 Tailscale 内网。
第一步:Tailscale 组网
各节点 IP 分配
Tailscale 会自动给每个节点分配 100.x.x.x 的内网 IP。登录后在管理面板(admin.tailscale.com)可以看到。假设我们这台机器分到以下地址:
| 设备 | Tailscale IP | 备注 |
|---|---|---|
| Windows PC | 100.64.0.1 | 家里工作站(替换成你的实际 IP) |
| 本地 Linux 服务器 | 100.64.0.3 | LAN 192.168.1.100 |
| 国内 VPS | 100.64.0.2 | 做中转 |
| Mac 笔记本 | 不加入 | 只走 RDP,不装 Tailscale |
Windows 安装
去 tailscale.com/download 下 Windows 客户端,安装后登录账号即可。登录后在系统托盘能看到 IP。
Linux 服务器安装
# Ubuntu / Debian
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale status # 确认 IP
VPS 安装
同样一行命令:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
WSL2 的特殊情况
如果 Windows 上还跑着 WSL2,用了 mirrored networking 模式(.wslconfig 里 networkingMode=mirrored),网络行为和传统 NAT 模式不同:
eth0: 100.64.0.1 ← Tailscale(和 Windows 共享)
eth1: 192.168.1.101 ← 直接 LAN 访问(mirrored 直通)
好处是 WSL 里绑 0.0.0.0 的服务,局域网设备可以直接通过 WSL 的 LAN IP 访问,不需要端口转发。坏处是网络配置和标准 WSL2 文档不一样,踩坑时要注意。
第二步:VPS 中转 RDP(socat)
这是整篇文章的核心。Mac 在外面,不装 Tailscale,只通过 VPS 公网 IP 连 RDP。
Windows 开启远程桌面
# 注册表开启 RDP reg add "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f # 确认 TermService 运行 sc query TermService # 防火墙放行 3389 netsh advfirewall firewall add rule name="RDP" dir=in action=allow protocol=TCP localport=3389
UAC 提权(fodhelper 无头管理员)
如果 RDP 连上去是受限会话(UAC 拦截),可以用 fodhelper.exe 提权:
# fodhelper.exe 以管理员身份运行,绕过 UAC 提示 # 在 RDP 会话里: Start-Process fodhelper.exe -Verb RunAs
这个方法比关 UAC 更安全,只在需要时提权。
VPS 上 socat 端口转发
在 VPS 上用 socat 把公网端口转发到 Windows 的 Tailscale IP:3389(把 100.64.0.1 换成你 Windows 的实际 Tailscale IP):
# 安装 socat
apt install -y socat
# 启动转发(前台测试)
socat TCP-LISTEN:13389,fork,reuseaddr TCP:100.64.0.1:3389
# 后台常驻(生产用)
nohup socat TCP-LISTEN:13389,fork,reuseaddr TCP:100.64.0.1:3389 &
13389:VPS 公网监听端口(可自定义,避开常见扫描端口)100.64.0.1:3389:Windows 的 Tailscale IP + RDP 端口fork:允许多个并发连接reuseaddr:端口快速复用,重启不卡
记得在云控制台安全组放行 13389 端口(TCP)。
systemd 服务化(推荐)
创建 /etc/systemd/system/rdp-relay.service(同样把 IP 换成你的):
[Unit]
Description=RDP Relay via socat
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:13389,fork,reuseaddr TCP:100.64.0.1:3389
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now rdp-relay
systemctl status rdp-relay
Mac 连接
打开 Windows App(Microsoft Remote Desktop),新建连接:
- PC name:
VPS公网IP:13389 - 用户名/密码:Windows 的账号密码
流量路径:Mac → VPS公网IP:13389 → socat → Tailscale隧道 → Windows:3389
第三步:DERP 中继(Tailscale 打洞失败时的兜底)
Tailscale 默认会尝试 UDP 直连(打洞),如果两个节点都在 NAT 后面打不通,就会走 DERP 中继。官方 DERP 节点在国外,延迟高。自建国内 DERP 可以大幅改善。
在 VPS 上用 Docker 跑自建 DERP:
docker run -d --name derper \ --restart unless-stopped \ -p 443:443 \ -v /root/derper:/data \ ghcr.io/fredliang/derper:latest \ --hostname=derp.你的域名.com \ --certmode=manual \ --certdir=/data/certs
然后在 Tailscale 管理面板(admin.tailscale.com)的 ACL 里添加 DERP 配置:
{
"derpMap": {
"Regions": {
"900": {
"RegionID": 900,
"RegionCode": "custom",
"RegionName": "My DERP",
"Nodes": [
{
"Name": "custom1",
"RegionID": 900,
"HostName": "derp.你的域名.com"
}
]
}
}
}
}
选离自己近的云节点建 DERP,同城直连延迟可以做到个位数毫秒;官方 DERP 在东京/新加坡,延迟 80-150ms。体验差距很大。
第四步:VPS 代理出墙
VPS 在国内,下载 GitHub / Docker Hub 经常超时。解决方案是借 Windows 上的 Clash Verge 做代理。
Windows Clash Verge 端口
Clash Verge 开机自启,监听端口(默认值,按你实际配置为准):
| 端口 | 协议 |
|---|---|
| 7890 | HTTP |
| 7892 | Mixed (HTTP+SOCKS5) |
| 7897 | SOCKS5 |
VPS 走 Tailscale 到 Windows 代理
因为 VPS 和 Windows 在同一个 Tailscale 网络,VPS 可以直接访问 Windows 的 Clash 端口(把 100.64.0.1 换成你的 Windows Tailscale IP):
# VPS 上临时走代理
export https_proxy=socks5://100.64.0.1:7897
export http_proxy=socks5://100.64.0.1:7897
# 测试
curl -I https://github.com
# git 走代理
git clone https://github.com/xxx/yyy.git -c http.proxy=socks5://100.64.0.1:7897
注意:Clash Verge 需要开启「允许局域网连接」(Allow LAN),否则只接受 127.0.0.1 的请求,Tailscale 来的连接会被拒。
为什么不用 Cloudflare WARP
试过在 VPS 上装 WARP(warp-cli),结果国内完全不可用:
wgcf注册成功,但 WireGuard handshake 0 字节接收- 原因是 GFW 的 DPI(深度包检测)会拦截 WireGuard 协议的特征握手包
- WARP 全局模式还会劫持 Tailscale 的 UDP 流量,导致打洞失败
结论:国内 VPS 别用 WARP,走 Clash 代理更靠谱。
如果一定要用 WARP,必须设 warp-cli mode proxy(只起本地 SOCKS5 代理,不劫持全局流量),但 handshake 被拦的问题依然存在。
第五步:Cloudflare Tunnel(可选)
VPS 上还跑了 Cloudflare Tunnel(cloudflared),把内网服务通过 Cloudflare 网络暴露到自定义域名,不需要开公网端口:
# 安装
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o /usr/bin/cloudflared
chmod +x /usr/bin/cloudflared
# 用 token 方式运行(推荐)
cloudflared tunnel run --token 你的TOKEN
systemd 服务文件 /etc/systemd/system/cloudflared.service:
[Unit]
Description=cloudflared
After=network-online.target
Wants=network-online.target
[Service]
TimeoutStartSec=15
Type=notify
ExecStart=/usr/bin/cloudflared --no-autoupdate tunnel run --token 你的TOKEN
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
域名到期换新域名时,只需要在 Cloudflare Dashboard 里把 Tunnel 的路由(ingress rules)从旧域名改到新域名,VPS 上的配置不用动。
SSH 配置备忘
本机 SSH config(~/.ssh/config):
Host homeserver
HostName 192.168.1.100
User your-username
在家时直连局域网 IP(延迟最低)。外出时把 HostName 改成 Tailscale IP 即可。
踩坑记录
1. WARP 会劫持 Tailscale 流量
WARP 默认全局模式会把所有流量(包括 Tailscale 的 UDP 打洞包)都走 Cloudflare。必须用 proxy 模式,但国内 WireGuard 被 GFW DPI 拦截,所以 WARP 在国内 VPS 上基本废了。
2. WSL2 mirrored networking 不是标准 NAT
传统 WSL2 文档说服务绑 0.0.0.0 需要端口转发才能从外部访问。但 mirrored 模式下 WSL 直接共享 Windows 的网络栈,绑 0.0.0.0 的服务局域网直接可达。配置网络相关的东西时要记得这个区别。
3. socat 端口被扫描
用 3389 这种常见端口容易被扫。改成 13389 这种高位端口 + 安全组只放行特定来源 IP 可以减少风险。更好的方案是只允许 Tailscale 网络访问(但 Mac 不在 Tailscale 网络里,所以这条不适用)。
4. Clash Verge 必须开 Allow LAN
VPS 通过 Tailscale 访问 Windows 的 Clash 端口时,来源 IP 是 Tailscale 地址,不是 127.0.0.1。如果 Clash 没开「允许局域网连接」,连接会被拒绝。
5. VPS 续费:换号薅羊毛
国内云厂商(腾讯云/阿里云)新人价通常 68-99 元/年,续费就涨到 200+。同号续费不划算,到期换新账号重新买新人价。选离自己近的节点(同城直连延迟最低),两家价格差不多,哪家有活动买哪家。
最终网络拓扑
| 设备 | 位置 | Tailscale IP | LAN IP | 用途 |
|---|---|---|---|---|
| Windows PC | 家里 | 100.64.0.1 | 192.168.1.x | 工作站 + RDP + Clash |
| WSL2 | Windows 内 | 共享 Windows | 192.168.1.x | 开发环境 |
| Linux 服务器 | 家里 | 100.64.0.3 | 192.168.1.100 | 本地服务 |
| 国内 VPS | 云端 | 100.64.0.2 | 公网 IP | DERP + socat + Tunnel |
| Mac 笔记本 | 外出 | 不加入 | — | RDP 客户端 |
所有
100.64.0.x和192.168.1.x都是示例地址,替换成你实际的 Tailscale 分配 IP 和局域网 IP。
费用总结
| 项目 | 费用 |
|---|---|
| 国内 VPS(2核2G) | 68-99 元/年(新人价) |
| Tailscale | 免费(Personal 计划) |
| Cloudflare Tunnel | 免费 |
| Clash Verge | 免费(已有机场订阅) |
| 总计 | 不到百元/年 |
一台百元级 VPS 搞定 DERP 中继 + RDP 中转 + 代理出墙 + Cloudflare Tunnel,性价比拉满。