折腾实验室 # 网络通信 # 内网已发布

Tailscale:搭建安全的异地组网网络

Tailscale 是一个基于 WireGuard 的组网工具,可以让分散在不同网络中的电脑、服务器、手机和 NAS 像处于同一个局域网一样互相访问。它最大的特点是:不需要自己搭建传统 VPN 服务器,也不需要公网 IPv4,就可以实现设备之间的安全互联。

2026.09.1210 分钟阅读
Tailscale:搭建安全的异地组网网络
Tailscale:搭建安全的异地组网网络 · Cover

Tailscale 是一个基于 WireGuard 的组网工具,可以让分散在不同网络中的电脑、服务器、手机和 NAS 像处于同一个局域网一样互相访问。它最大的特点是:不需要自己搭建传统 VPN 服务器,也不需要公网 IPv4,就可以实现设备之间的安全互联。对于家庭服务器、NAS、开发环境以及异地访问内网服务来说,Tailscale 是一个非常方便的方案。


一、Tailscale 是怎么工作的

传统的远程访问方案通常需要:

公网 IP
    ↓
路由器端口转发
    ↓
VPN / SSH / Web 服务
    ↓
内网设备

如果运营商没有提供公网 IPv4,就会变得比较麻烦。

例如家庭宽带可能是:

Internet
   │
运营商 NAT
   │
家庭路由器
   │
192.168.1.0/24
   │
服务器

此时外部设备无法直接通过公网 IPv4 访问家里的服务器。

Tailscale 的思路不一样:

                Tailscale 网络
                     │
          ┌──────────┼──────────┐
          │          │          │
       Windows      Mac       手机
          │          │          │
          └────── WireGuard ────┘
                     │
                  家庭服务器

每台加入 Tailnet 的设备都会获得一个 Tailscale IP。

例如:

Windows   100.x.x.10
Mac       100.x.x.20
服务器    100.x.x.30
手机      100.x.x.40

这些设备之间可以直接通信。


二、Tailscale 和传统 VPN 的区别

Tailscale 底层使用 WireGuard,但它并不是简单地给 WireGuard 加了一层 UI。

传统 WireGuard 通常需要自己管理:

  • 密钥
  • Peer
  • IP 地址
  • 路由
  • NAT
  • 端口
  • 配置文件

例如 WireGuard 可能需要维护:

[Peer]
PublicKey = xxx
AllowedIPs = 10.0.0.2/32
Endpoint = xxx.xxx.xxx.xxx:51820

设备一多,维护成本会明显增加。

Tailscale 会帮助处理这些事情:

设备身份
    ↓
密钥管理
    ↓
设备发现
    ↓
WireGuard 加密连接
    ↓
NAT 穿透
    ↓
路由管理

所以可以把它理解成:

WireGuard + 身份认证 + 自动组网 + NAT 穿透 + 管理控制台


三、安装 Tailscale

3.1 Windows

Windows 可以直接下载安装 Tailscale 客户端。

安装完成后登录账号即可。

登录之后,在 PowerShell 中执行:

tailscale status

可以看到当前 Tailnet 中的设备。

例如:

100.100.100.10  desktop
100.100.100.20  server
100.100.100.30  macbook

3.2 macOS

macOS 可以使用 Homebrew:

brew install --cask tailscale

也可以安装官方客户端。

登录之后可以执行:

tailscale status

3.3 Linux

以 Ubuntu 为例:

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

然后启动:

sudo tailscale up

命令执行后会出现登录地址。

打开浏览器完成认证即可。

检查状态:

tailscale status

查看自己的 Tailscale IP:

tailscale ip

例如:

100.106.198.118

四、最基本的使用方式

假设现在有三台设备:

Windows
100.100.100.10

Mac
100.100.100.20

Linux Server
100.100.100.30

在 Windows 上:

ping 100.100.100.30

如果服务器开启 SSH:

ssh root@100.100.100.30

如果服务器上运行了 Web 服务:

http://100.100.100.30:8080

也可以直接访问。

