饮墨

子安饮墨馀三斗,留与卿儿作赋来

用 Tailscale 组建零配置跨云内网:替代传统 VPN 的 3 个运维场景实操

痛点

跨云、跨地域服务器互联是运维老大难问题。传统方案要么搭 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 过期,确保安全性和高可用。

您还没有登录,请登录后发表评论。