Die Oberfläche ist lokalisiert; Skill-Beschreibungen und -Dokumente werden per KI automatisch in Ihre Sprache übersetzt. Code, Befehle, Pfade und Fachbegriffe bleiben im Original, maßgeblich ist das Dokument des Autors.
Skills entdecken
Bereitstellung und Betrieb · SKILL.md

deploying-tailscale-for-zero-trust-vpn

deploying-tailscale-for-zero-trust-vpn

部署并配置 Tailscale 作为基于 WireGuard 的零信任网状 VPN,具备身份感知访问控制、ACL 和出口节点,实现安全的点对点连接。

Independent GitHub snapshot · Automated classification · Original documentation governs

Skill-Dokumentation

GitHub

name: deploying-tailscale-for-zero-trust-vpn description: 部署并配置 Tailscale 作为基于 WireGuard 的零信任网状 VPN,具备身份感知访问控制、ACL 和出口节点,实现安全的点对点连接。 domain: cybersecurity subdomain: zero-trust-architecture tags: [zero-trust, tailscale, wireguard, mesh-vpn, ztna, peer-to-peer, acl, identity-aware, headscale] version: "1.0" author: mahipal license: Apache-2.0

为零信任 VPN 部署 Tailscale

概述

Tailscale 是一种基于 WireGuard 构建的零信任网状 VPN,无需传统 VPN 服务器或复杂网络配置,即可在设备之间创建加密的点对点连接。Tailscale 网络(tailnet)中的每个连接都使用 WireGuard 的 Noise 协议框架和 Curve25519 密钥交换进行端到端加密。Tailscale 通过身份提供商认证每个连接请求、执行细粒度访问控制列表(ACL),以及支持出口节点(exit node)、子网路由器、MagicDNS 和 Tailscale SSH 等功能来实现零信任网络。对于偏好自托管基础设施的组织,Headscale 提供了 Tailscale 控制服务器的开源实现。

前置条件

  • 身份提供商(Okta、Azure AD、Google Workspace、GitHub 或兼容 OIDC 的提供商)
  • 运行受支持操作系统的设备(Linux、Windows、macOS、iOS、Android、FreeBSD)
  • 配置 DNS 和防火墙规则的管理员权限
  • 了解 WireGuard 协议基础知识
  • 子网路由需求的网络规划文档

架构

                    Tailscale 协调服务器
                    (或自托管 Headscale)
                           |
                    密钥分发
                    & NAT 穿透
                           |
         +-----------------+-----------------+
         |                 |                 |
    +----+----+      +----+----+      +----+----+
    | 节点 A  |<---->| 节点 B  |<---->| 节点 C  |
    | (Linux) |      | (macOS) |      |(Windows)|
    +---------+      +---------+      +---------+
    WireGuard         WireGuard        WireGuard
    加密 P2P 隧道    加密 P2P 隧道    加密 P2P 隧道

    每个节点与其他所有节点直接连接。
    仅在直连 P2P 失败时使用 DERP 中继服务器。

安装和设置

Linux 安装

# 添加 Tailscale 仓库并安装
curl -fsSL https://tailscale.com/install.sh | sh

# 启动 Tailscale 并进行认证
sudo tailscale up

# 检查连接状态
tailscale status

# 查看分配的 IP 地址
tailscale ip -4
tailscale ip -6

Windows / macOS 安装

# Windows:从 https://tailscale.com/download/windows 下载
# macOS:通过 Homebrew 安装
brew install --cask tailscale

# 或从 https://tailscale.com/download/mac 下载

Docker 部署

# 用于 Tailscale sidecar 的 docker-compose.yml
version: '3.8'
services:
  tailscale:
    image: tailscale/tailscale:latest
    container_name: tailscale
    hostname: my-service
    environment:
      - TS_AUTHKEY=tskey-auth-xxxxx  # 预认证密钥
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--advertise-tags=tag:container
    volumes:
      - tailscale-state:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - net_admin
      - sys_module
    restart: unless-stopped

volumes:
  tailscale-state:

Kubernetes 部署

# Tailscale Kubernetes Operator
apiVersion: v1
kind: Secret
metadata:
  name: tailscale-auth
  namespace: tailscale
type: Opaque
stringData:
  TS_AUTHKEY: "tskey-auth-xxxxx"
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: tailscale
  namespace: tailscale
spec:
  selector:
    matchLabels:
      app: tailscale
  template:
    metadata:
      labels:
        app: tailscale
    spec:
      containers:
      - name: tailscale
        image: tailscale/tailscale:latest
        env:
        - name: TS_AUTHKEY
          valueFrom:
            secretKeyRef:
              name: tailscale-auth
              key: TS_AUTHKEY
        - name: TS_KUBE_SECRET
          value: tailscale-state
        - name: TS_USERSPACE
          value: "true"
        securityContext:
          capabilities:
            add: ["NET_ADMIN"]

访问控制列表(ACL)

Tailscale ACL 使用声明式 JSON 格式定义 tailnet 内谁可以访问什么。默认策略为拒绝所有,从设计上实现零信任。