这里有一个非常重要的特点:

不需要给 8080 做公网端口映射。

服务依然只需要监听服务器本身的网络接口。


五、MagicDNS

直接记住

100.100.100.30

当然可以,但设备多以后 IP 很难记。

Tailscale 提供了 MagicDNS。

开启之后,可以使用设备名称访问。

例如:

ssh root@server

或者:

ping server

而不是:

ssh root@100.100.100.30

可以把它理解成:

server
   ↓
MagicDNS
   ↓
100.100.100.30

对于家庭服务器尤其方便。

例如:

nas
server
docker
macbook
windows

可以直接通过设备名称访问。


六、Tailscale 的核心:Tailnet

Tailscale 中有一个非常重要的概念:

Tailnet

可以简单理解为:

属于同一个账号/组织的私有网络。

例如:

My Tailnet

├── MacBook
├── Windows
├── Home Server
├── NAS
├── Phone
└── Cloud Server

这些设备默认可以通过 Tailscale 网络进行通信。

每台设备都有自己的身份和密钥。

因此 Tailscale 不只是:

IP → IP

而更接近:

User / Device Identity
          ↓
       Tailnet
          ↓
     Network Policy
          ↓
      Device Access

七、子网路由 Subnet Router

这是 Tailscale 非常实用的功能之一。

假设家庭网络:

192.168.1.0/24

但是只有服务器安装了 Tailscale:

Internet
    │
    │
Tailscale
    │
100.x.x.x
    │
Home Server
    │
192.168.1.100
    │
192.168.1.0/24
    ├── NAS
    ├── 摄像头
    ├── 路由器
    ├── TV
    └── 其他设备

此时可以让 Home Server 作为:

Subnet Router

这样其他 Tailscale 设备就可以访问整个家庭局域网。


7.1 Linux 配置 Subnet Router

首先打开 IP Forwarding:

sudo sysctl -w net.ipv4.ip_forward=1

永久生效:

sudo nano /etc/sysctl.conf

加入:

net.ipv4.ip_forward = 1

然后:

sudo sysctl -p

启动 Tailscale:

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

这里:

192.168.1.0/24

就是你希望通过 Tailscale 暴露的局域网网段。

然后进入 Tailscale 管理后台批准这个 Route。


八、Subnet Router 的实际用途

比如家里的 NAS:

NAS
192.168.1.10

NAS 没有安装 Tailscale。

但是服务器:

Server
192.168.1.100
100.x.x.x

安装了 Tailscale,并且作为 Subnet Router。

那么外面的电脑:

Laptop
100.x.x.x

就可以:

ssh root@192.168.1.100

甚至访问:

http://192.168.1.10

也就是说:

只有一台设备安装 Tailscale,就可以让整个局域网被安全访问。

这对于 NAS、家庭服务器、打印机、摄像头等设备非常有用。


九、Exit Node

Subnet Router 是:

外部设备
   ↓
家庭网络

而 Exit Node 则反过来解决:

外部设备
   ↓
家庭服务器
   ↓
Internet

例如:

Laptop
   │
   │ Tailscale
   ↓
Home Server
   │
   ↓
Internet

此时 Laptop 的互联网流量可以通过家庭服务器出去。

家庭服务器就是:

Exit Node


9.1 配置 Exit Node

Linux:

sudo tailscale up --advertise-exit-node

然后在管理后台批准该设备作为 Exit Node。

客户端选择:

Exit Node
    ↓
Home Server

之后:

Laptop
    ↓
Tailscale
    ↓
Home Server
    ↓
Internet

十、Exit Node 和 Subnet Router 的区别

这两个概念很容易混。

Subnet Router

主要用于访问指定的内网:

Laptop
   ↓
Tailscale
   ↓
192.168.1.0/24

Exit Node

让互联网流量都从指定设备出去:

Laptop
   ↓
Tailscale
   ↓
Home Server
   ↓
Internet

可以简单记:

Subnet Router = 访问内网

Exit Node = 借道上网

