Tailscale 私有网络指南:VPS 接入、子网路由与访问权限

把 VPS、家里的 NAS 和笔记本接入同一个 tailnet,分别设置设备访问、子网路由、出口节点与 SSH 权限,并用 Serve 访问本机服务。

·15 minAgentAIClaudeCodex
把应用部署到土耳其|BRNCHOST · 土耳其 VDS
云服务器,积分可续期|雨云 · 国内外节点 · 积分兑换权益
低价年付,大流量 VPS|RackNerd · SSD 存储 · 1Gbps 端口
香港轻量,搭个小站|晚安云 · 香港云服务器
香港 VPS,大带宽可选|野草云 · BGP 直连
大陆访问,精品线路|搬瓦工 · CN2 GIA / CTGNet 套餐
资料归档,交给 AI 整理|WorkBuddy · 本地文件处理
建站起步,先看应用镜像|腾讯云 · 轻量应用服务器
CN2 GIA,中国方向优化|DMIT · Premium 网络
双 ISP 原生住宅 IP|丽萨主机 · 美国 9929 精品线路
高频 CPU,多地部署|Evoxt · 云服务器 · 每周异地备份
京东云轻量云主机:129元/年,新人专享,限购1台

家里的 NAS、云上的测试服务器和随身笔记本不在同一张局域网里。要远程访问它们,可以给这些设备接入 Tailscale,再用私有地址连接 SSH、文件服务或管理页面。

Tailscale 基于 WireGuard 加密通信,负责设备发现、密钥管理和访问策略。两端网络允许时会尝试直连,无法直连时可经 DERP 中继。它能减少需要开放的公网入口,但服务本身的账号、监听地址和防火墙仍要配置。

它和传统 VPN 的差别,主要不在速度

WireGuard 本身已经把 VPN 协议做得足够轻。Tailscale 的价值不只是“用了 WireGuard,所以快”,而是替你处理了 WireGuard 在真实团队里最难维护的部分:

  • 每台设备的密钥怎么生成、分发、轮换。
  • NAT 后面的设备怎么互相发现。
  • 两台机器能直连就直连,不能直连时怎么走中继兜底。
  • 新人入职、设备更换、员工离职时,访问权限怎么跟身份系统联动。
  • 家里 NAS、云服务器、内网数据库、测试环境,怎么只暴露给该看到的人。

传统 VPN 往往是“连上网关就进了一个大内网”。这事省事,但权限边界粗。Tailscale 的思路更细:每台设备都是 tailnet 里的节点,能不能访问,尽量由身份和策略决定,而不是靠“你连进来了,所以默认都能看”。

使用人数增加后,需要明确谁可以访问服务器、哪些服务需要保留公网入口,以及设备更换或人员离开时如何撤销权限。先记录这些访问需求,再配置策略,后续维护会更清楚。

最小上手:先把两台机器拉进同一张私有网

以 Linux 服务器为例,官方提供了一条安装脚本。生产环境里你可以改成发行版包管理器安装,先跑通时这样最快:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

执行 tailscale up 后,终端会给出登录链接。用浏览器打开,选择 Google、GitHub、Microsoft 或企业 SSO 登录,授权后这台机器就进入你的 tailnet。

首次登录用 tailscale up;已经接入后,修改单项设置用 tailscale set,无需反复填写此前所有非默认参数。CLI 文档列出了两个命令的区别。

查看状态:

tailscale status

查看当前机器在 tailnet 里的 IP:

tailscale ip -4

另一台机器也安装并加入同一个 tailnet 后,在访问策略允许、服务监听地址和防火墙设置正确的前提下,可以用 Tailscale IP 访问它。下面两条命令分别用于 SSH 和 HTTP;user、100.x.y.z 及端口都要替换成实际值:

ssh user@100.x.y.z
curl http://100.x.y.z:8080

设备接入时会完成:设备注册、WireGuard 密钥交换、NAT 穿透、节点发现、加密链路建立。如果两端网络环境允许,流量会尽量点对点直连;如果打洞失败,会走 DERP 中继,仍然保持端到端加密。

