Tailscale / WireGuard:给团队建私有 VPN(不开公网)

起因

团队 / 个人需要访问内部服务:

  • 内网 dev server / Postgres / 监控仪表盘
  • 多机 ssh 不暴露公网
  • 跨地点协作(家 / 办公室 / 出差)

老方案:

  • 开 22 端口公网 + fail2ban:被扫被打
  • OpenVPN:配置复杂、性能一般
  • ssh tunnel + jump host:能用但碎

WireGuard:现代 VPN 协议,几百行 C 代码,内核态,10x OpenVPN 性能。
Tailscale:WireGuard 之上的 mesh VPN,自动 NAT 穿透 + 身份认证。

我家里 / 公司 / 客户机器 30+ 节点全 Tailscale,5 分钟搭好。

Tailscale 用法

# Mac
brew install tailscale

# Linux
curl -fsSL https://tailscale.com/install.sh | sh

# 启动 + 登录(浏览器 OAuth)
sudo tailscale up

# 看节点
tailscale status

每台机器装好登录同账号 → 自动加入私有 mesh。
每节点拿个 100.x.y.z 内网 IP(CGNAT range)。

跨机器:

ssh [email protected]          # 用 tailscale IP
ssh user@my-laptop           # 或者用 hostname (MagicDNS)

MagicDNS

tailscale set --accept-dns       # 启用 MagicDNS

每节点名(hostname)自动解析:

ssh my-laptop                # 等价 100.64.1.2
curl http://my-server:8080

不用记 IP。

节点 expose

# 在内网 server 上
tailscale up --advertise-routes=10.0.0.0/24

让 tailscale network 能访问那台机器背后的整个子网(subnet router)。
家里 NAS / 路由器 / 旧设备一并访问。

ACL

Tailscale admin 控制台配 ACL(json):

{
    "acls": [
        { "action": "accept", "src": ["group:admin"], "dst": ["*:*"] },
        { "action": "accept", "src": ["group:dev"], "dst": ["tag:dev-server:*"] },
    ],
    "groups": {
        "group:admin": ["[email protected]"],
        "group:dev": ["[email protected]", "[email protected]"],
    },
    "tagOwners": {
        "tag:dev-server": ["group:admin"],
    },
}

dev 组只能访问 dev-server tag 节点,admin 能访问全部。
基于身份的 zero-trust 网络。

SSH

# 启用 Tailscale SSH(替代 OpenSSH)
sudo tailscale up --ssh

tailscale ssh user@host 用 tailscale 身份做 SSH key 替代。
忘记管 SSH key + ACL 一处控制。

funnel(公网暴露)

tailscale serve --https=443 localhost:3000      # 内部用
tailscale funnel --https=443 localhost:3000     # 公网暴露(HTTPS 自动)

funnel 让任意 tailscale URL 公网可达,自动 HTTPS(Let's Encrypt)。
不开 router 端口 + 不要 cloudflare 中转就把本地服务对公网。

WireGuard 原生(不用 Tailscale)

更轻量但要自己 NAT 穿透 / key 分发。

sudo apt install wireguard

# 生成 key
wg genkey | tee privatekey | wg pubkey > publickey

server wg0.conf

[Interface]
PrivateKey = <server-priv>
Address = 10.0.0.1/24
ListenPort = 51820

[Peer]
PublicKey = <client-pub>
AllowedIPs = 10.0.0.2/32

client:

[Interface]
PrivateKey = <client-priv>
Address = 10.0.0.2/24

[Peer]
PublicKey = <server-pub>
Endpoint = vpn.example.com:51820
AllowedIPs = 10.0.0.0/24
PersistentKeepalive = 25

启动:

sudo wg-quick up wg0

简单可控但没 NAT 穿透(client 直连 server 端口必须可达)。
mesh 不行(每节点连每节点 → key 矩阵)。

Tailscale 是 WireGuard 之上的什么

  • key 分发自动化
  • DERP 中继服务(双 NAT 时 fallback)
  • 身份系统(OAuth + ACL)
  • MagicDNS
  • admin UI

WireGuard 协议是 Tailscale 的 data plane。

性能

iperf3 测试,两台 1 Gbps 机器:

  • 直连:940 Mbps
  • WireGuard:920 Mbps (~2% overhead)
  • Tailscale:900 Mbps (NAT 穿透成功)
  • Tailscale (DERP 中继):100-300 Mbps

NAT 友好时性能几乎无损。复杂 NAT fallback DERP 会慢。

Headscale(开源 Tailscale 控制面)

Tailscale 客户端开源 + 协议公开,但控制面是 SaaS。
担心 vendor lock-in / 完全自托管 → Headscale:

docker run -d -p 8080:8080 \
    -v ./config.yaml:/etc/headscale/config.yaml \
    headscale/headscale serve

自己跑控制面,Tailscale 客户端连。
免费 + 完全控制。

与 NetMaker / ZeroTier 对比

  • ZeroTier:跟 Tailscale 类似 mesh VPN,更老,OG
  • NetMaker:开源,self-host,WireGuard 之上
  • Nebula(Slack 出):CA 模型,性能极好

我用 Tailscale:

  • 易用性最好
  • 个人免费 tier 100 device
  • ACL / SSH / funnel 集成

实战 case:跨地点开发

我家、办公室、客户公司、3 个云服务器(DigitalOcean / Hetzner / AWS)
全 Tailscale:

  • ssh 任意机器:ssh alice@office-server
  • 内网 DB 直连:psql -h 100.x.y.z
  • 客户给我个 server 加入 group → 我能 ssh,3 个月后他 revoke
  • 出差咖啡店 wifi → 一样工作
  • 公网 0 开放(除了 80/443 给 web)

安全 + 方便 + 0 复杂网络配置。

与 Cloudflare Zero Trust 对比

Cloudflare Access (Zero Trust):

  • 主要给 HTTP 服务(不是 IP-level mesh)
  • 优势:浏览器原生 + SSO 集成
  • 劣势:每协议要单独配 / 不能 ssh

Tailscale 是 network layer(all IP traffic)。
Cloudflare Access 是 application layer。

我两个都用:
- ssh / 内网服务 → Tailscale
- 内部 web app → Cloudflare Access (OIDC)

踩过的坑

  1. subnet router 不工作--advertise-routes 后 admin console
    要 approve route。

  2. double NAT 性能慢tailscale netcheck 看 NAT 类型。CGNAT
    背后 fallback DERP,慢。

  3. MagicDNS 冲突:本机 /etc/hosts 已经有 hostname → 解析错。
    tailscale set --accept-dns=false 或者删 /etc/hosts。

  4. WireGuard MTU:跨 VPN 隧道 packet MTU 减小,应用大 packet 慢。
    MTU = 1280 或者调。

  5. 退订机器忘删:员工离职后 device 还在 admin console。定期清理

  6. ACL 跟着员工 group 自动。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。