type
Post
status
Published
date
Apr 30, 2026
slug
summary
本文记录了一次 Tailscale 远程连接变慢的完整排查过程:从 tailscale status 中发现连接家中 Mac mini 时走了海外 DERP 中继,到通过 tailscale netcheck 分析 UDP、IPv6、NAT 映射和最近 DERP 节点,最终确认问题不是设备故障,而是公司网络与家庭网络之间无法建立直连。为降低中继延迟,使用一台国内云服务器自建 DERP,并在 Tailscale ACL 中配置 derpMap。配置完成后,连接路径从 DERP(sfo/lax) 切换到 DERP(cn-self),延迟从几百毫秒甚至 2 秒左右降至 30~40ms,VNC 远程桌面体验明显改善。
tags
Tailscale
DERP
category
技术分享
icon
password
js
😀
最近发现从公司电脑连接家里的 Mac mini 时,Tailscale 延迟突然变高,VNC 变得非常卡。最开始以为是 Mac mini 的网络出了问题,但排查后发现,真正原因是 公司电脑和 Mac mini 无法建立直连,退回到了 Tailscale 海外 DERP 中继
最终通过在自己的国内服务器上搭建 DERP,中继延迟从几百毫秒降到了 30~40ms,VNC 体验明显恢复。

一、问题现象

在公司 Windows 电脑上 ping 家里的 Mac mini:
能 ping 通,但是延迟很高:
再看 Tailscale 状态:
发现 Mac mini 这一行是:
这说明:
所以延迟高是正常的,因为流量绕到了海外。

二、先确认是哪条链路出问题

在 Mac mini 上查看 Tailscale 状态:
macOS 图形版 Tailscale 可能没有直接把 tailscale 命令加到 PATH,所以要用完整路径:
测试 Mac mini 到服务器:
一开始可能是:
随后切到了 IPv6 直连:
说明:

三、查看 netcheck

公司 Windows 执行:
Mac mini 执行:
当时看到的关键信息是:
Windows:
Mac mini:
这里几个信息很重要:

1. UDP 是 true,不代表一定能直连

UDP: true 只能说明 UDP 可用,但 Tailscale 直连还要看两端 NAT、防火墙、运营商网络、公司网络策略等。

2. MappingVariesByDestIP=true 会增加打洞难度

Mac mini 这边显示:
这表示家里网络的 NAT 映射会根据目标地址变化(坑爹的电信把网络改成大内网了,NAT4)。这样的 NAT 对打洞不太友好,可能出现:

3. 公司电脑没有 IPv6

Windows 这边显示:
所以它没法像服务器一样通过 IPv6 和 Mac mini 建立快速直连,只能依赖 IPv4 打洞。IPv4 打洞失败后,就会退回 DERP。

四、为什么 Mac mini 连服务器很快,但连公司电脑很慢?

这个问题的核心是:Tailscale 的直连不是按设备判断,而是按“每一对设备”判断。
可以理解成三条链路:
云服务器通常有公网 IP,网络环境简单,所以很容易直连。
而公司电脑在公司网络后面,家里 Mac mini 也在家庭 NAT 后面。两边都不是公网直连环境,中间又有公司网络、家庭路由器、运营商 NAT,就很容易打洞失败。

五、尝试过的方向:UDP 端口映射

Tailscale 默认常见端口是 UDP 41641,所以一开始考虑在家里路由器上做端口映射:
但是 macOS 图形版 Tailscale 当前没有 tailscale up --port=41641 参数:
没有看到 --port
同时 netcheck 里看到的公网端口是随机的,例如:
这说明单纯映射 41641 未必一定生效。
所以最后没有继续折腾固定端口,而是选择更稳定的方案:自建 DERP

六、自建 DERP

1. DERP 的作用

DERP 是 Tailscale 的中继服务器。
当两台设备无法直连时,Tailscale 会通过 DERP 转发加密后的 WireGuard 流量。
默认 DERP 节点大多在海外,所以国内使用时可能出现:
如果自己在国内服务器上搭一个 DERP,就可以让无法直连的设备走自己的中继:

2. 准备条件

需要一台有公网 IP 的服务器,以及一个域名。
我的域名示例:
需要把 DNS 解析到这台服务器 IP。
服务器需要放行:
其中:

3. 安装 derper

服务器上安装 Go。
如果系统自带 Go 太老,可能会报错:
这说明 Go 版本太旧,需要安装新版 Go。
然后安装 derper:
安装后一般在:
确认:

4. 启动 derper

执行:
正常输出类似:
其中:
说明启动成功。
No mesh key configured 对单台 DERP 来说没问题,可以忽略。

5. 如果访问域名看到 Nginx 404

一开始我访问域名看到:
这说明访问到的是 Nginx,不是 derper。
原因可能是:
可以查看端口占用:
正常 derper 应该是:
如果看到 Nginx 占用 80/443,可以停止并卸载 Nginx:
我这次实际还有一个问题:DNS 配错了服务器 IP。修正 DNS 后就正常了。

七、配置 Tailscale derpMap

进入 Tailscale 管理后台:
在 ACL JSON 顶层添加 derpMap
注意:不要覆盖原来的 aclsgrants 等内容,只是在顶层增加一个 derpMap 字段。

八、刷新客户端

配置完后,Windows 和 Mac mini 都需要刷新 Tailscale。
Windows:
如果还没刷新,可以重启服务:
Mac mini:
然后分别执行:
以及:
成功后会看到:
我这里 Windows 看到:
Mac mini 看到:

九、最终效果

公司电脑执行:
最终结果:
对比之前:
效果非常明显。
VNC 也明显变快了,鼠标、键盘、页面刷新都舒服很多。

十、配置 derper 开机自启

为了避免服务器重启后 derper 停掉,需要配置 systemd。
创建服务:
写入:
启用:
查看日志:

十一、排查命令汇总

Windows

Mac mini

DERP 服务器

检查 DNS:

十二、总结

这次问题的根因不是 Mac mini 网络坏了,而是:
排查时要重点看:
最终通过自建国内 DERP,把中继路径从:
优化成:
延迟从几百毫秒降到 30~40ms,VNC 体验明显改善。
 
如何做出网页版在线聊天时,有新消息浏览器标签闪烁的效果用 Python 把「流水线 Agent」从即兴发挥,收敛成可复用的工具
Loading...