多线路环境下 Tailscale 如何选择最优 DERPS 服务器节点

文章导读
Tailscale 客户端会自动测量所有可用 DERP 区域的延迟,并优先连接延迟最低的节点。在多线路环境下,核心在于确保自建节点或官方节点对所有运营商线路均可达,而非手动强制选择。
📋 目录
  1. 命令速用版
  2. 服务端多线路优化
  3. 客户端映射配置
  4. 验证与排查
  5. 常见坑
  6. 参考来源
A A

Tailscale 客户端会自动测量所有可用 DERP 区域的延迟,并优先连接延迟最低的节点。在多线路环境下,核心在于确保自建节点或官方节点对所有运营商线路均可达,而非手动强制选择。

先说结论:客户端默认会自动选择最优节点,自建节点需确保多线路路由回包一致。

  • 先定位:使用 netcheck 命令查看当前连接的中继区域和延迟。
  • 先做:配置策略路由确保多 WAN 口回包路径正确,防火墙放行 UDP 3478 和 TCP 443。
  • 再验证:切换不同网络环境客户端,确认均能连接至预期节点。

命令速用版

快速查看当前 DERP 连接状态和延迟,重点关注 Region 和 Latency:

tailscale netcheck

典型输出示例:

Region 1 (Singapore): 25ms
Region 900 (MyDERP): 5ms  <-- 期望连接的自建节点
UDP: true
IPv4: true
IPv6: false

查看当前节点连接的中继服务器区域:

tailscale status

服务端多线路优化

若服务器接入多条宽带线路,仅使用 UFW 放行端口无法解决回包路由问题,可能导致连接不稳定或单线失效。需配置 Linux 策略路由确保回包路径一致。

1. 配置策略路由

假设 eth0 为电信线路(IP: 1.1.1.1),eth1 为联通线路(IP: 2.2.2.2)。需确保来自某 IP 的请求回包仍从该 IP 发出:

# 创建路由表
echo "100 telecom" >> /etc/iproute2/rt_tables
echo "200 unicom" >> /etc/iproute2/rt_tables

# 添加规则:来自电信 IP 的流量走 telecom 表
ip rule add from 1.1.1.1 table telecom
ip route add default via 1.1.1.254 dev eth0 table telecom

# 添加规则:来自联通 IP 的流量走 unicom 表
ip rule add from 2.2.2.2 table unicom
ip route add default via 2.2.2.254 dev eth1 table unicom

2. 防火墙与端口

多线路环境下 Tailscale 如何选择最优 DERPS 服务器节点

确保服务器具备公网 IP,并开放以下标准端口:

  • UDP 3478:用于 STUN 服务,帮助穿透 NAT。
  • TCP 443:用于 HTTPS 中继流量(默认)。

使用 UFW 放行端口(配合上述策略路由):

sudo ufw allow 3478/udp
sudo ufw allow 443/tcp

3. 系统服务配置

在 systemd 服务文件中添加`--verify-clients`参数,防止未授权访问。示例/etc/systemd/system/derper.service

[Unit]
Description=Tailscale DERP Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/derper -hostname derp.example.com -certmode=letsencrypt -verify-clients
Restart=on-failure

[Install]
WantedBy=multi-user.target

客户端映射配置

官方 Tailscale 客户端会自动拉取控制平面下发的 DERP 地图。若使用自建控制平面(如 Headscale),需在配置文件中定义自定义 DERP 区域,客户端登录后即可自动识别。

Headscale 配置示例(config.yaml):

derp:
  server:
    enabled: true
    region_id: 900
    region_code: "myderp"
    region_name: "My Custom DERP"
    stun_listen_addr: "0.0.0.0:3478"
    private_key: "<private_key>"
    cert_mode: letsencrypt
    cert_domain: "derp.example.com"

配置完成后,重启 Headscale 服务,客户端登录新账号或刷新连接即可在 netcheck 中看到该区域。

验证与排查

再次运行tailscale netcheck,检查输出结果:

  • Region 字段:应显示你配置的自建区域代码(如 900)或最近的官方区域。
  • Latency 字段:延迟数值应显著低于连接海外官方节点时的延迟。
  • UDP 穿透:观察是否显示"UDP: true",若为 false 说明流量完全走中继。

常见坑

  • 证书问题:自建节点若使用域名,需确保证书有效且受信任,否则客户端会拒绝连接。
  • IPv6 兼容性:部分网络环境下 IPv6 优先级过高可能导致绕路,建议在服务器端同时配置 IPv4 和 IPv6 监听。
  • 端口冲突:确保中继端口未被其他服务占用,默认 HTTPS 端口 443 可能需要 root 权限或改用高位端口(需同步修改客户端配置)。
  • 路由回包:多线路环境下务必配置策略路由,否则可能出现请求从电信进、回包从联通出的情况,导致连接建立失败。

参考来源

  • Tailscale Official Documentation: DERP Servers
  • Headscale Configuration Reference
  • Linux Policy Routing (ip-rule, ip-route)