[特殊字符] 校园网深度学习远程开发救星:云部署私有 Tailscale DERP 中继保姆级教程 (从 200ms 降到 70ms)
作为一名深度学习研究生,我的显卡主机(Robot)放在实验室的校园网内,而我经常需要在宿舍或图书馆远程连接它跑代码。因为大家在学校都是处在二级路由下,局域网ssh连接使用的也是路由器分配的ip地址,离开局域网之后就无法连接。tailscale安装在本地和服务器上之后,会提供虚拟ip给你,使用这个ip就可以达到跟局域网相似的效果。Tailscale 虽然好用,但在校园网这种复杂的 NAT 环境下,很
0. 前言:为什么要折腾这个?
作为一名深度学习研究生,我的显卡主机(Robot)放在实验室的校园网内,而我经常需要在宿舍或图书馆远程连接它跑代码。因为大家在学校都是处在二级路由下,局域网ssh连接使用的也是路由器分配的ip地址,离开局域网之后就无法连接。tailscale安装在本地和服务器上之后,会提供虚拟ip给你,使用这个ip就可以达到跟局域网相似的效果。
痛点: Tailscale 虽然好用,但在校园网这种复杂的 NAT 环境下,很难打通 P2P 直连。它默认会走官方的东京(Tokyo)中继服务器,导致:
-
延迟极高:Ping 值常年在 200ms+,VS Code Remote SSH 敲代码卡顿严重。
-
连接不稳定:晚高峰期经常断连。
解决方案: 利用一台阿里云 ECS(上海节点)(任何云服务或者个人电脑都可以,尽量选择离距离近的节点),搭建私有的 DERP 中继服务器。 最终效果: 延迟稳定在 70ms 左右,开发体验从“PPT”变成了“本地级丝滑”。
1. 准备工作
-
本地机器:Windows 笔记本(宿舍/图书馆)
-
远程机器:Linux 服务器(实验室 Robot,处于校园网内)
-
中转机器:阿里云 ECS(Ubuntu 22.04,上海节点)
-
建议配置: 只要带宽别太低(3-5Mbps即可),CPU/内存要求很低。
-
2. 阿里云环境配置(踩坑实录)
2.1 服务器获取
阿里云会赠送新手试用期,我选择的是云服务器ECS免费试用(个人版)
2核(VCPU)2GiB(最低配置,阿里云的300免费额度可以用很久)
Ubuntu 22.04 64位
不要预安装任何东西。阿里云提供的docker版本太低,影响后续操作。
配置完成服务器后重置密码,开启远程连接,使用上面在线的或者其他ssh工具连接上述配置见面提供的公网ip
2.2 开放阿里云安全组(重中之重)


坑点:容器跑起来了,但客户端连不上。原因通常是安全组没开 UDP。 操作:去阿里云控制台 -> 安全组 -> 配置规则 -> 增加规则:
协议类型 ”自定义UDP“ 访问来源”0.0.0.0/0“ 端口 ”53478“ (用于 STUN 穿透,这个决定了低延迟)
协议类型 ”自定义TCP“ 访问来源”0.0.0.0/0“ 端口 ”50443“ (用于 HTTPS 握手)


设置好安全组之后,在实例的网络与安全组中,选择更换,勾选创建的安全组,确定
2.3云服务器环境配置
# 安装 Docker
sudo apt update && sudo apt install docker.io -y
# 安装 Docker Compose 速度慢等半小时
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
#部署 DERP 容器(解决镜像拉取困难)
mkdir -p ~/derper && cd ~/derper
#查看目录下所有文件
ls
#打开文件填写下述代码
nano docker-compose.yml
在derper下编写 docker-compose.yml,把下述代码保存到yml文件中
nano docker-compose.yml
version: '3.8'
services:
derper:
# 使用国内镜像源,解决拉取失败问题
image: ghcr.nju.edu.cn/gt-610/ip-derper:latest
container_name: derper
restart: unless-stopped
ports:
- "50443:443" # 映射 TCP 端口
- "53478:3478/udp" # 映射 UDP 端口(STUN 协议关键)
environment:
- DERP_VERIFY_CLIENTS=false # 暂时关闭验证,简化连接
ctrl + o 保存 ctrl + x退出
再nano docker-compose.yml 一次打开文件看是否保存,ctrl + x退出
启动容器
sudo docker-compose up -d
3.修改 Tailscale ACL 配置

