群晖 Docker 部署 Tailscale 异地组网完整指南

本指南记录了在群晖(Synology DSM)环境中使用 Docker 成功部署 Tailscale 并实现持久化登录、内核 TUN 自动加载的完整实施步骤。


核心原理说明

在群晖 DSM 环境中使用 Docker 运行 Tailscale 时,需满足以下三大关键条件:

  1. 网络模式 (Host):必须使用 --net=host 参数,让容器直接共享宿主机网络栈。
  2. 内核权限 (TUN):必须创建并加载群晖系统的 /dev/net/tun 内核模块,并赋予 --privileged 容器特权。
  3. 持久化存储 (TS_STATE_DIR):必须添加环境变量 -e TS_STATE_DIR=/var/lib/tailscale,强行指定状态文件写入挂载路径,防止重启后变为 Logged out。

实施步骤

步骤 1:创建并加载 TUN 虚拟网卡模块

由于 DSM 默认可能未自动加载 TUN 模块,请在 SSH 终端执行以下命令:

sudo mkdir -p /dev/net
sudo mknod /dev/net/tun c 10 200
sudo chmod 600 /dev/net/tun
sudo insmod /lib/modules/tun.ko

验证状态:

ls -l /dev/net/tun

返回形如 crw------- 1 root root ... /dev/net/tun 即说明创建成功。


步骤 2:创建本地持久化存储目录

在群晖存储空间创建用于保存配置与状态的文件夹(请根据实际情况选择 volume1 或 volume2):

sudo mkdir -p /volume2/docker/tailscale

步骤 3:启动 Tailscale Docker 容器

执行以下完整部署命令(已包含国内镜像源及持久化环境变量):

sudo docker run -d \
  --name=tailscale \
  --net=host \
  --privileged \
  -e TS_STATE_DIR=/var/lib/tailscale \
  -v /volume2/docker/tailscale:/var/lib/tailscale \
  -v /dev/net/tun:/dev/net/tun \
  --restart=always \
  m.daocloud.io/docker.io/tailscale/tailscale:stable

步骤 4:完成节点授权绑定

执行登录命令:

sudo docker exec -it tailscale tailscale up --reset
  1. 终端会输出绑定网址,例如:https://login.tailscale.com/a/xxxxxxx。
  2. 复制网址到浏览器打开,登录你的 Tailscale 账号并点击 Authorize。
  3. 授权完成后,在终端检查持久化目录:
    sudo ls -la /volume2/docker/tailscale
    
    确认目录下已成功生成 tailscaled.state 凭证文件。

防丢失配置:开机自动加载 TUN 模块

手动加载的 tun.ko 模块在群晖重启后会被清空。为防止重启后容器无法启动,请在 DSM 配置开机自启任务:

  1. 登录群晖 DSM 网页后台。
  2. 打开 控制面板 -> 任务计划。
  3. 点击 新增 -> 触发的任务 -> 用户定义的脚本。
  4. 填写基本信息:
    • 任务名称:Load TUN Module
    • 用户:root
    • 事件:开机
  5. 在 任务设置 的“用户定义的脚本”文本框中粘贴以下内容并保存:
    mkdir -p /dev/net
    mknod /dev/net/tun c 10 200
    chmod 600 /dev/net/tun
    insmod /lib/modules/tun.ko
    

常用维护指令

操作类型 命令
查看节点状态与 IP sudo docker exec -it tailscale tailscale status
获取 Tailscale IPv4 sudo docker exec -it tailscale tailscale ip -4
重启容器测试持久化 sudo docker restart tailscale
查看容器最近日志 sudo docker logs --tail 30 tailscale

💡 运维小贴士:登录 Tailscale Admin Console,找到你的群晖节点,点击右侧 ... 选择 Disable key expiry(禁用密钥过期),防止设备密钥到期后自动注销。