0. 前言:为什么要折腾这个?

作为一名深度学习研究生,我的显卡主机(Robot)放在实验室的校园网内,而我经常需要在宿舍或图书馆远程连接它跑代码。因为大家在学校都是处在二级路由下,局域网ssh连接使用的也是路由器分配的ip地址,离开局域网之后就无法连接。tailscale安装在本地和服务器上之后,会提供虚拟ip给你,使用这个ip就可以达到跟局域网相似的效果。

痛点: Tailscale 虽然好用,但在校园网这种复杂的 NAT 环境下,很难打通 P2P 直连。它默认会走官方的东京(Tokyo)中继服务器,导致:

  1. 延迟极高:Ping 值常年在 200ms+,VS Code Remote SSH 敲代码卡顿严重。

  2. 连接不稳定:晚高峰期经常断连。

解决方案: 利用一台阿里云 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 配置

打开,Machines - Tailscale

替换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: 901aliyun-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 certificatehandshake 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)

登录 Tailscale Admin Console

1. 端口对应了吗? 检查 JSON 里的 DERPPort 是否是 50443STUNPort 是否是 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 找人。

  • 解决:必须把你的 derpMap JSON 代码发给 Chenchen,让他贴到他自己账号的 ACL 配置里。


🚀 终极排查命令清单

当你遇到问题求助时,直接把这三个命令的结果发出来,一眼就能看出病灶:

  1. 服务器端docker logs derper --tail 10

  2. 客户端端tailscale netcheck

  3. 连接端tailscale status

常见问题就是,云服务器没有配置或添加安全组,其次是docker没有运行,还有ailscale Admin Console没有更改json文件(一旦当前服务器的中继服务器采用云服务器,其他被shared的用户也需要修改成相同的配置文件才能启用新中继)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