替换HostName 到你自己的服务器Ip
{
// 静态用户组定义
"groups": {
// "group:example": ["alice@example.com", "bob@example.com"],
},
// 访问权限控制
"grants": [
// 允许所有节点互通
{
"src": ["*"],
"dst": ["*"],
"ip": ["*"],
},
],
// Tailscale SSH 权限
"ssh": [
{
"action": "check",
"src": ["autogroup:member"],
"dst": ["autogroup:self"],
"users": ["autogroup:nonroot", "root"],
},
],
// --- 自定义 DERP 中继服务器配置开始 ---
"derpMap": {
"OmitDefaultRegions": false,
"Regions": {
"901": {
"RegionID": 901,
"RegionCode": "aliyun",
"Nodes": [
{
"Name": "1",
"RegionID": 901,
"HostName": "你的服务器IP",
"DERPPort": 50443,
"STUNPort": 53478,
"InsecureForTests": true,
},
],
},
},
},
// --- 自定义 DERP 中继服务器配置结束 ---
}
4.测试是否配置成功
✅ 第一阶段:验证配置是否成功(Happy Path)
如果在客户端(你的 Windows 或 Robot)上看到以下现象,说明配置完全成功:
1. 检查中继列表 (最直观)
在客户端终端运行:
tailscale netcheck
成功标志:
-
列表中出现了你的自定义区域(如
RegionID: 901或aliyun-shanghai)。 -
延迟(Latency)显示数值(如 30ms-70ms),而不是横线或超时。
2. 检查当前连接路径 (最核心)
在客户端终端运行:
tailscale status
成功标志:
-
对端节点(peer)后面显示:
active; relay "aliyun-shanghai"。 -
失败标志:显示
relay "tok"(东京)、relay "hkg"(香港)或idle。
3. 延迟测试
ping <Robot的Tailscale IP>
成功标志:延迟稳定在 30ms - 80ms 之间(取决于地理距离)。如果超过 200ms,说明没走私有中继。
🔧 第二阶段:故障排查手册(Sad Path)
如果 tailscale status 依然显示 tok 或者根本连不上,请按顺序执行以下“手术级”排查:
🛠️ 第一层:查阿里云服务器 (Server Side)
1. 容器还活着吗?
# 在阿里云上执行
docker ps
-
检查点:状态必须是
Up。如果不断Restarting,说明配置或权限有误。
2. 端口在监听吗?
sudo netstat -tunlp | grep -E '50443|53478'
-
检查点:
-
tcp ... 50443 ... LISTEN(HTTPS 通道) -
udp ... 53478 ...(STUN 通道,这个最关键,决定能不能低延迟)
-
3. 容器日志报错了吗?
docker logs --tail 20 derper
-
检查点:如果出现
bad certificate或handshake failed,说明证书有问题,需要更新 ACL 里的CertName。
🌐 第二层:查网络连通性 (Network Side)
这是最容易出问题的地方(通常是防火墙背锅)。
1. 在客户端(Robot 或 Windows)用 nc 探测 TCP
# 替换为你的阿里云公网 IP
nc -vz 42.121.xx.xx 50443
-
成功:
succeeded! -
失败:
timed out-> 去阿里云控制台检查安全组 TCP 规则。
2. 在客户端探测 UDP (STUN)
# Windows 需要下载 netcat,Linux 直接用
nc -zvu 42.121.xx.xx 53478
-
成功:
succeeded! -
失败:
timed out-> 去阿里云控制台检查安全组 UDP 规则。-
注意:如果 TCP 通但 UDP 不通,连接会建立但延迟极高,且无法建立 P2P 辅助。
-
3. 验证 HTTPS 握手
curl -k https://42.121.xx.xx:50443
-
成功:返回一段 HTML 或
DERP字样。 -
失败:无响应。
📝 第三层:查 ACL 配置 (Configuration Side)
1. 端口对应了吗? 检查 JSON 里的 DERPPort 是否是 50443,STUNPort 是否是 53478。如果不小心填成了默认的 443/3478,而 Docker 映射的是 50443,就会连不上。
2. 证书指纹 (CertName) 对吗? 如果你在阿里云看到 Docker 日志里生成了新的证书指纹,必须把新的 CertName 更新到 JSON 里。或者简单粗暴点:
-
测试大法:在
Nodes列表里先把"CertName": "..."这一行删掉,只保留"InsecureForTests": true。保存后测试能否连接。(长期使用建议加上 CertName 以防中间人攻击)。
💻 第四层:查客户端状态 (Client Side)
1. 缓存清理 Tailscale 客户端有时会死守着旧的节点表。
# Linux
sudo tailscale up --force-reauth --accept-dns=false
# Windows
tailscale logout
tailscale login
2. 针对 Chenchen(跨用户)的特殊排查 如果你的机器能连,但 Chenchen 连不上:
-
核心原因:Tailscale 的 DERP 映射是不共享的。Chenchen 的账号在另一个 Tailnet(或者即便是同一个 Tailnet,如果 ACL 没下发到位),他的客户端根本不知道
Region 901是什么,也不知道要去42.121.xx.xx找人。 -
解决:必须把你的
derpMapJSON 代码发给 Chenchen,让他贴到他自己账号的 ACL 配置里。
🚀 终极排查命令清单
当你遇到问题求助时,直接把这三个命令的结果发出来,一眼就能看出病灶:
-
服务器端:
docker logs derper --tail 10 -
客户端端:
tailscale netcheck -
连接端:
tailscale status
常见问题就是,云服务器没有配置或添加安全组,其次是docker没有运行,还有ailscale Admin Console没有更改json文件(一旦当前服务器的中继服务器采用云服务器,其他被shared的用户也需要修改成相同的配置文件才能启用新中继)
更多推荐



所有评论(0)