十一、ACL:控制谁可以访问谁

当设备越来越多之后,仅仅让所有设备互通并不是一个好方案。

例如:

管理员电脑
    ↓
服务器

普通设备
    ↓
只能访问 Jellyfin

这时候就需要 ACL。

ACL 可以定义:

谁
  ↓
可以访问
  ↓
哪台设备
  ↓
哪个端口

例如:

开发电脑
    ↓
server:22
server:3000
server:8080

而手机可能只允许:

phone
  ↓
jellyfin:8096

这样即使手机加入 Tailnet,也不能随意访问服务器上的其他服务。


十二、使用标签管理服务器

设备多了以后,可以使用 Tags。

例如:

tag:server
tag:nas
tag:dev
tag:production

然后 ACL 可以针对 Tag 设置规则。

例如:

developer
    ↓
tag:dev

admin
    ↓
tag:server

这种方式比一个个写设备名称更加容易维护。


十三、Tailscale SSH

Tailscale 还提供了 Tailscale SSH。

传统 SSH:

ssh root@100.x.x.x

通常还需要:

用户名
密码 / SSH Key
端口
防火墙

Tailscale SSH 可以把身份认证和 Tailscale 身份结合起来。

例如:

ssh server

访问链路变成:

User
 ↓
Tailscale Identity
 ↓
ACL
 ↓
Tailscale SSH
 ↓
Server

这样可以减少自己维护 SSH 公钥的工作。

不过生产环境仍然应该根据实际安全策略决定是否启用。


十四、Tailscale Funnel

Tailscale 默认解决的是:

私有网络

但 Funnel 可以把服务暴露到公网。

例如:

Internet
    ↓
Tailscale Funnel
    ↓
Your Server
    ↓
Web Application

这和普通 Tailscale 网络最大的区别是:

普通 Tailscale

只有 Tailnet 成员能够访问。

Funnel

互联网用户也可以访问。

因此 Funnel 应该谨慎使用。

如果只是:

自己访问
家人访问
开发环境访问

通常不需要 Funnel。


十五、Serve

Serve 和 Funnel 也容易混淆。

Serve 更适合:

Tailscale 网络内部
        ↓
某个 Web 服务

例如服务器上:

localhost:3000

可以通过 Tailscale Serve 暴露到 Tailnet。

整体结构:

Browser
   ↓
Tailscale
   ↓
Serve
   ↓
localhost:3000

这意味着 Web 服务甚至不一定需要直接监听:

0.0.0.0

可以继续保持:

127.0.0.1:3000

然后由 Tailscale 负责访问。


十六、Docker 中使用 Tailscale

Tailscale 和 Docker 配合非常常见。

例如服务器:

Server
├── Docker
│   ├── Jellyfin
│   ├── Sonarr
│   ├── Radarr
│   ├── qBittorrent
│   └── n8n
│
└── Tailscale

最简单的方式是:

Tailscale
    │
    ↓
Server
    │
    ↓
Docker Port

例如:

100.x.x.x:8096
        ↓
Jellyfin
        ↓
Docker
        ↓
8096

然后通过:

http://100.x.x.x:8096

访问。

这种方式非常简单,也不需要把每个 Docker 容器都加入 Tailnet。


十七、Docker + Tailscale 更复杂的场景

如果希望:

Tailscale
    ↓
Docker Network
    ↓
多个容器

可以考虑把 Tailscale 放到专门的容器中。

例如:

                Tailscale Container
                       │
                       │
              ┌────────┴────────┐
              │                 │
          Web Container     API Container

这种方案可以让 Tailscale 成为 Docker 网络入口。

但同时会涉及:

  • network namespace
  • IP forwarding
  • iptables
  • subnet routing
  • container capabilities

因此如果只是家庭服务器访问,通常没必要一开始就搞这么复杂。


十八、Kubernetes 中使用 Tailscale

在 Kubernetes 中,Tailscale 可以用来连接:

开发环境
      ↓
Kubernetes
      ↓
Service

例如:

