在部分环境中,用户希望通过容器方式部署 xEdge 服务,或者将运行容器的主机作为子网路由器,把本地局域网网段发布到 xEdge 安全内网。此时可以使用 xEdge 基于 Tailscale 开源代码构建的容器镜像。
xEdge 容器镜像的使用方式与 Tailscale 官方容器镜像基本一致,容器内命令仍然是 tailscale。xEdge 镜像主要调整了默认登录服务器,并内置 xEdge 所需的网络 fallback 配置。
xEdge 容器镜像发布在阿里云镜像服务:
registry.cn-hangzhou.aliyuncs.com/xedge/xedge
拉取最新镜像:
docker pull registry.cn-hangzhou.aliyuncs.com/xedge/xedge:latest
latest / v1.98.8:基于 Tailscale 开源版本 v1.98.8 构建 xEdge 镜像。v1.56.1 基于 Tailscale 开源版本 v1.56.1 构建。运行容器前,请先在 xEdge 控制台创建认证 Key,并在启动容器时通过 TS_AUTHKEY 传入。TS_AUTHKEY 和 TS_AUTH_KEY 都可以被识别,建议统一使用 TS_AUTHKEY。
如果要让容器使用内核 TUN 网络模式,宿主机需要支持 /dev/net/tun,并允许容器使用主机网络和网络管理能力。本文优先推荐内核 TUN 模式,性能更好,也更适合作为子网路由器使用。
如果宿主机无法暴露 /dev/net/tun,也无法给容器增加网络管理权限,可以使用用户态网络模式。用户态模式不需要特权参数,但转发性能和网络兼容性通常不如内核 TUN 模式。
以下命令会启动一个普通 xEdge 容器,并将状态持久化到宿主机的 /var/lib/xedge 目录:
mkdir -p /var/lib/xedge
docker run -d --name=xedged \
-e TS_USERSPACE='false' \
-e TS_KUBE_SECRET='' \
-e TS_STATE_DIR='/var/lib/xedge' \
-e TS_AUTH_ONCE='true' \
-e TS_AUTHKEY='tskey-xxxxxxxxxxxxxxxx' \
-v /var/lib/xedge:/var/lib/xedge \
-v /dev/net/tun:/dev/net/tun \
--network=host \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
registry.cn-hangzhou.aliyuncs.com/xedge/xedge:latest
请将 tskey-xxxxxxxxxxxxxxxx 替换为你自己的 xEdge 认证 Key。
如果希望容器所在主机作为子网路由器,请增加 TS_ROUTES 参数。多个网段使用英文逗号分隔,不要添加空格。
示例:发布 172.17.0.0/16 网段。
mkdir -p /var/lib/xedge
docker run -d --name=xedged-as-sr \
-e TS_USERSPACE='false' \
-e TS_KUBE_SECRET='' \
-e TS_STATE_DIR='/var/lib/xedge' \
-e TS_AUTH_ONCE='true' \
-e TS_AUTHKEY='tskey-xxxxxxxxxxxxxxxx' \
-e TS_ROUTES='172.17.0.0/16' \
-v /var/lib/xedge:/var/lib/xedge \
-v /dev/net/tun:/dev/net/tun \
--network=host \
--cap-add=NET_ADMIN \
--cap-add=NET_RAW \
registry.cn-hangzhou.aliyuncs.com/xedge/xedge:latest
容器启动成功后,还需要在 xEdge 控制台中允许该节点发布的子网路由。此步骤与普通 xEdge/Tailscale 子网路由器一致。
如果 Docker 宿主机无法映射 /dev/net/tun,或者不允许给容器添加 NET_ADMIN、NET_RAW 权限,可以使用用户态网络模式运行。此模式下不需要 --network=host、不需要映射 /dev/net/tun,也不需要额外的 Linux capability。
示例:以低权限方式发布 172.17.0.0/16 网段。
mkdir -p /var/lib/xedge
docker run -d --name=xedged-userspace-sr \
-e TS_USERSPACE='true' \
-e TS_KUBE_SECRET='' \
-e TS_STATE_DIR='/var/lib/xedge' \
-e TS_AUTH_ONCE='true' \
-e TS_AUTHKEY='tskey-xxxxxxxxxxxxxxxx' \
-e TS_ROUTES='172.17.0.0/16' \
-v /var/lib/xedge:/var/lib/xedge \
registry.cn-hangzhou.aliyuncs.com/xedge/xedge:latest
用户态模式适合受限 Docker 环境,例如宿主机不提供 /dev/net/tun 的云容器、NAS 或面板式 Docker 环境。需要注意:
TS_ROUTES 中填写的网段必须是容器自身可以访问到的网段。--network=host。OpenWRT 的 /var 通常是内存文件系统,设备重启后其中的数据会丢失。如果在 OpenWRT 上运行容器,建议将状态目录放到 /etc/xedge:
mkdir -p /etc/xedge
然后把启动命令中的持久化挂载改为:
-v /etc/xedge:/var/lib/xedge
这样可以避免 OpenWRT 重启后 xEdge 认证状态丢失,导致节点重新认证或安全内网 IP 变化。
TS_USERSPACE:是否使用用户态网络模式,默认值为 true。作为子网路由器或追求更好转发性能时,建议设置为 false,并映射 /dev/net/tun;如果宿主机无法暴露 TUN 设备,则可以保持 true 使用低权限模式。TS_KUBE_SECRET:Kubernetes 环境下用于保存状态的 Secret 名称。非 Kubernetes 环境应设置为空字符串 '',让容器使用本地状态目录。TS_STATE_DIR:容器内保存 xEdge/Tailscale 状态的目录。非 Kubernetes 环境建议使用 /var/lib/xedge,并通过 Docker volume 持久化。TS_AUTH_ONCE:设置为 true 时,已有状态可用时不会每次启动都重新认证,可避免重复产生节点。TS_AUTHKEY:xEdge 认证 Key。也兼容 TS_AUTH_KEY,但建议统一使用 TS_AUTHKEY。TS_ROUTES:需要发布的子网路由,例如 192.168.1.0/24。多个网段使用英文逗号分隔,例如 192.168.1.0/24,10.0.0.0/24。--network=host:让容器使用宿主机网络,子网路由器场景建议启用。--cap-add=NET_ADMIN 和 --cap-add=NET_RAW:允许容器配置网络接口、路由和防火墙规则。-v /dev/net/tun:/dev/net/tun:将宿主机 TUN 设备映射进容器,TS_USERSPACE=false 时需要。-v /var/lib/xedge:/var/lib/xedge:将 xEdge 状态持久化到宿主机,避免容器重建或重启后丢失登录状态。查看容器日志:
docker logs -f xedged
查看 xEdge 状态:
docker exec -it xedged tailscale status
重启容器:
docker restart xedged
停止并删除容器:
docker stop xedged
docker rm xedged
如果删除容器但保留宿主机状态目录 /var/lib/xedge,重新创建容器后通常可以继续使用原来的节点状态。