{
  "acls": [
    // 工程团队可以访问开发服务器
    {
      "action": "accept",
      "src": ["group:engineering"],
      "dst": ["tag:dev-server:*"]
    },
    // SRE 团队可以访问生产基础设施
    {
      "action": "accept",
      "src": ["group:sre"],
      "dst": ["tag:production:22,443,8080"]
    },
    // 数据库访问仅限后端服务
    {
      "action": "accept",
      "src": ["tag:backend"],
      "dst": ["tag:database:5432,3306,27017"]
    },
    // 所有员工可以访问内部工具
    {
      "action": "accept",
      "src": ["group:employees"],
      "dst": ["tag:internal-tools:443"]
    }
  ],

  "groups": {
    "group:engineering": ["user@company.com", "dev@company.com"],
    "group:sre": ["sre@company.com", "oncall@company.com"],
    "group:employees": ["autogroup:members"]
  },

  "tagOwners": {
    "tag:dev-server": ["group:engineering"],
    "tag:production": ["group:sre"],
    "tag:backend": ["group:sre"],
    "tag:database": ["group:sre"],
    "tag:internal-tools": ["group:sre"],
    "tag:container": ["group:sre"]
  },

  "ssh": [
    {
      "action": "check",
      "src": ["group:sre"],
      "dst": ["tag:production"],
      "users": ["root", "admin"]
    },
    {
      "action": "accept",
      "src": ["group:engineering"],
      "dst": ["tag:dev-server"],
      "users": ["autogroup:nonroot"]
    }
  ],

  "nodeAttrs": [
    {
      "target": ["autogroup:members"],
      "attr": ["funnel:deny"]
    }
  ]
}

出口节点和子网路由

配置出口节点

# 在出口节点机器上
sudo tailscale up --advertise-exit-node

# 在客户端机器上使用出口节点
sudo tailscale up --exit-node=<exit-node-ip>

# 验证出口节点路由
curl ifconfig.me  # 应显示出口节点的公网 IP

子网路由器配置

# 通过 Tailscale 发布本地子网
sudo tailscale up --advertise-routes=10.0.0.0/24,192.168.1.0/24

# 在 Linux 上启用 IP 转发
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# 在客户端上接受路由
sudo tailscale up --accept-routes

Tailscale SSH(零信任 SSH)

Tailscale SSH 以基于身份的访问取代传统 SSH 密钥管理。

# 在服务器上启用 Tailscale SSH
sudo tailscale up --ssh

# 使用 Tailscale SSH 连接(无需 SSH 密钥)
ssh user@hostname  # 通过 Tailscale 身份认证

# 会话录制(审计日志)
# 在 ACL 策略中配置:
# "ssh": [{"action": "check", "src": [...], "dst": [...], "users": [...]}]
# "check" 操作要求重新认证并录制会话

MagicDNS 配置

# MagicDNS 在新 tailnet 中默认启用
# 通过主机名而非 IP 访问设备
ping my-server  # 通过 MagicDNS 解析

# 通过管理控制台进行自定义 DNS 配置
# 分割 DNS:将特定域名路由到内部 DNS 服务器
# 全局域名服务器:覆盖默认 DNS 解析

使用 Headscale 自托管

# 安装 Headscale(开源 Tailscale 控制服务器)
wget https://github.com/juanfont/headscale/releases/latest/download/headscale_linux_amd64
chmod +x headscale_linux_amd64
sudo mv headscale_linux_amd64 /usr/local/bin/headscale

# 创建配置
sudo mkdir -p /etc/headscale
sudo headscale generate config > /etc/headscale/config.yaml

# 编辑配置以适应您的环境
# 关键设置:
#   server_url: https://headscale.example.com
#   listen_addr: 0.0.0.0:8080
#   private_key_path: /etc/headscale/private.key
#   db_type: sqlite3
#   db_path: /var/lib/headscale/db.sqlite

# 启动 Headscale
sudo headscale serve

# 创建用户和预认证密钥
headscale users create myorg
headscale preauthkeys create --user myorg --reusable --expiration 24h

# 将 Tailscale 客户端连接到 Headscale
tailscale up --login-server https://headscale.example.com

安全加固

密钥到期和轮换

# 在管理控制台设置密钥到期(默认:180 天)
# 定期强制重新认证

# 为服务器禁用密钥到期(改用认证密钥)
sudo tailscale up --authkey=tskey-auth-xxxxx

# 用于自动部署的预认证密钥
# 为 CI/CD 创建临时单次使用密钥

设备授权

{
  "nodeAttrs": [
    {
      "target": ["autogroup:members"],
      "attr": [
        "mullvad:deny",
        "funnel:deny"
      ]
    }
  ],
  "autoApprovers": {
    "routes": {
      "10.0.0.0/24": ["group:sre"],
      "192.168.0.0/16": ["group:sre"]
    },
    "exitNode": ["group:sre"]
  }
}

网络锁(Tailnet Lock)

# 使用签名密钥初始化网络锁
tailscale lock init

# 添加受信任签名密钥
tailscale lock add nodekey:xxxxx

# 所有新节点加入前需要签名
# 防止未授权节点加入 tailnet

监控和可观测性

# 查看网络状态
tailscale status --json | jq '.Peer | to_entries[] | {name: .value.HostName, online: .value.Online, os: .value.OS}'

# 检查连接质量
tailscale ping <peer-ip>

# 查看网络拓扑图
tailscale netcheck

# 审计日志在 Tailscale 管理控制台中可查
# 通过 Webhook 或 API 集成 SIEM

集成模式

服务网格集成

# Tailscale 作为服务间通信的 sidecar
# 每个服务获得一个 Tailscale 身份
# ACL 执行服务间访问策略

# 示例:API 服务只能访问数据库服务
# ACL:tag:api -> tag:database:5432

CI/CD 流水线集成

# 在 CI/CD 中使用临时认证密钥
export TS_AUTHKEY=tskey-auth-xxxxx-ephemeral
tailscale up --authkey=$TS_AUTHKEY --hostname=ci-runner-$CI_JOB_ID

# 在构建/部署过程中访问内部资源
# 容器停止时节点自动移除

参考资料

Gespeicherte Skills