这个 Docker 镜像用于运行 Tailscale DERP (Designated Encrypted Relay for Packets) 服务器,DERP 是 Tailscale 网络中用于在直接连接失败时中继加密流量的服务。
本项目基于浅探 Tailscale DERP 中转服务一文的内容创建。
Dockerfile
- 构建 Docker 镜像的配置文件docker-compose.yml
- Docker Compose 配置文件start-derper.sh
- DERP 服务器启动脚本gen-certs.sh
- 自签名证书生成脚本certs/
- 预生成的自签名证书目录README.md
- 项目说明文档
- 镜像中已包含预生成的自签名证书(域名:
derp.selfhost
) - 无需额外配置证书即可快速部署
- 内置测试工具
derpprobe
- 支持客户端验证,防止未授权使用
- 支持在构建时传入自定义主机名
使用 Docker 可以快速部署并隔离运行环境,默认使用 derp.selfhost
作为主机名,没有开启客户端验证:
# 构建镜像
docker build -t tailscale-derp .
# 运行容器
docker run -d \
--name derp-server \
-p 6666:6666/tcp \
-p 7777:7777/udp \
tailscale-derp
您可以在构建镜像时指定自定义的主机名:
# 首先生成对应域名的证书
./gen-certs.sh your.custom.domain
# 使用自定义主机名构建镜像
docker build -t tailscale-derp --build-arg DERP_HOST_ARG=your.custom.domain .
# 运行容器,确保指定正确的DERP_HOST环境变量
docker run -d \
--name derp-server \
-p 6666:6666/tcp \
-p 7777:7777/udp \
-e DERP_HOST=your.custom.domain \
tailscale-derp
可以通过环境变量在使用Docker Compose时指定自定义主机名:
# 首先生成对应域名的证书
./gen-certs.sh your.custom.domain
# 设置环境变量并启动
DERP_HOST=your.custom.domain docker-compose up -d
客户端验证功能可以限制只有您自己的 Tailscale 节点才能使用此 DERP 服务器,防止被他人"白嫖"。要启用此功能,需要将宿主机上的 Tailscale socket 文件映射到容器内:
# 运行带客户端验证的容器
docker run -d \
--name derp-server \
-p 6666:6666/tcp \
-p 7777:7777/udp \
-e VERIFY_CLIENTS=true \
-v /var/run/tailscale:/var/run/tailscale \
tailscale-derp
注意:必须在宿主机上安装并运行Tailscale客户端,才能使用此功能。 安装Tailscale客户端:
curl -fsSL https://tailscale.com/install.sh | sh tailscale up
镜像已包含预生成的自签名证书,域名为derp.selfhost
。如果您需要使用自定义证书,有两种方式:
在构建镜像前,您可以使用提供的脚本生成自定义域名的证书:
# 使用自定义域名生成证书
./gen-certs.sh your.custom.domain
# 然后构建镜像,指定对应的主机名
docker build -t tailscale-derp --build-arg DERP_HOST_ARG=your.custom.domain .
如果您已有证书,可以在运行容器时挂载目录:
docker run -d \
--name derp-server \
-p 6666:6666/tcp \
-p 7777:7777/udp \
-e DERP_HOST="your.custom.domain" \
-v ${PWD}/certs:/etc/derper/certs \
-v /var/run/tailscale:/var/run/tailscale \
tailscale-derp
注意:如果挂载证书目录,证书文件名必须与DERP_HOST环境变量一致,例如对于DERP_HOST=example.com,需要有example.com.crt和example.com.key文件。
您可以通过以下环境变量自定义 DERP 服务器配置:
DERP_HOST
: DERP 服务器的主机名(默认: derp.selfhost)DERP_PORT
: DERP 服务的 HTTPS 端口(默认: 6666)STUN_PORT
: STUN 服务的 UDP 端口(默认: 7777)HTTP_PORT
: HTTP 端口,设置为 -1 禁用 HTTP(默认: -1)VERIFY_CLIENTS
: 是否验证客户端(默认: false)- 设置为
true
时,需要将宿主机上的/var/run/tailscale
目录映射到容器中
- 设置为
在构建镜像时,可以使用以下构建参数:
DERP_HOST_ARG
: 自定义DERP服务器的主机名(默认: derp.selfhost)- 该值会被设置为容器中的默认
DERP_HOST
环境变量值 - 构建时会查找对应名称的证书文件(例如:your.domain.crt, your.domain.key)
- 该值会被设置为容器中的默认
Dockerfile 中已经包含了 derpprobe
工具,可以用来测试 DERP 服务器的连通性:
docker exec -it derp-server derpprobe -derp-map file:///etc/derper/derp-map.json -once
测试成功后,您将看到类似以下输出:
2025/03/09 14:01:56 good: derp/SELFHOST/derp.selfhost/udp: 483.427µs
2025/03/09 14:01:56 good: derpmap-probe: 5.650528ms
export DERP_HOST="derp.selfhost"
export DERP_PUB_IP="233.233.233.233"
export DERP_PUB_PORT=6666
export STUN_PUB_PORT=7777
curl --insecure --resolve "${DERP_HOST}:${DERP_PUB_PORT}:${DERP_PUB_IP}" "https://${DERP_HOST}:${DERP_PUB_PORT}"
nc ${DERP_PUB_IP} ${STUN_PUB_PORT} -v -u
docker cp derp-server:/etc/derper/derp-map.json ./derp-map.json
修改 derp-map.json
文件中的 127.0.0.1
为您的 DERP 服务器 IP 地址
官方默认的 DERP 服务器列表: https://controlplane.tailscale.com/derpmap/default
在您的 Tailscale 管理后台中,修改 ACL 规则中 derpMap
的配置:
"derpMap": {
//"OmitDefaultRegions": true,
// 下面是 derp-map.json 文件内容,请根据实际情况修改 127.0.0.1 为您的 DERP 服务器 IP 地址
"Regions": {
"999": {
"RegionID": 999,
"RegionCode": "SELFHOST",
"Nodes": [
{
"Name": "derp.selfhost",
"RegionID": 999,
"HostName": "derp.selfhost",
"IPv4": "127.0.0.1",
"DERPPort": 6666,
"STUNPort": 7777,
"InsecureForTests": true
}
]
}
}
}
然后在其它 Tailscale 节点中检查是否能正常连接:
tailscale netcheck
你会看到类似以下输出:
Report:
* Time: 2025-03-09T14:04:05.719200078Z
* UDP: true
* IPv4: yes, 233.233.233.233:2333
* IPv6: no, but OS has support
* MappingVariesByDestIP:
* PortMapping: UPnP, NAT-PMP, PCP
* CaptivePortal: false
* Nearest DERP:
* DERP latency:
- SELFHOST: 9.3ms ()
# 国外主机构建
docker login registry.cn-hongkong.aliyuncs.com
docker tag tailscale-derp registry.cn-hongkong.aliyuncs.com/<namespace>/tailscale-derp:latest
docker push registry.cn-hongkong.aliyuncs.com/<namespace>/tailscale-derp:latest
# 国内主机拉取
docker pull registry.cn-hongkong.aliyuncs.com/<namespace>/tailscale-derp:latest
docker tag registry.cn-hongkong.aliyuncs.com/<namespace>/tailscale-derp:latest tailscale-derp:latest
docker rmi registry.cn-hongkong.aliyuncs.com/<namespace>/tailscale-derp:latest
- 浅探 Tailscale DERP 中转服务 - Kiprey's Blog
- DERP Servers - Tailscale Documentation