跳到主要内容

Docker 登入云雀通:用户态与 TUN 模式

云雀通(Larktun)提供多架构 Docker 镜像,可以让 Linux 服务器、NAS、旁路网关或其他容器化设备接入云雀通网络。本教程会介绍两种登入方式:

  • 用户态(userspace)模式:权限要求低,不需要宿主机提供 TUN 设备。
  • 内核 TUN 模式:使用宿主机网络栈,适合需要完整网络能力或子网路由的 Linux 设备。

无论选择哪一种方式,都需要使用在云雀通控制台创建的 Auth Key,并把登录服务器设置为 https://hs.larktun.com

Auth Key 必须来自云雀通

不要使用 Tailscale 管理后台创建的密钥。本教程所需的 Auth Key 必须在云雀通控制台创建。它相当于设备的登入密码,请勿提交到 Git 仓库,也不要放进聊天记录、工单或截图。

开始前准备

  • 一台已经安装并启动 Docker 的 Linux 服务器、NAS 或其他设备。
  • 一个可用的云雀通账号
  • 当前账号还有可用的设备接入名额。
  • 宿主机可以访问镜像仓库 registry.larktun.com 和登录服务器 https://hs.larktun.com

可以先确认 Docker 正常运行:

docker version

1. 下载云雀通 Docker 镜像

当前推荐镜像是:

docker pull registry.larktun.com/larktun/larktun:latest

latest 是多架构镜像,Docker 会根据宿主机自动选择:

  • linux/amd64:常见的 x86-64 服务器、PC 和虚拟机
  • linux/arm64:ARM64 NAS、ARM 服务器和 Apple Silicon Linux 虚拟机
  • linux/arm/v7:部分 32 位 ARM 设备
生产环境建议

完成测试后,可以把 latest 替换为经过验证的固定版本或镜像摘要,便于以后回滚和排查问题。

2. 在云雀通控制台创建 Auth Key

  1. 登入云雀通控制台,进入你的租户或工作空间。
  2. 在左侧导航栏打开 Nodes(设备) 页面。
  3. 点击 生成授权密钥,为这台 Docker 设备创建一枚专用 Auth Key。
  4. 立即复制并妥善保存密钥。密钥通常只会完整显示一次。

不要和桌面客户端、路由器或其他服务器共用同一枚 Auth Key。

为了避免把密钥直接写进 Shell 历史记录,可以在 Linux Bash 中执行:

read -rsp "粘贴云雀通 Auth Key(输入内容不会显示): " TS_AUTHKEY && echo
export TS_AUTHKEY

后面的 Docker 命令会读取这个临时环境变量。请不要把真实密钥替换进本文或提交到仓库。

3. 选择登入方式

两种模式都能让 Docker 节点登入云雀通,但网络能力和权限不同。只需选择其中一种运行,不要同时启动两个同名容器。

对比项用户态(userspace)模式内核 TUN 模式
是否需要 /dev/net/tun不需要需要
是否需要额外权限不需要 NET_ADMIN需要 NET_ADMINNET_RAW
是否使用宿主机网络是,使用 --network=host
适合场景低权限登入、容器自身接入、SOCKS5/HTTP 代理Linux 服务器完整接入、宿主机网络、子网路由
是否适合宣告宿主机子网不适合适合

不确定时,先使用用户态模式;只有在明确需要宿主机路由或子网路由时,再选择内核 TUN 模式。

4. 方式一:使用用户态模式登入

用户态模式是默认方式,不需要 --network=hostNET_ADMIN/dev/net/tun。运行下面的命令:

docker run -d --name larktun \
--restart unless-stopped \
-e TS_AUTHKEY \
-e TS_EXTRA_ARGS="--login-server=https://hs.larktun.com" \
-e TS_USERSPACE="true" \
-e TS_STATE_DIR="/var/lib/larktun" \
-e TS_HOSTNAME="larktun-userspace" \
-e TS_AUTH_ONCE="true" \
-v larktun-state:/var/lib/larktun \
registry.larktun.com/larktun/larktun:latest

这个模式只会让容器进入云雀通网络,不会自动给宿主机添加云雀通路由,也不能宣告宿主机子网

如果宿主机上的程序需要通过代理访问云雀通网络,可以在创建容器时额外启用仅本机可访问的 SOCKS5 或 HTTP 代理:

-p 127.0.0.1:1080:1080
-p 127.0.0.1:8080:8080
-e TS_SOCKS5_SERVER=0.0.0.0:1080
-e TS_OUTBOUND_HTTP_PROXY_LISTEN=0.0.0.0:8080

代理地址分别是 socks5://127.0.0.1:1080http://127.0.0.1:8080。不要在没有访问控制的情况下把代理端口绑定到公网地址。

5. 方式二:使用内核 TUN 模式登入

内核 TUN 模式会使用宿主机网络 namespace,并创建云雀通相关接口和路由。它适合需要完整网络能力的 Linux 服务器,也是在 Docker 中宣告子网路由的前提。

先确认宿主机存在 TUN 设备:

ls -l /dev/net/tun

然后运行:

docker run -d --name larktun \
--restart unless-stopped \
--network=host \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
--device=/dev/net/tun:/dev/net/tun \
-e TS_AUTHKEY \
-e TS_EXTRA_ARGS="--login-server=https://hs.larktun.com" \
-e TS_USERSPACE="false" \
-e TS_STATE_DIR="/var/lib/larktun" \
-e TS_HOSTNAME="larktun-tun" \
-e TS_AUTH_ONCE="true" \
-e TS_PRESERVE_UNDERLAY_ROUTES="true" \
-v larktun-state:/var/lib/larktun \
registry.larktun.com/larktun/larktun:latest

