Docker 部署 Tailscale
Published in:2025-07-17 |
Words: 2.2k | Reading time: 8min | reading:

简介

一、Tailscale 到底是什么?

你可以把它理解成一个**“为你所有设备打造的、私人的、加密的虚拟局域网”**。

  • 传统的VPN:像是在你家(局域网)和公司(另一个局域网)之间挖了一条秘密隧道。
  • Tailscale:更像是给你的每一台设备(NAS、电脑、手机、平板)都穿上了一件“隐身衣”,并给它们一个秘密的联络暗号。无论这些设备身处世界何地,只要它们都穿着这件“隐身衣”(安装了 Tailscale 客户端并用同一账号登录),它们就能互相看见、互相通信,仿佛就在同一个房间里。

这个“虚拟局域网”是建立在互联网之上的,但它又是完全隔离和加密的,外界无法窥探。

二、它如何解决你的 NAS 外链问题?

Tailscale 通过以下几个核心功能来解决你的问题:

  1. 稳定的虚拟 IP 地址:一旦你的 NAS 加入了 Tailscale 网络,它会被分配一个 100.x.x.x 开头的、独一无二且固定的 IP 地址。你再也不用关心家里宽带的公网 IP 是不是变了。
  2. 零配置穿透 (Zero-config NAT traversal):你不需要在路由器上做任何端口转发。Tailscale 会自动想办法在你的设备之间“打洞”,建立点对点(P2P)的加密连接。这意味着数据传输速度很快,因为大部分时间数据是直连的,不经过第三方服务器中转。
  3. 极高的安全性:它基于目前最先进的 VPN 协议 WireGuard® 构建,所有通信都是端到端加密的。因为你没有在路由器上开放任何端口,所以你的 NAS 不会暴露在公网上,大大降低了被黑客扫描和攻击的风险。
  4. 设备间的无缝访问:只要你的电脑或手机也安装并登录了 Tailscale,你就可以在任何地方,直接通过 NAS 的那个 100.x.x.x 虚拟 IP 来访问它的管理页面、File Station 等所有服务,体验和在家里一模一样。

部署

部署方式一:使用 docker run 命令(单次部署)

这是最直接的方式,适合快速启动。

步骤 1:准备持久化目录

为了让 Tailscale 的状态(主要是它的身份密钥)在容器重启后不丢失,我们需要在主机上创建一个目录来持久化存储它。

1
2
3
4
# 通过 SSH 登录到你的 NAS 或服务器
mkdir -p /path/to/your/appdata/tailscale
# 注意:请将 /path/to/your/appdata 替换为你自己存放应用数据的实际路径
# 例如,在群晖上可能是 /volume1/docker/tailscale

步骤 2:运行 Docker 容器

复制并执行以下命令。这条命令已经包含了运行 Tailscale 所需的所有关键配置。

1
2
3
4
5
6
7
8
9
docker run -d \
--name=tailscaled \
-v /path/to/your/appdata/tailscale:/var/lib/tailscale \
-v /dev/net/tun:/dev/net/tun \
--network=host \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--restart unless-stopped \
tailscale/tailscale

命令参数详解:

  • docker run -d: 在后台(detached mode)运行容器。
  • --name=tailscaled: 给容器起一个好记的名字,方便管理。
  • -v /path/to/your/appdata/tailscale:/var/lib/tailscale: 【核心】 将主机上的目录挂载到容器内,用于保存 Tailscale 的状态。务必替换为你自己的路径
  • -v /dev/net/tun:/dev/net/tun: 将主机的 TUN 设备挂载到容器内,这是 Tailscale 创建虚拟网卡所必需的。
  • --network=host: 【核心】 让容器直接使用主机的网络,这是最简单且功能最全的模式。容器可以轻松访问主机的所有端口,也方便将主机作为子网路由(Subnet Router)。
  • --cap-add=NET_ADMIN --cap-add=NET_RAW: 授予容器操作网络接口所需的 Linux Capabilities 权限。
  • --restart unless-stopped: 设置容器的重启策略,除非手动停止,否则 Docker 重启时会自动启动该容器。
  • tailscale/tailscale: 指定要使用的官方 Docker 镜像。

步骤 3:将 NAS 加入你的 Tailscale 网络

容器已经在运行了,但它还不知道自己是谁。我们需要执行一条命令来让它登录。

  1. 执行以下命令,启动 Tailscale 并获取登录链接:

    1
    docker exec tailscaled tailscale up
  2. 命令执行后,终端会输出一个登录 URL,看起来像这样:

    1
    2
    3
    To authenticate, visit:

    https://login.tailscale.com/a/123456789ABC
  3. 复制这个 URL,在你的电脑浏览器中打开,用你的 Tailscale 账户登录并授权这台新设备。

  4. 授权成功后,回到你的 Tailscale Admin Console 后台,你就能看到这台新设备已经加入了你的网络。

