Skip to content

🚀 使用 Docker Compose 部署 Tailscale DERP 中继服务器

🚀 使用 Docker Compose 部署 Tailscale DERP 中继服务器

本文将详细介绍如何使用 Docker Compose 部署 Tailscale DERP 中继服务器。DERP(Detoured Encrypted Routing Protocol)是 Tailscale 的中继协议,当两个设备无法直接建立点对点连接时,DERP 服务器会协助中转流量。

💡 DERP 服务器的作用

  • 中继流量:在 NAT 穿透失败或网络限制严格时,DERP 服务器会中转加密的流量。
  • 协调连接:帮助设备之间交换连接信息,并协调建立最佳通信路径。
  • 提升连接稳定性:自建 DERP 服务器可以避免因官方服务器网络波动或延迟过高导致的问题,尤其能改善中国大陆地区的连接质量。

📦 部署前准备

  1. 服务器选择:推荐使用云服务器(如腾讯云轻量应用服务器,可选非大陆地区如香港;或 Racknerd 美西服务器)。系统建议选择 Debian 10 或以上,或 Ubuntu
  2. 环境要求:确保服务器已安装 DockerDocker Compose
  3. 网络与防火墙
    • 确保服务器的 3478/UDP 端口(STUN 服务使用)和 36666/TCP 端口(DERP 服务使用)已开放。
    • 部分云服务器商(如阿里云)需在安全组中放行 UDP 协议,否则可能导致 UDP is blocked 错误。
  4. 域名(可选):如果希望使用域名并配置有效的 SSL 证书,请准备一个域名。本教程使用自签名证书,因此非必须。

项目简介

Tailscale DERP(Distributed Relay Protocol)是 Tailscale 生态中的 分布式中继服务,核心作用是解决节点间 P2P 连接失败(如复杂 NAT 环境、跨运营商网络)时的通信问题 —— 当 Tailscale 节点无法直接建立 P2P 连接时,会自动通过 DERP 服务器中继数据,确保虚拟网络通信不中断。

本次部署基于自定义 Dockerfile 构建 DERP 服务器,具备以下核心特点:

  1. 轻量化构建:基于 Alpine 镜像,最终镜像体积小(约 100MB),内存占用 < 50MB,适配低配置服务器;
  2. 自签长期证书:自动生成有效期 10 年的 SSL 证书(基于 OpenSSL),避免频繁证书续期;
  3. 自定义端口:默认映射 36666(DERP 核心通信端口,TCP)和 3478(NAT 穿透辅助端口,UDP),可灵活调整;
  4. 编译优化:从源码编译 DERP 二进制文件,去除域名验证限制(适配自建场景),并切换国内 Go 模块代理(可选),加速构建;
  5. 时区同步:默认同步上海时区,确保日志时间与本地一致,便于问题排查。

⚙️ 配置 Docker Compose

1.创建项目目录并文件 登录你的服务器,创建一个项目目录,例如 tailscale-derp,并进入该目录:

    mkdir tailscale-derp && cd tailscale-derp

2.创建 Dockerfile 将你提供的 Dockerfile 内容保存到该目录下。这个 Dockerfile 会: * 使用多阶段构建,从 Golang Alpine 环境编译 derper 二进制文件。 * 移除域名验证:注释掉 cert.go 文件的 91-93 行,这是为了允许使用自签名证书或 IP 地址直接访问。 * 在最终镜像中生成一个自签名的 10 年有效证书derp.javaow.com 可替换为你自己的域名或保持不动)。

3.创建 docker-compose.yml 将你提供的 docker-compose.yml 内容保存到该目录下。此配置: * 使用上面 Dockerfile 构建的镜像。 * 将容器的 36666/TCP3478/UDP 端口映射到宿主机。 * 设置容器自动重启。

4.构建镜像 执行以下命令构建 tailscale-derp 镜像:

    docker compose build

准备: Tailscale DERP 服务器需部署在有公网 IP 的设备上(便于 Tailscale 节点访问),需提前完成工具安装、端口开放与配置文件准备:

1. 系统与硬件要求

要求类型 具体说明
操作系统 仅支持 Linux(Ubuntu 20.04+/Debian 11+/CentOS 7+),不支持 Windows/macOS(需 WSL2)。
必备工具 Docker + Docker Compose(验证命令:docker --versiondocker compose version)。
硬件资源 最低配置:1 核 CPU、512MB 内存、1GB 磁盘空间(编译过程需临时占用,最终镜像仅需 100MB)。
网络要求 需公网 IP(关键!Tailscale 节点需通过公网访问 DERP 服务器),并开放指定端口。

2. 端口准备(必须开放,核心通信依赖)

DERP 服务器依赖两个端口,需在防火墙 / 安全组中开放:

端口 协议 用途说明 开放命令(Linux UFW 防火墙)
36666 TCP DERP 核心中继端口(节点与服务器通信) sudo ufw allow 36666/tcp
3478 UDP NAT 穿透辅助端口(帮助节点探测网络环境) sudo ufw allow 3478/udp
  • 云服务器用户:需在阿里云 / 腾讯云等控制台的「安全组」中添加上述端口的入站规则;
  • 本地公网设备(如路由器):需在「端口转发」中映射这两个端口到 DERP 服务器。

3. 目录与配置文件准备

需创建部署主目录,并将 docker-compose.yml 和 Dockerfile 放入目录(文件内容使用用户提供的配置):

# 1. 创建部署主目录(示例:/opt/tailscale-derp,可自定义)
mkdir -p /opt/tailscale-derp && cd /opt/tailscale-derp

# 2. 创建 Dockerfile(复制用户提供的内容)
cat > Dockerfile << 'EOF'
# 编译阶段
FROM golang:alpine AS builder

# 可选:切换国内Go模块代理(加速源码拉取,注释则使用默认代理)
# RUN go env -w GOPROXY=https://goproxy.cn,direct

# 拉取DERP源码并安装
RUN go install tailscale.com/cmd/derper@latest

# 去除域名验证(删除cmd/derper/cert.go文件的91~93行,适配自建场景)
RUN find /go/pkg/mod/tailscale.com@*/cmd/derper/cert.go -type f -exec sed -i '91,93d' {} +

# 编译DERP二进制文件
RUN derper_dir=$(find /go/pkg/mod/tailscale.com@*/cmd/derper -type d) && \
    cd $derper_dir && \
    go build -o /etc/derp/derper

# 最终镜像阶段
FROM alpine:latest

WORKDIR /apps

# 复制编译好的二进制文件
COPY --from=builder /etc/derp/derper .

# 同步上海时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezone

ENV LANG C.UTF-8

# 适配AMD架构:创建软链接(Arm架构可注释此步骤)# 创建软链接 解决二进制无法执行问题 Amd架构必须执行,Arm不需要执行
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

# 切换Alpine国内源(加速依赖安装)# 添加源
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

# 安装OpenSSL并创建证书目录 # 安装openssl
RUN apk add openssl && mkdir /ssl

# 生成自签10年SSL证书(CN为derp.javaow.com,可替换为自定义域名) # 生成自签10年证书
RUN openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /ssl/derp.javaow.com.key -out /ssl/derp.javaow.com.crt -subj "/CN=derp.javaow.com" -addext "subjectAltName=DNS:derp.javaow.com"

# 启动命令:指定域名、端口、证书模式与证书目录
CMD ./derper -hostname derp.javaow.com -a :36666 -certmode manual -certdir /ssl
EOF

# 3. 创建 docker-compose.yml(复制用户提供的内容)
cat > docker-compose.yml << 'EOF'
#version: '2'
services:
    tailscale-derp:
        image: tailscale-derp  # 本地构建的镜像名(需与构建命令一致)
        container_name: tailscale-derp  # 容器名,便于管理
        ports:
            - '36666:36666'  # DERP核心端口:主机36666 → 容器36666(TCP)
            - '3478:3478/udp' # NAT辅助端口:主机3478 → 容器3478(UDP)
        restart: always  # 容器退出后自动重启,保障服务稳定
    #network_mode: "host"  # 注释:默认使用桥接模式,避免端口冲突(新手不建议开启host)  # 使用本地网络, 方便连接各子网的客户端
    #privileged: true      # 注释:无需特权模式,桥接模式即可满足需求
EOF

4. 关键参数预处理(新手必改)

Dockerfile 中有一处需根据实际情况修改:自签证书的域名(默认 derp.javaow.com)。若无需绑定真实域名,可直接使用公网 IP 替换(或保持默认,不影响功能,但客户端需忽略证书验证):

  • 修改位置:Dockerfile 中 RUN openssl req ... -subj "/CN=derp.javaow.com" -addext "subjectAltName=DNS:derp.javaow.com"
  • 示例:若公网 IP 为 1.2.3.4,则改为:
    RUN openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes -keyout /ssl/1.2.3.4.key -out /ssl/1.2.3.4.crt -subj "/CN=1.2.3.4" -addext "subjectAltName=IP:1.2.3.4"
  • 同时修改启动命令中的 hostname
    CMD ./derper -hostname 1.2.3.4 -a :36666 -certmode manual -certdir /ssl

配置 Docker Compose2

核心步骤是 构建本地镜像(因 image: tailscale-derp 非官方镜像,需从 Dockerfile 构建),再通过 Compose 启动容器:

1. 构建 DERP 镜像

在部署主目录执行构建命令(首次构建需拉取 Go 源码和依赖,耗时 5-10 分钟,取决于网络):

