← 返回全部文章

不在同一个WiFi,也能像在局域网

用 Tailscale 把 Windows、Mac、Linux、NAS 和手机组成一个加密私有网络,远程访问服务无需折腾公网 IP 和端口映射。

家里的 NAS 在宽带后面,公司电脑在另一张网,云服务器散落在不同机房,手机又常年使用移动网络。这些设备物理上离得很远,但装上 Tailscale 后,可以像接在同一台路由器上一样互相访问。

不需要固定公网 IP,也不用在路由器上开一排端口。 Windows 、 macOS 、 Linux 、 iOS 、 Android 和常见 NAS 平台都能加入同一个私有网络。

这套方案特别适合家庭 NAS 、异地办公、个人服务器和 Homelab 。它解决的是“设备之间如何安全连通”,不会自动替你部署服务,也不能让未运行服务的端口凭空出现。

Tailscale 是什么

Tailscale 基于 WireGuard 构建。每台设备安装客户端并登录同一个账号后,会加入一个叫 tailnet 的私有网络,获得独立的 Tailscale IP 和设备名。

设备会优先尝试点对点直连,流量端到端加密。受 NAT 或防火墙限制无法直连时,可以经过 Tailscale 的 DERP 中继转发,中继看不到明文内容。 MagicDNS 默认开启后,可以直接用设备名访问,不必背 100.x.x.x 地址。

它和传统 VPN 的使用感受不太一样。传统方案常要自己准备服务器、证书、端口和路由;Tailscale 把身份登录、设备发现、密钥轮换、 NAT 穿透和访问策略放到一套管理界面里。个人计划目前允许 6 个免费用户,具体功能与额度以官方价格页为准。

它解决哪些问题

1. 在外面访问家里的 NAS

手机连着 5G,笔记本在酒店 WiFi,也可以通过 Tailscale IP 或 MagicDNS 名称访问 NAS 的管理页面、 SMB 、 SSH 、照片服务和自建应用。家里宽带没有公网 IPv4,也不影响基本使用。

2. 管理云服务器,不再公开 SSH 端口

服务器加入 tailnet 后,可以让 SSH 、数据库或管理面板只监听内网接口,通过 Tailscale 访问。公网暴露面更小,也省去到处同步 SSH 公钥的麻烦。

3. 跨平台组一张私人局域网

Windows 台式机、 MacBook 、 Linux 主机、 iPhone 、 Android 手机、树莓派和 NAS 可以直接互访。设备所在国家、运营商和路由器都可以不同。

4. 访问不能安装客户端的设备

打印机、摄像头、路由器后台和部分 IoT 设备无法安装 Tailscale 。这时可以在家里放一台 Linux 主机做 Subnet Router,把 192.168.1.0/24 之类的真实局域网网段发布到 tailnet 。

5. 让远程设备从指定地点上网

把家里或云端的一台设备设为 Exit Node,出差时可以让手机或电脑的互联网流量从那台设备出去。 Exit Node 和 Subnet Router 用途不同:前者转发互联网流量,后者负责访问某个内网网段。

详细教程:先把两台设备连起来

第一步:注册 tailnet

打开:

https://login.tailscale.com/start

使用支持的身份提供商登录。官方快速入门说明里提到,公共邮箱注册通常进入 Personal 计划。管理后台地址是:

https://login.tailscale.com/admin

第二步:安装第一台设备

Windows 、 macOS 、 iOS 、 Android 可以从官方下载页或对应应用商店安装:

https://tailscale.com/download

Linux 可以执行:

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

命令会给出登录链接。用刚才的同一账号确认后,这台机器就会出现在 Admin Console 的 Machines 页面。

查看状态:

tailscale status

查看本机 Tailscale IPv4:

tailscale ip -4

第三步:安装第二台设备

在另一台电脑或手机上安装 Tailscale,并登录同一个 tailnet 。两台设备都在线后,可以先测试:

tailscale ping 设备名

也可以测试 Tailscale IP:

tailscale ping 100.x.x.x

普通系统 ping 不通时,不代表业务端口一定不通。系统防火墙可能屏蔽 ICMP 。更可靠的验证方式是直接访问你需要的服务,例如:

ssh 用户名@设备名
curl http://设备名:8080

Windows 远程桌面可以填写 Tailscale IP;NAS 网页可打开:

https://nas设备名:管理端口

第四步:打开 MagicDNS

Admin Console 中进入 DNS 页面,确认 MagicDNS 已开启。之后设备之间可用名称通信:

ssh admin@home-server

比记 IP 方便,也能避免设备地址变化后逐个修改脚本。

Linux 服务器启用 Tailscale SSH

服务端执行:

sudo tailscale up --ssh

客户端仍使用普通 SSH 命令:

ssh root@服务器设备名

Tailscale SSH 会用 tailnet 身份和节点密钥完成认证,可以减少 SSH Key 的分发工作。它只接管来自 Tailscale 网络、指向该设备 Tailscale IP 的 22 端口,不会修改 /etc/ssh/sshd_config~/.ssh/authorized_keys,原有 SSH 方式仍可保留。