至此,你的 NAS 已经成功通过 Docker 加入了 Tailscale 网络! 你可以在任何其他已登录 Tailscale 的设备上,通过分配的 100.x.x.x IP 地址来访问你的 NAS。


部署方式二:使用 docker-compose(推荐,便于管理)

如果你需要管理多个容器,或者希望将配置以文件形式保存下来,docker-compose 是更好的选择。

步骤 1:创建 docker-compose.yml 文件

在你喜欢的位置(例如 /volume1/docker/tailscale)创建一个名为 docker-compose.yml 的文件,并将以下内容粘贴进去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: "3.7"
services:
tailscaled:
image: tailscale/tailscale
container_name: tailscaled
hostname: my-nas # 在 Tailscale 管理后台显示的设备名
volumes:
- ./data:/var/lib/tailscale # 将状态保存在当前目录下的 data 文件夹
- /dev/net/tun:/dev/net/tun
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
restart: unless-stopped

注意:

  • hostname: 你可以自定义一个名字,这样在 Tailscale 后台一眼就能认出是哪台设备。
  • volumes: - ./data:/var/lib/tailscale 这种相对路径的写法表示将状态文件保存在 docker-compose.yml 文件同级的 data 文件夹内,非常方便。

步骤 2:启动服务

docker-compose.yml 文件所在的目录中,执行以下命令:

1
docker-compose up -d

步骤 3:登录和授权

这一步和 docker run 方式完全一样:

1
docker-compose exec tailscaled tailscale up

然后复制输出的 URL 到浏览器完成授权。


高级功能:如何生成外链和访问内网?

部署成功后,你可以利用 Tailscale 的高级功能来实现最初的目标。

1. 将 NAS 作为子网路由 (Subnet Router)

场景:你想通过手机(已连接 Tailscale)访问你家里的其他设备,比如打印机 (192.168.1.100)。

  1. 修改启动命令,使其“宣告”它可以路由的内网网段。在执行 tailscale up 时加入 --advertise-routes 参数。

    • 你需要先 downup
      1
      2
      3
      4
      docker exec tailscaled tailscale down
      docker exec tailscaled tailscale up --advertise-routes=192.168.1.0/24
      # !!! 将 192.168.1.0/24 替换为你自己的局域网网段 !!!
      docker exec tailscaled tailscale up --advertise-routes=192.168.10.0/24 -accept-dns=false
  2. 在 Tailscale Admin Console 后台,找到你的 NAS 设备,点击右侧的 “…”,选择 “Edit route settings…”。

  3. 勾选并启用你刚刚宣告的子网路由。

现在,你任何连接了 Tailscale 的设备,都可以直接访问 192.168.1.x 网段的所有设备了,就像在家一样。

2. 使用 Tailscale Funnel 生成外链

场景:你想临时分享 NAS 上的一个文件给没有安装 Tailscale 的朋友。

  1. 确保你的 Docker 容器已经通过 tailscale up 成功连接。

  2. 假设你想分享的服务在主机的 8080 端口上(比如一个临时的文件服务器)。

    • 由于我们使用了 --network=host,容器可以直接访问到主机的 8080 端口。
  3. 执行 Funnel 命令:

    1
    docker exec tailscaled tailscale funnel 8080
  4. 命令会输出一个公网可访问的 HTTPS 链接,形如 https://your-nas-hostname.ts.net。将这个链接发给你的朋友即可。

  5. 分享完毕后,按 Ctrl+C 停止 Funnel,外链即刻失效,非常安全。如果想在后台运行,可以加上 --bg 参数。

总结:如何使用部署后的服务

你的需求 使用的功能 具体操作
在外面用 Tailscale 核心连接 + MagicDNS 在你的电脑/手机上安装并登录 Tailscale,然后像在家里一样,用 http://设备名:端口 的方式访问 NAS 的各项服务。
映射为电脑硬盘 SMB/AFP over Tailscale 在电脑的“映射网络驱动器”或“连接服务器”功能中,使用 \\设备名smb://设备名 作为地址。
分享文件给别人 Tailscale Funnel 在 NAS 上用 Python 或其他方式启动一个临时 Web 服务器,然后用 tailscale funnel <端口号> 命令生成一个临时的公网下载链接。
访问家里其他设备 子网路由 (Subnet Router) 在部署 Tailscale 时宣告内网网段,并在管理后台启用。之后就能直接通过内网 IP 访问家里所有设备。
Next:
NAS 文件借助 MinIO 转换OSS