MagicDNS:别再记 100.x.y.z

IP 能用,但不好记。Tailscale 的 MagicDNS 会给 tailnet 里的设备一个可读名字。比如一台机器叫 devbox,你可以直接:

ssh user@devbox
curl http://devbox:8080

小团队里这比写一堆内网 DNS 记录舒服多了。尤其是临时开发机、测试机、家用 NAS,经常换网络、换公网出口、换云厂商,固定公网 IP 反而不现实。设备名能跟着身份和 tailnet 走,网络位置变化就没那么折腾。

不过命名也要有纪律。别把机器都叫 server、test、ubuntu,后面迟早乱。建议按用途命名:

alice-macbook
build-runner-01
staging-api-s1
nas-home
agent-lab-01

名字不只是好看,后续写 ACL、排查访问、做审计都会用到。

Subnet Router:把整段内网接进来

很多时候你不是只想访问一台机器,而是想访问某个内网网段。比如家里有 NAS、路由器后台、打印机,或者云上有一个 VPC 私网段。Tailscale 的 Subnet Router 可以让一台已经加入 tailnet 的机器代为宣告某个内网网段。

假设这台 Linux 机器能访问 192.168.10.0/24,先打开 IP 转发:

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

然后启动 Tailscale 并宣告路由:

sudo tailscale set --advertise-routes=192.168.10.0/24

接下来要到 Tailscale 管理后台批准这条 route。批准路由后,还要在访问策略中允许目标网段和端口。Linux 客户端默认不接收子网路由,需要在要访问内网的那台 Linux 客户端上执行:

sudo tailscale set --accept-routes

Android、iOS、macOS、tvOS 和 Windows 默认接收这些路由。路由批准与访问授权是两件事;前者不能替代后者。完整条件见子网路由文档。

宣告网段前要确认它包含哪些资源。Subnet Router 等于把一段传统内网桥接进 tailnet,权限边界会变宽。比较稳的做法是:

  • 只宣告必要网段,不要一上来就把整个公司内网全打进去。
  • 给不同环境分开路由,比如家用、测试、生产不要混成一锅。
  • 配合 ACL 限制哪些用户和设备能访问这段网。
  • 对数据库、管理后台这类高风险服务,再加应用层账号和审计。

Tailscale 能让你少开公网端口,但不是让你把内网安全全交出去。

Exit Node:把某台机器当安全出口

Exit Node 的作用是把一台 tailnet 设备设置成全局流量出口。你在外面用公共 Wi-Fi 时,可以让笔记本的流量从家里服务器或可信云服务器出去。

如果出口机器是 Linux,先按上一节开启 IP 转发,再宣告它是出口节点:

sudo tailscale set --advertise-exit-node

到管理后台批准后,客户端选择这个 Exit Node 即可。Linux 客户端也可以命令行启用:

sudo tailscale set --exit-node=exit-node-name

把 exit-node-name 换成已批准的节点名。自定义访问策略还需允许使用 autogroup:internet;只允许访问出口机器的 SSH 端口,并不能授权它代转互联网流量。用完后可以取消该客户端的出口选择:

sudo tailscale set --exit-node=

出口节点文档说明了客户端选择、审批及访问权限的关系。它适合三类场景:

  • 出差或公共网络下,把流量走回可信出口。
  • 访问只允许某个固定出口 IP 的内部服务。
  • 给临时测试环境提供一个稳定访问路径。

Exit Node 的速度受出口机器的带宽和网络路径限制。你把所有流量都压到一台机器上,就要承担这台机器的带宽、延迟、日志和合规责任。尤其是团队共用出口,最好明确谁能用、用来做什么、日志保留多久。

Tailscale SSH:少发一把 SSH key

Tailscale SSH 的思路是:既然设备身份和用户身份都在 tailnet 里,那 SSH 访问也可以交给策略控制,不必到处复制公钥。

启用方式大致是:

sudo tailscale set --ssh

然后在管理后台的访问策略里允许某些用户登录某些机器。示意上可以理解成这样:

{
  "ssh": [
    {
      "action": "accept",
      "src": [
        "group:dev"
      ],
      "dst": [
        "tag:staging"
      ],
      "users": [
        "ubuntu",
        "root"
      ]
    }
  ]
}

这只是策略片段,不能单独替换完整策略。Tailscale SSH 同时要求网络策略放行目标的 22 端口,以及 ssh 规则允许登录相应系统用户;这些用户必须已经存在。root 权限较大,无此需要就从规则中删除。SSH 服务端支持 Linux 和开源 CLI 版 macOS,其他平台可作为客户端。具体前提见Tailscale SSH 文档。

实际规则要按你的 tailnet、用户组和 tag 调整。重点不是照抄 JSON,而是把 SSH 权限从“机器上散落的 authorized_keys”收回到一套可审查策略里。

这对小团队很实用。新人入职不用到处发 key;人走了,禁用身份就行;某台机器临时需要开放维护权限,也能有边界。仍需清理不再使用的系统账号和普通 SSH 公钥,避免旧的登录方式继续保留权限。

ACL 和 tag:Tailscale 能不能安全,主要看这里

很多人装完 Tailscale 只停在“设备互通”。这只是第一层。真正要在团队里长期用,必须认真写 ACL。

一个简单原则:不要让所有节点默认互访。至少把设备按用途分组:

  • 个人设备:手机、笔记本、桌面机。
  • 开发环境:devbox、CI runner、临时实验机。
  • 测试环境:staging API、测试数据库。
  • 生产环境:线上机器、生产数据库、监控后台。
  • 家用设备:NAS、路由器、媒体服务。

然后用 tag 给服务器打标签,比如:

sudo tailscale set --advertise-tags=tag:staging

先在策略的 tagOwners 中定义谁能分配这些标签,并确认相关成员有权使用。下文的 group:dev、group:ops 及 tag:staging 都是示例,需按实际成员和服务器填写;不要只复制命令而不定义策略。

策略上可以做成:开发者能进测试环境,但不能直接碰生产数据库;运维组能进生产跳板;家用 NAS 只给个人账号访问;CI runner 只能拉取必要依赖,不能反向访问办公设备。

ACL 的核心价值不是写得多复杂,而是把“谁能访问什么”变成一份可读、可评审、可回滚的配置。这个方向,比“大家都连上 VPN 再说”靠谱得多。

Serve 和 Funnel:别把临时服务一股脑暴露到公网

Tailscale Serve 可以把本机服务发布给 tailnet 内的其他设备访问。比如你本地跑了一个 3000 端口的 Web 应用:

sudo tailscale serve --bg 3000
tailscale serve status

按照首次运行时的提示启用所需 HTTPS 设置,然后使用命令输出的完整 HTTPS 地址访问。--bg 会让 Serve 在后台持续运行;不加它时,前台进程退出后的行为不同。详情见Serve 命令文档。

只监听 127.0.0.1 的服务不能直接通过 100.x.y.z:3000 访问,Serve 可以代理这个本机服务。若选择直接访问 Tailscale IP,则需让服务监听相应地址,并核对防火墙和访问策略。

Funnel 更进一步,可以把服务公开到互联网。这个能力要谨慎用。它很适合短期 demo、Webhook 测试、临时回调,但不要把后台管理、数据库控制台、Agent Web Terminal 这类敏感东西直接 Funnel 出去。

比较稳的规则是:

  • 只 Funnel 无敏感数据、短期使用的服务。
  • 开之前确认认证、限流和日志。
  • 用完立刻关掉。
  • 长期服务还是走正式域名、反向代理、TLS、WAF 或 Zero Trust 策略。

临时工具越好用,越容易被当成长期方案。应定期检查仍在公开提供的入口。

给 Agent 和自托管服务准备一张私有运维网

Tailscale 对现在的 AI/Agent 工作流尤其合适。因为 Agent 相关服务天然会散:本地有 Claude Code、Codex、OpenClaw、浏览器自动化、向量库、临时 Web UI;云上有实验机、模型网关、日志面板、任务队列。每个都开公网端口,迟早出事。