启用 --ssh 只是打开服务入口。谁能登录、能登录哪台机器、能用哪个系统账号,还要在 Access Controls 中配置 SSH Policy 。

给不能安装客户端的设备开一扇门

假设家里局域网是 192.168.1.0/24,选择一台一直在线的 Linux 设备做 Subnet Router 。

开启 IP 转发:

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

发布路由:

sudo tailscale up --advertise-routes=192.168.1.0/24

然后到 Admin Console 的 Machines 页面批准这条 Subnet Route 。 Linux 客户端默认可能不会接受其他节点发布的路由,可执行:

sudo tailscale set --accept-routes=true

配置完成后,外面的电脑就能访问家中的打印机、摄像头或路由器后台。更稳妥的做法是再写访问策略,只开放需要的设备和端口,不把整个网段交给所有成员。

Exit Node:把家里变成自己的出口

在准备充当出口的 Linux 设备上开启 IP 转发,然后执行:

sudo tailscale up --advertise-exit-node

到管理后台批准 Exit Node 。客户端选择它:

tailscale set --exit-node=出口设备名

关闭:

tailscale set --exit-node=

使用 Exit Node 后,客户端的互联网流量会经过出口设备。速度受两端带宽、线路和是否直连影响。它不提供匿名性,出口网络、目标网站及设备本身仍可能留下访问记录。

接入公网服务器后,别停在 allow-all

把所有设备接入同一张 tailnet 很方便,也带来横向移动风险。某台公网服务器被攻破后,如果策略允许它访问所有设备,攻击者可能继续探测个人电脑、 NAS 和其他服务器。

比较实用的隔离思路是:

  • 个人管理设备可以访问公网服务器。
  • 公网服务器不能主动连接个人设备。
  • 公网服务器之间默认不能横向访问。
  • 只为确有需要的端口增加例外。

Tailscale 当前建议新策略优先使用 Grants 。下面是一个简化示例,展示 personalpublic-server 两组设备的单向访问关系。标签更适合服务器、网关这类非人设备;个人笔记本也可以继续保留用户身份,并把规则里的来源改成你的登录邮箱或用户组。

{
  "tagOwners": {
    "tag:personal": ["autogroup:admin"],
    "tag:public-server": ["autogroup:admin"]
  },

  "grants": [
    {
      "src": ["tag:personal"],
      "dst": ["tag:personal"],
      "ip": ["*"]
    },
    {
      "src": ["tag:personal"],
      "dst": ["tag:public-server"],
      "ip": ["tcp:22", "tcp:80", "tcp:443"]
    }
  ],

  "ssh": [
    {
      "action": "check",
      "src": ["tag:personal"],
      "dst": ["tag:personal", "tag:public-server"],
      "users": ["autogroup:nonroot", "root"],
      "checkPeriod": "12h"
    }
  ]
}

这里故意没有写 public-server → personal,也没有写 public-server → public-server。 Grants 采用默认拒绝模式,缺少允许规则的方向就无法建立新连接。

配置时有一个很容易踩的坑:网络 Grants 和 Tailscale SSH 是两层权限。

Grants 决定 TCP/UDP 流量能不能到达目标;ssh 段决定 Tailscale SSH 是否允许当前身份登录。网络连通后 SSH 仍被拒绝,通常要同时检查这两层。修改策略前先备份,在编辑器里运行验证,并从两个方向做真实连接测试。

策略文件会影响整个 tailnet 。上面的端口和账号只是示例,复制前应按自己的服务调整。生产服务器还要保留系统防火墙、及时更新和最小权限账号,Tailscale 不能替代主机安全。

常用排查命令

查看设备列表和连接状态:

tailscale status

测试到某设备的 Tailscale 路径:

tailscale ping 设备名

查看当前设备诊断信息:

tailscale netcheck

确认目标端口:

nc -vz 设备名 22
nc -vz 设备名 443

遇到“设备在线但访问不了”,按这个顺序排查:目标服务是否启动、是否监听正确网卡、系统防火墙是否放行、 Grants 是否允许、 Tailscale SSH Policy 是否允许。

使用边界

Tailscale 能解决设备之间的安全连通、身份认证和访问控制,不能修复服务本身的漏洞。数据库使用弱密码、 NAS 长期不更新、服务器运行高权限程序,这些风险仍然存在。

它也无法保证所有网络都能点对点直连。严苛 NAT 、校园网、酒店网络或企业防火墙可能迫使流量走 DERP 中继,延迟和吞吐会受到影响。

多人使用时,不要共享一个登录账号。应邀请独立用户,再按用户、组和设备标签分配权限。临时服务器和自动化程序可以使用受限、可撤销的 Auth Key 或 OAuth Client,避免长期保存管理员凭据。

对个人用户来说,Tailscale 最实用的起点很简单:先连接一台电脑和一部手机,再加入 NAS 或云服务器。确认基本访问稳定后,再增加 Subnet Router 、 Exit Node 和细粒度策略。这样既能快速用起来,也不会一开始就把整张网络配置得过于复杂。

来源:https://x.com/brucexu_eth/status/2075879152369209402