cd /opt/tailscale-derp
# 构建镜像,指定镜像名为 tailscale-derp(与 docker-compose.yml 中的 image 一致)
docker build -t tailscale-derp .
  • 构建成功标志:终端输出 Successfully tagged tailscale-derp:latest

2. 解读核心配置(新手必看)

配置文件 关键参数 作用与注意事项
Dockerfile go install tailscale.com/cmd/derper@latest 从 Tailscale 官方源码拉取最新 DERP 工具,确保功能最新。
Dockerfile sed -i '91,93d' {} + 删除域名验证代码,避免自建服务器因域名不匹配被拒绝(官方 DERP 限制域名,自建需去除)。
Dockerfile 自签证书命令 生成 10 年有效期证书,无需频繁续期;若有真实 SSL 证书,可替换此步骤(将证书放入 /ssl 目录)。
docker-compose.yml ports: 36666:36666 主机端口可自定义(如 36667:36666),但需同步修改 Tailscale 客户端配置中的 DERP 端口。
docker-compose.yml restart: always 服务器重启或容器意外退出后自动恢复,确保中继服务长期可用。

🚀 启动与验证

  1. 启动服务 运行以下命令启动 DERP 服务: bash docker compose up -d

  2. 验证服务状态

    • 检查容器是否正常运行: bash docker compose ps
    • 查看容器日志,确认无报错: bash docker compose logs tailscale-derp
  3. 访问测试 在浏览器中访问 https://你的服务器IP:36666。由于使用了自签名证书,浏览器会提示"不安全",点击"高级"继续访问即可。如果看到 DERP 相关的提示页面(如 "DERP http server" 或 "go derper" 字样),说明服务已成功运行。

🔧 基础配置与使用

1.在 Tailscale 控制台配置 DERP 要使自建的 DERP 服务器被你的 Tailscale 网络使用,需要在 Tailscale 控制台进行配置。 * 登录 Tailscale 控制台,进入 Access Controls 页面。 * 在 ACL 配置的顶层 JSON 中,添加或修改 derpMap 部分。以下是一个配置示例,请将 你的服务器IP 替换为实际 IP:

        {
          "derpMap": {
            "OmitDefaultRegions": true,
            "Regions": {
              "900": {
                "RegionID": 900,
                "RegionCode": "myderp",
                "RegionName": "My DERP Server",
                "Nodes": [
                  {
                    "Name": "1",
                    "RegionID": 900,
                    "HostName": "你的服务器IP",
                    "DERPPort": 36666,
                    "STUNPort": 3478
                  }
                ]
              }
            }
          }
        }
    *   `OmitDefaultRegions`: 设置为 `true` 时,客户端将**仅连接**你自建的 DERP 服务器;设置为 `false` 时,当自建服务器不可用时,会回退到官方服务器。
    *   `RegionID`: 区域 ID,自建服务器建议使用 900 以上的数字。
    *   `HostName`: 你的服务器 IP 地址或域名。
    *   `DERPPort` 和 `STUNPort`: 与 `docker-compose.yml` 中映射的端口一致。

2.客户端验证 * 在客户端设备上,执行以下命令检查网络状态,确认你的 DERP 服务器已被识别并显示延迟:

        tailscale netcheck
*   你也可以通过以下命令查看当前节点使用的 DERP 服务器区域 ID:
        tailscale status

🔧 基础配置与使用2(核心:Tailscale 客户端接入自建 DERP)

部署 DERP 服务器后,需配置 Tailscale 客户端(如电脑、手机、NAS)使用自建中继,替代 Tailscale 官方 DERP 节点:

1. 找到 Tailscale 客户端配置文件

客户端系统 配置文件路径
Linux /etc/tailscale/tailscaled.conf
Windows C:\ProgramData\Tailscale\tailscaled.conf
macOS /Library/Application Support/Tailscale/tailscaled.conf

2. 编辑配置文件,添加自建 DERP 服务器

在配置文件末尾添加以下内容(替换 1.2.3.4:36666 为你的 DERP 服务器公网 IP 和端口):

# 禁用 Tailscale 官方 DERP 节点(可选,仅使用自建)
DERP_NO_DEFAULT=true

# 添加自建 DERP 服务器(id 可自定义,如 100;region 为地区名,如 "MyDERP")
DERP_MAP='{"Regions":{"100":{"RegionID":100,"RegionCode":"myderp","RegionName":"My DERP","Nodes":[{"Name":"node1","HostName":"1.2.3.4","Port":36666,"Insecure":true}]}}}'
  • 关键参数说明:
    • Insecure: true:因使用自签证书,需跳过证书验证;若有真实 SSL 证书,改为 Insecure: false
    • RegionID:唯一标识(1-99 为官方节点,自建建议用 100+)。

3. 重启 Tailscale 客户端,生效配置

  • Linux:sudo systemctl restart tailscaled
  • Windows:在 “服务” 中重启 “Tailscale” 服务
  • macOS:打开 Tailscale 客户端 → 退出 → 重新打开