Laptop
   │
   │ Tailscale
   ↓
Kubernetes
   │
   ├── authing-api
   ├── postgres
   ├── redis
   └── elasticsearch

这样开发人员可以直接访问集群内部资源,而不需要:

公网 LoadBalancer
公网 IP
端口暴露
VPN 网关

Tailscale 还提供 Kubernetes Operator,可以将 Tailscale 的能力集成到 Kubernetes 中。

对于:

家庭 K8s
开发 K8s
私有云
测试环境

非常方便。


十九、Tailscale 的 NAT 穿透

Tailscale 好用的一个重要原因就是 NAT Traversal。

假设:

设备 A
192.168.1.10
      │
   NAT
      │
   Internet
      │
   NAT
      │
设备 B
192.168.2.20

两个设备都没有公网 IP。

Tailscale 会尝试建立:

A ←──────→ B

的直接连接。

如果 NAT 条件允许,就使用:

Direct Connection

如果无法直接建立连接,则可能通过:

DERP Relay

进行中继。

所以:

优先:

Device A ←──────→ Device B

无法直连:

Device A → DERP → Device B

这也是为什么即使没有公网 IPv4,Tailscale 通常依然可以工作。


二十、如何查看当前连接方式

执行:

tailscale status

可以看到设备状态。

还可以使用:

tailscale ping <device>

例如:

tailscale ping server

可以帮助判断连接是否为:

direct

还是:

relay

如果两个设备都在不同运营商网络下,发现连接走 DERP,不代表配置错误。

它通常意味着:

两端之间无法建立合适的直连路径。


二十一、为什么 Tailscale 不需要开放端口

传统 VPN 经常需要:

UDP 51820

然后路由器:

公网 IP:51820
      ↓
内网服务器:51820

Tailscale 会尽量利用已有的出站连接完成 NAT 穿透。

所以家庭网络通常不需要:

端口映射
公网 IPv4
VPN 服务端口

这也是它非常适合家庭宽带的原因。


二十二、家庭服务器推荐架构

如果你有一台家庭服务器,可以设计成:

                         Internet
                            │
                    ┌───────┴───────┐
                    │               │
                 Tailscale        Caddy
                    │               │
                    │          公网服务
                    │
              Home Server
                    │
        ┌───────────┼───────────┐
        │           │           │
     Docker       NAS         K8s
        │
 ┌──────┼──────┬──────┐
 │      │      │      │
Jellyfin Sonarr Radarr n8n

其中:

Tailscale
    ↓
负责私人访问

Caddy
    ↓
负责公网 Web 服务

两者职责分开。


二十三、Tailscale + Caddy

如果已经使用 Caddy,那么可以形成:

公网用户
   ↓
Caddy
   ↓
公网服务

而自己的管理服务:

自己
 ↓
Tailscale
 ↓
内网服务

例如:

公网:

blog.example.com
    ↓
Caddy
    ↓
Blog


私网:

admin.internal.example.com
    ↓
Tailscale
    ↓
Admin Panel

这样很多管理后台根本不需要暴露到公网。

例如:

Grafana
Portainer
Proxmox
NAS 管理后台
Kubernetes Dashboard
数据库管理工具

都可以优先考虑放在 Tailscale 网络中。


二十四、Tailscale + PostgreSQL

这是开发环境非常实用的一种方式。

例如服务器:

PostgreSQL
192.168.1.20:5432

通过 Subnet Router 或直接安装 Tailscale 后:

开发电脑
   ↓
Tailscale
   ↓
PostgreSQL

开发电脑可以直接使用:

Host: 100.x.x.x
Port: 5432

然后:

TablePlus
DBeaver
DataGrip

都可以通过 Tailscale 访问数据库。

相比直接开放:

5432

到公网,这种方式安全边界更加清晰。


二十五、Tailscale + SSH

远程维护服务器时:

ssh user@100.x.x.x

相比:

公网 IP
    ↓
22
    ↓
SSH

Tailscale 可以把 SSH 服务限制在 Tailnet 网络中。

