· ops · 5 min 阅读 (更新于 )
自定义 DERP 服务器(中继)
自定义 DERP 中继,以解决使用 tailscale 延时问题

在使用 Tailscale 时,我们可能会遇到在某些网络环境下无法进行点对点连接的情况。这时,流量会通过中继服务器传输。由于 Tailscale 官方没有在中国大陆部署中继服务器,这会导致较高的延迟和丢包。因此,我需要自己部署一台中继服务器来解决这一问题。可以参考官方文档了解详细部署步骤:Tailscale 官方文档。
1. 一台拥有公网 IP 的主机
我推荐使用 docker 部署服务,你也可以不这样做😃。主机防火墙需要放开 3478/UDP 和 80&443/TCP 端口,或者你也可以使用一个自定义端口(下面方案使用自定义端口完成)。
⚠️ 注意
下面方案假设你使用的域名为 qq.com,端口为 8443。实际部署时,请替换为自己的信息。
2. 创建容器镜像并运行容器
- 配置 Dockerfile 文件
# 构建阶段
FROM golang:latest AS builder
WORKDIR /app
ENV GOPROXY=https://goproxy.cn # 使用国内的代理
RUN go install tailscale.com/cmd/derper@latest
# 运行阶段
FROM ubuntu:24.04
WORKDIR /app
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && \
apt-get install -y --no-install-recommends ca-certificates && \
mkdir -p /app/certs
# 默认值
ENV DERP_DOMAIN qq.com
ENV DERP_ADDR :8443
ENV DERP_CERT_MODE manual
ENV DERP_CERT_DIR /app/certs
ENV DERP_STUN true
ENV DERP_HTTP_PORT -1
ENV DERP_VERIFY_CLIENTS false
COPY --from=builder /go/bin/derper .
# 具体的配置信息可以参考 https://github.com/tailscale/tailscale/blob/main/cmd/derper/derper.go
CMD /app/derper \
--hostname=$DERP_DOMAIN \
--certmode=$DERP_CERT_MODE \
--certdir=$DERP_CERT_DIR \
--a=$DERP_ADDR \
--stun=$DERP_STUN \
--http-port=$DERP_HTTP_PORT \
--verify-clients=$DERP_VERIFY_CLIENTS
- 配置 docker-compose.yml 文件
这里需要注意 /opt/cert
为宿主机证书存放地址,请以实际值替换。
⚠️ 注意:证书格式需要满足
**.crt
和**.key
,例如qq.com.crt
和qq.com.key
。
services:
derper:
build: .
container_name: derper
network_mode: "host"
environment:
# 你可以自行修改对应的环境变量的值
# - hostname=cc.com
volumes:
- /opt/cert:/app/certs
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
restart: always
-
启动容器
docker compose up -d
3. 在 Tailscale 控制面板修改 Access controls
配置
增加 derpMap
属性,并配置一下内容,如果保存失败,有可能是浏览器兼容问题,请使用谷歌等浏览器。
OmitDefaultRegions
只使用自定义中继
"derpMap": {
"OmitDefaultRegions": true,
"Regions": {
"901": {
"RegionID": 900,
"RegionCode": "qqDerp",
"Nodes": [
{
"Name": "qqDerp",
"RegionID": 900,
"DERPPort": 8443,
"HostName": "qq.com"
}
]
}
}
}
4. 验证 DERP 中继是否生效
- 浏览 https://qq.com:8443 ,你应该会看到一些提示包括
This is a Tailscale DERP server.
- 在终端使用命令
tailscale netcheck
查看 Report 信息,验证DERP latency
是否为你自定义的 - 将手机切换为移动数据模式,电脑终端使用
tailscale ping
查看,应该会包括这些信息pong from iphone-14-pro (100.*.*.*) via DERP(qqDerp) in 49ms
🎊🎊 到这里,你已经顺利完成了中继服务的配置,恭喜!现在,你可以自由使用它了。
😑😑但是有些特殊的地方我还是需要告诉你,中继默认并不会检验客户端的流量,这就意味着任何人都可以使用你的中继。但是这有一个前提,就是他需要知道你的域名+端口(显然他不知道🤣)。
如果你不想让其它人使用,你可以在你部署的主机上安装 tailscale 服务,然后登录你的账号。最后在启动容器的时候挂载宿主机的 tailscaled
,下面是更新后的 docker-compose.yml
services:
derper:
build: .
container_name: derper
network_mode: "host"
environment:
# 你可以自行修改对应的环境变量的值
- DERP_VERIFY_CLIENTS=true
volumes:
- /opt/cert:/app/certs
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
# 这是默认 linux 下的地址,请自己甄别
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
restart: always
1