群晖 Docker 部署 Tailscale 异地组网完整指南
本指南记录了在群晖(Synology DSM)环境中使用 Docker 成功部署 Tailscale 并实现持久化登录、内核 TUN 自动加载的完整实施步骤。
核心原理说明
在群晖 DSM 环境中使用 Docker 运行 Tailscale 时,需满足以下三大关键条件:
- 网络模式 (Host):必须使用
--net=host参数,让容器直接共享宿主机网络栈。 - 内核权限 (TUN):必须创建并加载群晖系统的
/dev/net/tun内核模块,并赋予--privileged容器特权。 - 持久化存储 (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
- 终端会输出绑定网址,例如:
https://login.tailscale.com/a/xxxxxxx。 - 复制网址到浏览器打开,登录你的 Tailscale 账号并点击 Authorize。
- 授权完成后,在终端检查持久化目录:
确认目录下已成功生成sudo ls -la /volume2/docker/tailscaletailscaled.state凭证文件。
防丢失配置:开机自动加载 TUN 模块
手动加载的 tun.ko 模块在群晖重启后会被清空。为防止重启后容器无法启动,请在 DSM 配置开机自启任务:
- 登录群晖 DSM 网页后台。
- 打开 控制面板 -> 任务计划。
- 点击 新增 -> 触发的任务 -> 用户定义的脚本。
- 填写基本信息:
- 任务名称:
Load TUN Module - 用户:
root - 事件:
开机
- 任务名称:
- 在 任务设置 的“用户定义的脚本”文本框中粘贴以下内容并保存:
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(禁用密钥过期),防止设备密钥到期后自动注销。