Generated by Answer me with HTML 0.5.5 · 2026-10-22 02:23 · ★ Star on GitHub
DERP 跨境组网
一台建、两台建,分别长什么样
Lead: 一对设备只有一条会话。走中继,双向都走中继。跨境永远只有一段,区别只在这一段落在哪台机器上。
先说你可能卡在哪
三个地方容易想反:
- 以为设备与 DERP 之间走 WireGuard/UDP。实际是 HTTPS,跑在 TCP 上。
- 以为去程回程各走各的。实际一对设备只有一个载体。
- 以为多建一台就更稳。实际两台各算一个 region 会翻车。
你的三台机器
| 端口 | 现在谁占 | derper 要不要 |
|---|---|---|
| 80 | Caddy,ACME 续签 | 不用碰 |
| 443 | Caddy 或 Xray | 不用碰 |
| 8443 | 两台都空着 | 就用它 |
| 3478 UDP | 空着 | 建议关掉 |
- A:CN2 GIA,跑代理。Caddy 占 80,Xray 占 443。
- B:建站机,也是 Hermes 宿主机。Caddy 占 80 和 443。
- NAS:墙内,有公网 IP 但封 80/443。它只需要出站。
只建一台:放 A 还是放 B
放 A,跨境段吃到 CN2 GIA。
放 B,跨境段直达圣何塞。
- 放 A:线路最好。代价是 A 上多一个 tailscaled。
- 放 B:最省事。B 是终点也是中继,它的 DERP 连接走 loopback。
- 放 B 的风险在线路。Leaseweb 到国内的走向没有优化。
- A 与 B 都在国外,之间直连,这一段几乎不花钱。
两台都建:两种做法
官方文档原话:device-a connects to the DERP server that device-b is already using。
发起方连的是接收方的家。所以两家不同,路径就不同。
各算一个 region,正反走两条中继。
同一个 region 加 mesh,两台互转一跳。
- 两个 region:正反各用一条中继。带宽翻倍,延迟不对称。
- 同 region:两台要用
--mesh-with和--mesh-psk互连。 - 同 region 的代价:两台之间要有稳定 TCP,两台都装 tailscaled。
- 三台设备的规模,双中继的收益接近零。
四种做法对一眼
| 做法 | 跨境段 | 双向 | 判断 |
|---|---|---|---|
| 只建 A | CN2 GIA | 对称 | 质量最好 |
| 只建 B | 圣何塞直连 | 对称 | 最省事 |
| 两台两 region | 各走一边 | 不对称 | 别这样 |
| 两台同 region mesh | 就近节点 | 对称 | 复杂收益低 |
三级回落能做到几级
- A 与 B 要在同一个 region,并且互相 mesh。
- 两台必须都装 tailscaled。derper 的
--mesh-with指向对方。 - 第一步是按延迟选,不是按你写的顺序选。
- 第二步是同 region 内换节点,官方文档明确支持。
- 第三步取决于有没有保留官方 region,这是唯一的取舍点。
官方 map 里没有任何优先级字段。DERPNode 只有 HostName、IPv4、IPv6、CertName、DERPPort、STUNPort、STUNOnly、InsecureForTests。
所以「A 优先、B 次之」只能靠 A 的延迟真的更低。CN2 GIA 通常成立,但不是你能指定的。
随时开关行不行
tailscaled 和 derper 是两个独立进程。装一个不装另一个没问题。
systemctl stop derper 不影响 B 自己的节点身份。B 还在网内,只是不再转发。
但停掉之后会不会断,取决于 map:
| map 配法 | 开着 derper | 关掉 derper |
|---|---|---|
| 只留自建 region | 强制走自建 | 无 region 可退,直连被挡即断 |
| 自建加官方 region | 按延迟自选,可能不用你 | 自动回落官方 |
| 只留官方 region | derper 白跑 | 无影响 |
结论:想做优雅开关,就不能强制只走自建。这是一对矛盾。
还有两个耦合点:
--verify-clients要查本机 tailscaled。停掉 tailscaled 留着 derper,验证会失败。- B 的家只有自己时,关掉 derper 后它会一直重试死掉的 region。
要堵的四个坑
- 直连优先。连接先试 UDP,通了就降级成裸 WireGuard。在路由器封 NAS 出站 UDP 41641。
- 单条 TCP 复用。每个客户端只有一条 TLS 连接,所有 peer 挤在上面,会队头阻塞。
- 大流量别走中继。官方对 DERP 的定性是可靠,但 QoS 有限。
- peer relay 救不了。它监听 UDP 端口,拿不到 TCP 伪装。
落地顺序与参数
ls /dev/net/tun # 没有就先 modprobe tuncurl -fsSL https://tailscale.com/install.sh | shtailscale up# 容器是 host 网络,装完即可直连 NAS 的 100.xderper --hostname derp.example.com \ --certmode manual --certdir /etc/derp-certs \ --a :8443 --http-port=-1 --stun=false --verify-clients--http-port=-1必加。derper 默认要绑 80,Caddy 已经占着。两台同 region 时再加
--mesh-with 对方域名 --mesh-psk-file <文件>。PSK 文件里必须是 64 位小写十六进制。
证书复用 Caddy 已签的文件。Caddy 续期后要重启 derper。
--verify-clients必加。不加就是公开中继,别人能白嫖带宽。不要放在反代后面。它靠源地址识别客户端。
出现容器网络异常时,给 tailscaled 加
--netfilter-mode=nodivert。
带走一句
会话只有一条,中继是双向的。建一台还是两台,看跨境那一段落哪儿;两台拆成两个 region,只会自己打自己。
下一步取决于一件事:
哪块没看懂直接问我。