4. 验证客户端是否使用自建 DERP

在客户端执行以下命令,查看 DERP 连接状态:

# Tailscale 客户端命令(Linux/macOS 终端,Windows PowerShell)
tailscale status --peers
  • 若输出中显示 derp=myderp(与配置中的 RegionCode 一致),说明客户端已成功使用自建 DERP 服务器。

🛠️ 维护与管理

1.更新与重启 * 若需更新服务(例如 Dockerfile 有变动),可重新构建镜像并启动:

        docker compose down
        docker compose build
        docker compose up -d
*   日常重启服务可使用 `docker compose restart`。

2.日志监控 定期检查容器日志,有助于排查问题:

    docker compose logs --tail=50 -f tailscale-derp

3.证书管理 本教程使用的 Dockerfile 在构建时已生成自签名证书。若证书过期(本例为10年)或需更换域名,需修改 Dockerfileopenssl 命令的相关参数(域名和有效期),然后重新构建镜像。

更新 SSL 证书(自签证书到期前)

若需替换为真实 SSL 证书(如 Let's Encrypt 证书):

1.将证书文件(如 derp.crtderp.key)放入宿主机目录(如 /opt/tailscale-derp/ssl); 2.修改 docker-compose.yml,添加证书目录挂载:

    volumes:
      - ./ssl:/ssl  # 宿主机 ./ssl → 容器 /ssl(覆盖容器内自签证书)

3.重启容器:docker compose up -d; 4.修改 Tailscale 客户端配置中的 Insecure: false,重启客户端。

🐛 常见问题排查

问题现象 可能原因 解决方案
容器启动失败 Dockerfile 编译错误,或端口被占用。 检查 docker compose logs 输出的错误信息。确认宿主机 36666/TCP 和 3478/UDP 端口未被占用。
客户端无法连接 DERPer,tailscale netcheck 显示 DERP 不可用 防火墙/安全组未正确开放端口;ACL 中的 derpMap 配置错误(如 IP、端口不符)。 1. 检查服务器本地防火墙及云服务商安全组设置,确保 3478/UDP36666/TCP 已放行。
2. 核对 Tailscale ACL 中 derpMapHostName 和端口号是否与部署配置一致。
浏览器访问 https://IP:36666 被拒绝 服务器防火墙或云安全组未开放 36666/TCP 端口;DERP 服务未成功启动。 1. 检查服务器防火墙及云服务商安全组设置,确保 36666/TCP 已放行。
2. 通过 docker compose logs tailscale-derp 查看服务日志。
客户端报告 UDP is blocked 服务器的 3478/UDP 端口未开放,或被中间网络设备阻断。 重点检查云服务器安全组和服务器本身的防火墙(如 ufw)规则,确保 3478/UDP 已允许入站和出站。

通过以上步骤,你应该已经成功部署并配置了自己的 Tailscale DERP 中继服务器。这将有助于提升你 Tailscale 网络在某些复杂网络环境下的连通性和稳定性。如果在部署过程中遇到其他问题,Tailscale 官方文档和社区也是很好的求助资源。


🐛 常见问题排查2

1. Tailscale 客户端无法连接自建 DERP(日志显示 “DERP connect failed”)

  • 原因 1:DERP 服务器端口未开放或公网 IP 错误。解决:确认 36666/TCP 和 3478/UDP 端口已开放,客户端配置中的 IP 和端口与服务器一致。

  • 原因 2:客户端配置中 Insecure 未设为 true(自签证书)。解决:修改客户端配置文件,将 Insecure 改为 true,重启 Tailscale 客户端。

2. 构建镜像时拉取 Go 源码缓慢(超时错误)

  • 原因:默认 Go 模块代理在国内访问慢。

    解决:取消 Dockerfile 中 # RUN go env -w GOPROXY=https://goproxy.cn,direct 的注释,使用国内代理,重新构建。

3. Arm 架构服务器构建失败(提示 “no such file or directory: /lib64/ld-linux-x86-64.so.2”)

  • 原因:Dockerfile 中 AMD 架构的软链接步骤不适用于 Arm。

    解决:删除 Dockerfile 中 RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 这一行,重新构建。

4. DERP 服务运行正常,但节点仍使用官方 DERP

  • 原因:客户端配置中 DERP_NO_DEFAULT=true 未添加(未禁用官方节点)。

    解决:在客户端配置文件中添加 DERP_NO_DEFAULT=true,重启 Tailscale 客户端,强制使用自建 DERP。

通过以上步骤,新手可成功搭建 Tailscale DERP 中继服务器,解决 Tailscale 节点间 P2P 连接失败的问题,提升虚拟网络稳定性。如需深入配置(如多 DERP 节点负载均衡),可参考 Tailscale DERP 官方文档