TS_PRESERVE_UNDERLAY_ROUTES=true 用于保护宿主机已有的底层网络和 DNS 路由。对于底层 DNS 位于 100.64.0.0/10 网段的云服务器,还可以按实际地址设置 TS_PRESERVE_UNDERLAY_DNS;例如阿里云常见地址为 100.100.2.136,100.100.2.138

如果还要访问宿主机所在局域网,需要在 TUN 模式中设置 TS_ROUTES,并在控制台批准宣告的路由。具体步骤请参阅批准子网路由

使用 Docker Compose 部署 TUN 子网路由

如果希望把配置保存下来统一管理,可以在部署目录中创建 compose.yaml。下面的示例使用内核 TUN 模式,并宣告宿主机局域网 192.168.1.0/24

compose.yaml
services:
larktun:
image: registry.larktun.com/larktun/larktun:latest
container_name: larktun
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
- NET_RAW
devices:
- /dev/net/tun:/dev/net/tun
environment:
TS_AUTHKEY: "替换成你的-auth-key"
TS_EXTRA_ARGS: "--login-server=https://hs.larktun.com"
TS_USERSPACE: "false"
TS_STATE_DIR: "/var/lib/larktun"
TS_HOSTNAME: "larktun-subnet-router"
TS_ROUTES: "192.168.1.0/24"
TS_PRESERVE_UNDERLAY_ROUTES: "true"
TS_PRESERVE_UNDERLAY_DNS: "100.100.2.136,100.100.2.138"
volumes:
- larktun-state:/var/lib/larktun

volumes:
larktun-state:

部署前需要修改:

  • 替换成你的-auth-key 换成在云雀通控制台创建的 Auth Key。
  • 192.168.1.0/24 换成宿主机实际要宣告的局域网子网。多个子网使用英文逗号分隔。
  • 100.100.2.136,100.100.2.138 是阿里云常见的底层 DNS。其他环境应改成实际 DNS 地址;不需要手动保护时可以删除 TS_PRESERVE_UNDERLAY_DNS
保护 compose.yaml 中的 Auth Key

这个示例会把 Auth Key 写入 compose.yaml。请限制文件权限,并确保它被 .gitignore 排除,不要把真实密钥提交到仓库。更严格的生产环境应使用受保护的密钥管理方式。

启动并检查状态:

docker compose up -d
docker compose ps
docker compose logs --tail=80 larktun
docker compose exec larktun larktun status

设备上线后,还需要在云雀通控制台批准 TS_ROUTES 宣告的子网,否则其他设备不会使用这条子网路由。

以后更新镜像并重新创建容器时,larktun-state 数据卷会继续保留节点状态:

docker compose pull
docker compose up -d

6. 确认登入成功

如果使用了前面的 docker run 方式和临时环境变量,先清除当前终端里的密钥变量:

unset TS_AUTHKEY

然后依次检查容器、日志和云雀通状态:

docker ps --filter name=larktun
docker logs --tail=80 larktun
docker exec -it larktun larktun status

登入成功时,你应该看到:

  1. docker ps 中的 larktun 容器处于运行状态。
  2. larktun status 能列出当前云雀通网络中的设备。
  3. 返回云雀通控制台的 Nodes(设备) 页面并刷新后,新 Docker 节点显示为在线。

状态目录保存在 larktun-state 数据卷中。重新创建容器时继续挂载这个数据卷,并保留 TS_AUTH_ONCE=true,可以避免已有状态下重复使用 Auth Key 登入。

常见问题

控制台中看不到 Docker 设备

确认 Auth Key 来自云雀通控制台、没有过期或被撤销,并检查 TS_EXTRA_ARGS 中的地址完整写成 --login-server=https://hs.larktun.com。然后查看 docker logs --tail=80 larktun 中的具体错误。

容器重启后出现重复设备

确认命令中同时包含 TS_STATE_DIR=/var/lib/larktunTS_AUTH_ONCE=true-v larktun-state:/var/lib/larktun。删除容器不会自动删除数据卷,但换用新的数据卷会丢失原有节点状态。

TUN 模式提示找不到 /dev/net/tun

宿主机内核可能没有加载 TUN/TAP,或者当前 Docker 环境不允许映射该设备。请先修复宿主机 TUN 支持;如果环境无法提供 TUN,请改用用户态模式。

TUN 模式启动后域名解析失败

保留 TS_PRESERVE_UNDERLAY_ROUTES=true。如果云服务器的底层 DNS 地址位于 100.64.0.0/10,再通过 TS_PRESERVE_UNDERLAY_DNS 明确填写 DNS 地址,然后重新创建容器。阿里云 ECS 的完整排查步骤请参阅云雀通与阿里云:解决 Linux 与 Docker DNS 无法联网

提示容器名 larktun 已存在

如果正在切换模式,可以删除旧容器后重新运行所选模式的命令:

docker rm -f larktun

这个命令不会删除 larktun-state 数据卷。除非你明确要注销并清除节点状态,否则不要删除该数据卷。

更新与日常操作

# 查看版本
docker exec -it larktun larktun version

# 查看日志
docker logs -f larktun

# 拉取推荐镜像
docker pull registry.larktun.com/larktun/larktun:latest

# 保留状态并重启
docker restart larktun

下一步