饮墨

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

NetBird 自托管零信任组网实战:3 步替代 Tailscale 实现全自主可控

1 views

痛点

用过 Tailscale 的运维都知道它"开箱即用"的爽感——WireGuard 内核加持、NAT 穿透丝滑、ACL 一键下发。但当你把它用到生产环境,痛点逐渐暴露:

  1. 控制面依赖 SaaS — coordination server 在海外,国内/俄区节点注册慢甚至超时;一旦 Tailscale 服务降级,新节点加入和 ACL 变更全部阻塞。
  2. 数据主权 — 企业合规要求组网元数据(节点 IP、路由拓扑、用户身份)不能存放在第三方 SaaS。
  3. 成本 — 超过 100 节点后 Tailscale Teams 计费不低,跨境场景还得叠加 DERP 中继节点的云主机费用。

如果你需要 WireGuard Mesh + 零信任 ACL + 完全自托管NetBird 是当前最成熟的开源方案(Apache 2.0),控制面、中继、身份认证全部可以私有化部署。

方案概览

NetBird 架构三大组件:

组件 作用 部署位置
Management Server 节点注册、ACL 策略、DNS 管理 你的服务器(Docker)
Signal Server 节点间 WireGuard 握手信令交换 同上或独立部署
TURN/STUN Relay NAT 穿透失败时中继流量(coturn) 就近部署在各区域

身份认证对接 OIDC(Keycloak / Zitadel / Google),客户端支持 Linux / macOS / Windows / Android / iOS,内核态 WireGuard 传输。

对比 Tailscale:

维度 Tailscale NetBird 自托管
控制面 SaaS(Headscale 可替代但功能滞后) 原生自托管,功能完整
ACL 策略 JSON/HuJSON Web UI + API,支持按组/标签/网段
身份源 绑定 SSO 供应商 标准 OIDC,自由对接
中继 DERP(私有部署需自建) coturn 标准协议,生态成熟
开源协议 BSD(客户端) Apache 2.0(全栈)

实操步骤

第 1 步:部署 Management + Signal(Docker Compose)

# 在管理节点(建议 2C4G)执行
git clone https://github.com/netbirdio/netbird.git
cd netbird/infrastructure_files

# 生成配置(交互式,填入域名和 OIDC 信息)
./setup.env.example > setup.env
# 编辑 setup.env,关键字段:
# NETBIRD_DOMAIN=netbird.yourdomain.com
# NETBIRD_AUTH_OIDC_ISSUER=https://auth.yourdomain.com/realms/netbird
# NETBIRD_AUTH_CLIENT_ID=netbird-client
# NETBIRD_AUTH_SUPPORTED_SCOPES=openid profile email

docker compose up -d

启动后访问 https://netbird.yourdomain.com 进入管理控制台,通过 OIDC 登录。

第 2 步:各节点安装客户端并加入组网

# Linux 一键安装
curl -fsSL https://pkgs.netbird.io/install.sh | sh

# 指向自托管 Management Server 并登录
netbird up --management-url https://netbird.yourdomain.com:443

# 验证组网状态
netbird status
# 输出示例:
# Peers count: 5/5 connected
# FQDN: node-01.netbird.selfhosted
# NetBird IP: 100.64.0.1/16

第 3 步:配置 ACL 策略实现零信任隔离

通过 Web UI 或 API 创建策略:

// POST /api/policies
{
  "name": "prod-db-access",
  "description": "仅 SRE 组可访问生产数据库",
  "rules": [
    {
      "sources": ["group:sre-team"],
      "destinations": ["group:prod-databases"],
      "bidirectional": false,
      "protocol": "tcp",
      "ports": ["5432", "3306", "6379"]
    }
  ],
  "enabled": true
}

默认策略为 deny-all,只有显式放行的流量才能通过——这是真正的零信任,而非 Tailscale 默认 allow-all 再做减法。

避坑指南

坑 1:coturn 中继在对称 NAT 后失效

现象: 部分运营商(俄区 Rostelecom、部分中国移动 4G)使用对称 NAT,coturn 的 TURN-UDP 无法穿透。

解法: 在 coturn 配置中启用 TURN-TCP 和 TURN-TLS(443 端口),并在 NetBird Management 的 turn 配置段添加 TCP 中继地址:

# turnserver.conf 关键配置
listening-port=3478
tls-listening-port=443
lt-cred-mech
use-auth-secret
static-auth-secret=<your-secret>
relay-threads=4
# 关键:启用 TCP 中继
tcp-relay

坑 2:OIDC Token 过期导致节点频繁断连

现象: 节点每隔 1 小时断连重连,日志报 token expired

解法: 在 OIDC Provider(如 Keycloak)中将 offline_access scope 授予 NetBird 客户端,并确保 Refresh Token 有效期 > 30 天:

# Keycloak 管理端设置
Realm Settings  Tokens  SSO Session Max = 43200 (30天,分钟)
Client  netbird-client  Advanced  Refresh Token Max Reuse = 0

坑 3:大规模节点(500+)Management Server OOM

现象: 节点数超过 300 后 Management 容器内存持续增长直至 OOM。

解法: - 将后端存储从 SQLite 切换为 PostgreSQL:--datastore=postgres --datastore-uri="postgres://..." - Management Server 实例水平扩展(无状态设计),前面挂负载均衡 - 调整 --peer-sync-interval 从默认 5s 提高到 15s,降低全量同步频率

总结

NetBird 是目前 唯一同时满足"全栈开源 + 原生自托管 + 零信任 ACL + 生产可用" 的 WireGuard Mesh 方案:

  • 数据主权完全可控 — 元数据、信令、中继全在自己的基础设施
  • 跨境友好 — coturn 中继可按区域部署,避免单点依赖海外 SaaS
  • 运维成本可估 — 管理面 1 台 2C4G 即可支撑 500 节点,中继按区域 1-2 台轻量机

如果你的场景是"多区域服务器互联 + 合规要求自托管 + 需要细粒度访问控制",NetBird 比 Headscale + Tailscale 客户端的方案更完整、更省心。