知识广场

按学科筛选:计算机科学 / 后端开发 / 网络
清除筛选

«计算机科学 / 后端开发 / 网络» 分类下共 1 篇帖子

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 用法 ```bash # 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)。 跨机器: ```bash ssh [email protected] # 用 tailscale IP ssh user@my-laptop # 或者用 hostname (MagicDNS) ``` ## MagicDNS ```bash tailscale set --accept-dns # 启用 MagicDNS ``` 每节点名(hostname)自动解析: ```bash ssh my-laptop # 等价 100.64.1.2 curl http://my-server:8080 ``` 不用记 IP。 ## 节点 expose ```bash # 在内网 server 上 tailscale up --advertise-routes=10.0.0.0/24 ``` 让 tailscale network 能访问那台机器背后的整个子网(subnet router)。 家里 NAS / 路由器 / 旧设备一并访问。 ## ACL Tailscale admin 控制台配 ACL(json): ```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 ```bash # 启用 Tailscale SSH(替代 OpenSSH) sudo tailscale up --ssh ``` `tailscale ssh user@host` 用 tailscale 身份做 SSH key 替代。 忘记管 SSH key + ACL 一处控制。 ## funnel(公网暴露) ```bash 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 分发。 ```bash sudo apt install wireguard # 生成 key wg genkey | tee privatekey | wg pubkey > publickey ``` server `wg0.conf`: ```ini [Interface] PrivateKey = <server-priv> Address = 10.0.0.1/24 ListenPort = 51820 [Peer] PublicKey = <client-pub> AllowedIPs = 10.0.0.2/32 ``` client: ```ini [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 ``` 启动: ```bash 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: ```bash 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。定期清理 + ACL 跟着员工 group 自动。