🚀 使用 Docker Compose 部署 Tailscale DERP 中继服务器
🚀 使用 Docker Compose 部署 Tailscale DERP 中继服务器
本文将详细介绍如何使用 Docker Compose 部署 Tailscale DERP 中继服务器。DERP(Detoured Encrypted Routing Protocol)是 Tailscale 的中继协议,当两个设备无法直接建立点对点连接时,DERP 服务器会协助中转流量。
💡 DERP 服务器的作用
- 中继流量:在 NAT 穿透失败或网络限制严格时,DERP 服务器会中转加密的流量。
- 协调连接:帮助设备之间交换连接信息,并协调建立最佳通信路径。
- 提升连接稳定性:自建 DERP 服务器可以避免因官方服务器网络波动或延迟过高导致的问题,尤其能改善中国大陆地区的连接质量。
📦 部署前准备
- 服务器选择:推荐使用云服务器(如腾讯云轻量应用服务器,可选非大陆地区如香港;或 Racknerd 美西服务器)。系统建议选择 Debian 10 或以上,或 Ubuntu。
- 环境要求:确保服务器已安装 Docker 和 Docker Compose。
- 网络与防火墙:
- 确保服务器的 3478/UDP 端口(STUN 服务使用)和 36666/TCP 端口(DERP 服务使用)已开放。
- 部分云服务器商(如阿里云)需在安全组中放行 UDP 协议,否则可能导致
UDP is blocked错误。
- 域名(可选):如果希望使用域名并配置有效的 SSL 证书,请准备一个域名。本教程使用自签名证书,因此非必须。
项目简介
Tailscale DERP(Distributed Relay Protocol)是 Tailscale 生态中的 分布式中继服务,核心作用是解决节点间 P2P 连接失败(如复杂 NAT 环境、跨运营商网络)时的通信问题 —— 当 Tailscale 节点无法直接建立 P2P 连接时,会自动通过 DERP 服务器中继数据,确保虚拟网络通信不中断。
本次部署基于自定义 Dockerfile 构建 DERP 服务器,具备以下核心特点:
- 轻量化构建:基于 Alpine 镜像,最终镜像体积小(约 100MB),内存占用 < 50MB,适配低配置服务器;
- 自签长期证书:自动生成有效期 10 年的 SSL 证书(基于 OpenSSL),避免频繁证书续期;
- 自定义端口:默认映射 36666(DERP 核心通信端口,TCP)和 3478(NAT 穿透辅助端口,UDP),可灵活调整;
- 编译优化:从源码编译 DERP 二进制文件,去除域名验证限制(适配自建场景),并切换国内 Go 模块代理(可选),加速构建;
- 时区同步:默认同步上海时区,确保日志时间与本地一致,便于问题排查。
⚙️ 配置 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/TCP 和 3478/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 --version、docker 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 |
服务器重启或容器意外退出后自动恢复,确保中继服务长期可用。 |
🚀 启动与验证
-
启动服务 运行以下命令启动 DERP 服务:
bash docker compose up -d -
验证服务状态
- 检查容器是否正常运行:
bash docker compose ps - 查看容器日志,确认无报错:
bash docker compose logs tailscale-derp
- 检查容器是否正常运行:
-
访问测试 在浏览器中访问
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年)或需更换域名,需修改 Dockerfile 中 openssl 命令的相关参数(域名和有效期),然后重新构建镜像。
更新 SSL 证书(自签证书到期前)
若需替换为真实 SSL 证书(如 Let's Encrypt 证书):
1.将证书文件(如 derp.crt、derp.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/UDP 和 36666/TCP 已放行。 2. 核对 Tailscale ACL 中 derpMap 的 HostName 和端口号是否与部署配置一致。 |
浏览器访问 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 官方文档。