痛点
跨云、跨地域服务器互联是运维老大难问题。传统方案要么搭 IPSec/WireGuard 手动维护密钥和路由表,要么买云厂商的 VPN Gateway 按小时计费。一旦节点数超过 10 台,配置复杂度指数上升:
- IPSec 隧道每增加一个节点,需要 N-1 条新隧道配置
- WireGuard 手动方案需要分发公钥、维护 AllowedIPs、处理 NAT 穿透
- 云厂商 VPN Gateway 单通道价格 $36-72/月,3 朵云互联成本直接翻 3 倍
核心需求: 10-50 台分布在 AWS、阿里云、自建 IDC 的服务器需要安全互联,要求零手动密钥管理、自动 NAT 穿透、节点增删不影响已有网络。
方案
Tailscale — 基于 WireGuard 的零配置 Mesh VPN。核心架构:
- 控制平面(Coordination Server): 负责密钥交换和节点发现,不转发数据流量
- 数据平面: 节点间直接建立 WireGuard 隧道,P2P 直连,延迟等同裸网络
- NAT 穿透: 内置 DERP 中继 + STUN,99% 场景无需手动配端口映射
一台新服务器加入网络只需一条命令,无需改防火墙、无需分发密钥、无需重启已有节点。
实操步骤
第 1 步:安装 Tailscale 并加入网络
# Debian/Ubuntu
curl -fsSL https://tailscale.com/install.sh | sh
# 加入 Tailnet(首次需浏览器认证,服务器用 authkey)
# 生成 authkey:Tailscale Admin Console → Settings → Keys → Generate auth key
tailscale up --authkey=tskey-auth-xxxxx --hostname=aws-prod-web01
# 验证连接
tailscale status
# aws-prod-web01 100.64.0.1 linux -
# aliyun-db01 100.64.0.2 linux -
# idc-monitor01 100.64.0.3 linux -
第 2 步:配置 ACL 控制访问策略
在 Tailscale Admin Console 的 Access Controls 中定义 JSON 策略:
{
"acls": [
// 运维组可以访问所有节点
{"action": "accept", "src": ["group:ops"], "dst": ["*:*"]},
// Web 服务器只能访问 DB 的 3306/5432 端口
{"action": "accept", "src": ["tag:web"], "dst": ["tag:db:3306,5432"]},
// 监控服务器可以访问所有节点的 9100(node_exporter)
{"action": "accept", "src": ["tag:monitor"], "dst": ["*:9100"]}
],
"tagOwners": {
"tag:web": ["group:ops"],
"tag:db": ["group:ops"],
"tag:monitor": ["group:ops"]
}
}
给节点打标签:
# 在目标节点执行
tailscale up --authkey=tskey-auth-xxxxx --advertise-tags=tag:web
第 3 步:开启 Subnet Router 打通已有内网段
当部分服务器无法安装 Tailscale(如托管数据库 RDS、旧系统),使用 Subnet Router 代理:
# 在同 VPC 的一台已装 Tailscale 的节点上
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 通告子网路由(如 AWS VPC 网段 10.0.0.0/16)
tailscale up --advertise-routes=10.0.0.0/16 --authkey=tskey-auth-xxxxx
# 在 Admin Console 审批该路由后,其他 Tailscale 节点即可访问 10.0.0.0/16
第 4 步:与 Prometheus 监控集成
利用 Tailscale 内网 IP 替代公网暴露 metrics 端口:
# prometheus.yml - 直接用 Tailscale IP,无需公网开放 9100
scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets:
- '100.64.0.1:9100' # aws-prod-web01
- '100.64.0.2:9100' # aliyun-db01
- '100.64.0.3:9100' # idc-monitor01
效果: node_exporter 只绑定 Tailscale 接口,公网完全不暴露监控端口,零额外防火墙规则。
3 个常见坑
坑 1:Subnet Router 单点故障
现象: Subnet Router 节点宕机,整个子网段不可达。
解法: 部署 2 台 Subnet Router 通告相同网段,Tailscale 自动做高可用切换:
# 节点 A 和节点 B 都执行
tailscale up --advertise-routes=10.0.0.0/16
# Admin Console 同时 approve 两台的路由即可
坑 2:Auth key 过期导致节点批量掉线
现象: 默认 authkey 90 天过期,节点需要重新认证。
解法: 生成 key 时勾选 Reusable + Pre-approved,并设置节点 Key Expiry 为 Disable key expiry(在 Admin Console → Machines → 对应节点 → Disable key expiry)。
坑 3:DERP 中继导致高延迟
现象: 跨区域节点间延迟 200ms+,实际走了 DERP 中继而非直连。
排查:
tailscale ping aliyun-db01
# pong from aliyun-db01 (100.64.0.2) via DERP(tok) in 189ms
# 如果显示 via DERP 说明未直连
# 检查是否有严格 NAT 阻断了 UDP
tailscale netcheck
# 确认 UDP: true,MappingVariesByDestIP: false
解法: 在防火墙/安全组放行 UDP 41641 出站,或在内网部署私有 DERP 服务器降低中继延迟。
总结
| 维度 | 传统 WireGuard | 云厂商 VPN GW | Tailscale |
|---|---|---|---|
| 新节点接入 | 改所有节点配置 | 控制台配置 | 一条命令 |
| NAT 穿透 | 手动处理 | 不涉及 | 自动 |
| ACL 管理 | iptables 分散 | 安全组 | 集中 JSON |
| 成本(20节点) | 人力成本高 | ~$150/月 | 免费(100节点内) |
| 跨云支持 | 需要公网 IP | 单云厂商 | 任意网络 |
核心结论: 对于 10-100 台跨云服务器互联场景,Tailscale 是目前运维成本最低的方案。免费版支持 100 台设备、3 用户,覆盖大部分中小团队需求。生产环境建议开启 ACL + 双 Subnet Router + 禁用 key 过期,确保安全性和高可用。