cd ../blog
Tailscale网络VPS远程办公

Tailscale + VPS 中转:打通家里 Windows/Linux 与远程设备

cooler404
2026-06-21
~6min read

为什么需要这套架构

场景很简单:家里有一台 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 PC100.64.0.1家里工作站(替换成你的实际 IP)
本地 Linux 服务器100.64.0.3LAN 192.168.1.100
国内 VPS100.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 模式(.wslconfignetworkingMode=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 开机自启,监听端口(默认值,按你实际配置为准):

端口协议
7890HTTP
7892Mixed (HTTP+SOCKS5)
7897SOCKS5

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 IPLAN IP用途
Windows PC家里100.64.0.1192.168.1.x工作站 + RDP + Clash
WSL2Windows 内共享 Windows192.168.1.x开发环境
Linux 服务器家里100.64.0.3192.168.1.100本地服务
国内 VPS云端100.64.0.2公网 IPDERP + socat + Tunnel
Mac 笔记本外出不加入RDP 客户端

所有 100.64.0.x192.168.1.x 都是示例地址,替换成你实际的 Tailscale 分配 IP 和局域网 IP。

费用总结

项目费用
国内 VPS(2核2G)68-99 元/年(新人价)
Tailscale免费(Personal 计划)
Cloudflare Tunnel免费
Clash Verge免费(已有机场订阅)
总计不到百元/年

一台百元级 VPS 搞定 DERP 中继 + RDP 中转 + 代理出墙 + Cloudflare Tunnel,性价比拉满。