例如:

Internet
   X
   │
   │ 不开放 SSH
   │
Server
   │
   └── Tailscale
          ↑
          │
        Laptop

这样服务器的公网防火墙甚至可以完全禁止:

TCP 22

只允许 Tailscale 网络访问 SSH。


二十六、常见问题排查

1. tailscale status 看不到设备

检查:

tailscale status

然后确认:

tailscale netcheck

检查网络环境。


2. 可以看到设备但是无法访问

先测试:

tailscale ping <device>

然后测试:

ping 100.x.x.x

如果:

tailscale ping

成功,但是:

ping

失败,需要继续检查:

  • 系统防火墙
  • ICMP
  • Tailscale ACL
  • 服务监听地址
  • Docker 网络
  • 路由

3. SSH 连接失败

检查:

ss -lntp | grep 22

确认 SSH 是否监听。

然后:

ssh user@100.x.x.x

如果服务只监听:

127.0.0.1:22

那么其他设备无法直接访问。


4. Subnet Router 不生效

检查:

tailscale status

确认路由是否发布。

然后:

tailscale debug prefs

检查配置。

同时确认:

net.ipv4.ip_forward

是否开启。


二十七、Tailscale 常用命令

查看状态:

tailscale status

查看 IP:

tailscale ip

检查网络:

tailscale netcheck

测试其他设备:

tailscale ping <device>

启动:

sudo tailscale up

退出:

sudo tailscale down

重新认证:

sudo tailscale up

查看当前配置:

tailscale debug prefs

查看版本:

tailscale version

二十八、实际使用时的一套思路

第一步:

电脑
服务器
手机

全部安装 Tailscale。

确认:

tailscale status

可以看到彼此。

第二步,开启:

MagicDNS

让设备可以通过名称访问。

第三步,把:

SSH
数据库
内部 Web 服务

逐渐迁移到 Tailscale 网络。

第四步,如果需要访问整个家庭局域网:

Subnet Router

第五步,如果需要让所有互联网流量经过家庭网络:

Exit Node

第六步,设备越来越多之后:

ACL
Tags

开始限制访问权限。


二十九、一个比较完整的家庭网络架构

最终可以形成:

                         Internet
                            │
              ┌─────────────┴─────────────┐
              │                           │
            Caddy                      Tailscale
              │                           │
        公网 Web 服务                 Private Network
                                          │
                     ┌────────────────────┼───────────────────┐
                     │                    │                   │
                  Laptop                Phone             Server
                                                             │
                                         ┌───────────────────┼─────────────┐
                                         │                   │             │
                                      Docker               NAS           K8s
                                         │
                              ┌──────────┼──────────┐
                              │          │          │
                           Jellyfin    n8n       Database

其中:

Caddy

负责:

公网服务
HTTPS
反向代理

而:

Tailscale

负责:

私人网络
远程访问
SSH
数据库
管理后台
家庭内网

两者配合起来会非常舒服。


三十、总结

Tailscale 真正解决的并不是“如何搭一个 VPN”这么简单的问题。

它解决的是:

如何让分散在不同网络中的设备,以一种简单、安全、低维护成本的方式组成一个私有网络。

最值得掌握的几个功能可以记成:

Tailscale
│
├── 基础组网
│
├── MagicDNS
│
├── Subnet Router
│
├── Exit Node
│
├── ACL
│
├── Tags
│
├── Tailscale SSH
│
├── Serve
│
├── Funnel
│
└── Kubernetes / Docker

如果只是个人使用,最常见的组合其实非常简单:

Tailscale
    +
MagicDNS
    +
ACL

家庭服务器进一步加入:

Subnet Router

需要远程访问全部互联网流量时再考虑:

Exit Node

而公网业务则继续交给:

Caddy / Nginx / Cloudflare

这样网络边界会比较清晰,也不会为了访问一个内部服务,把一堆端口直接暴露到公网。

#网络通信 #内网
ZZC

ZZC

写代码,也写一些生活。