更稳的做法是把它们先放进 tailnet:

  • Agent 控制台只监听本机或内网地址。
  • 通过 Tailscale IP / MagicDNS 访问 Web UI。
  • 数据库、Redis、向量库不开放公网端口。
  • 需要给外部系统回调时,单独处理入口,不要顺手把整个控制台暴露出去。
  • 对长期在线的实验机打 tag,并用 ACL 限制访问人群。

如果你正在维护这类长期在线的 Agent 实验机、模型网关或私有运维节点,最好单独准备一台干净云服务器,不要和生产数据库、个人主机混跑。雨云这类云服务器适合拿来做隔离实验环境,按需开小规格,跑完就清掉,成本和风险都更好控。

一套更稳的落地清单

个人使用可以先接入两台设备,检查一个具体服务是否可访问。团队使用还需记录设备用途、成员和授权范围。

先从设备盘点开始:

个人设备:laptop、phone、desktop
实验机器:agent-lab-01、model-gateway-01
测试环境:staging-api、staging-db
生产环境:prod-jump、prod-monitor
家庭设备:nas-home、router-home

再给服务器设置 tag:

# 在实验节点上执行
sudo tailscale set --advertise-tags=tag:agent-lab

# 在另一台测试节点上执行
sudo tailscale set --advertise-tags=tag:staging

把默认互通收紧,只开放必要路径。示意规则可以这样设计:

{
  "groups": {
    "group:dev": [
      "alice@example.com",
      "bob@example.com"
    ],
    "group:ops": [
      "ops@example.com"
    ]
  },
  "acls": [
    {
      "action": "accept",
      "src": [
        "group:dev"
      ],
      "dst": [
        "tag:staging:22",
        "tag:staging:80",
        "tag:staging:443"
      ]
    },
    {
      "action": "accept",
      "src": [
        "group:ops"
      ],
      "dst": [
        "tag:prod:*",
        "tag:agent-lab:*"
      ]
    }
  ]
}

然后再逐步加 Subnet Router、Exit Node、Tailscale SSH、Serve/Funnel。别一口气全开。网络工具最怕“先打通再补权限”,因为打通之后大家就会默认它一直这么用。

常见坑:不是装不上,而是边界没想清楚

第一,别把 Tailscale 当公网防火墙的替代品。它可以减少公网暴露面,但机器本身的系统更新、服务认证、最小权限、防火墙仍然要做。

第二,别让个人账号长期承载团队关键网络。个人项目无所谓,团队环境最好接企业身份系统,配 2FA,设备命名、tag、ACL、审批流程都要有基本规范。

第三,别滥用 Subnet Router。它方便,也最容易把“一个节点”变成“一整段内网入口”。家用 NAS 和测试网段可以大胆试,生产网段要慎重,最好先走只读、跳板、审计和变更审批。

第四,别把 Funnel 当长期公网发布方案。它适合临时暴露服务,不适合替代正式的线上入口。尤其是数据库后台、Agent 控制台、管理面板,别往公网一挂就完事。

第五,别忽略密钥和设备生命周期。丢手机、换电脑、员工离职、云服务器释放,都要及时从 tailnet 移除或吊销。私有网越好用,越要定期清理旧设备。

它适合谁,不适合谁

Tailscale 很适合这些场景:

  • 个人开发者远程访问家里 NAS、树莓派、实验服务器。
  • 小团队访问测试环境、内部面板、CI runner。
  • 多云服务器之间建立轻量私有管理网。
  • Agent / RPA / 自动化服务需要长期在线,但不想裸露公网端口。
  • 出差时需要一个可信 Exit Node。

它不适合拿来掩盖混乱的权限管理。也不适合把大规模企业网络简单“一键迁移”进去。组织越大,越要把身份、设备合规、日志、审批、网段规划、现有 Zero Trust 体系一起考虑。

如果目前只需要访问一台 VPS 的后台,先配置两台设备的接入和该服务的访问权限就够了。等确实需要访问整段局域网或统一出口时,再启用 Subnet Router、Exit Node;每增加一种入口,都检查它实际允许访问的资源。