起因
团队 / 个人需要访问内部服务:
- 内网 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)
踩过的坑
-
subnet router 不工作:
--advertise-routes后 admin console
要 approve route。 -
double NAT 性能慢:
tailscale netcheck看 NAT 类型。CGNAT
背后 fallback DERP,慢。 -
MagicDNS 冲突:本机 /etc/hosts 已经有 hostname → 解析错。
tailscale set --accept-dns=false或者删 /etc/hosts。 -
WireGuard MTU:跨 VPN 隧道 packet MTU 减小,应用大 packet 慢。
MTU = 1280或者调。 -
退订机器忘删:员工离职后 device 还在 admin console。定期清理
- ACL 跟着员工 group 自动。
登录后参与评论。