自建tailscale derp服务器
背景
使用wireguard组网中转流量多且慢,希望借助tailscale促成P2P连接提高效率。
官方derp服务器在境外,延迟高网速慢,需要自建derp提高稳定性。
思路
公网服务统一使用反代处理TLS证书问题,因此derp仅需提供http服务。
要求至少需要开放两个端口:
- 一个TCP端口(DERP,Designated Encrypted Relay for P2P,中继)
- 一个UDP端口(STUN,Session Traversal Utilities for NAT,打洞)
额外要求:
仅限认证客户端使用中继服务(通过开启-verify-clients实现)
访问tcp端口默认显示This is a DERP server过于显眼,去除。
代码
开启认证需访问本地/var/run/tailscale/tailscaled.sock
此时要求derper与本地tailscaled的版本保持一致。
# 记录版本,如果弃用verify-clients此步可忽略
tailscaled --version
# 如上步忽略版本用latest即可
go install tailscale.com/cmd/derper@v1.98.3
# 修改源码去处欢迎界面
vi ~/go/pkg/mod/tailscale.com@v1.98.3/cmd/derper/derper.go
# 编译修改后的源码
go build -o /tmp/derper .
修改方法:找到默认路由"/"的Handler并返回404
mux.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// tsweb.AddBrowserHeaders(w)
// handleHome.ServeHTTP(w, r)
if r.URL.Path == "/" {
w.WriteHeader(http.StatusNotFound)
return
}
http.NotFound(w, r)
}))
构建镜像所需的Dockerfile
FROM ubuntu
WORKDIR /app
ENV DERP_DOMAIN your-hostname.com
ENV DERP_CERT_MODE letsencrypt
ENV DERP_CERT_DIR /app/certs
ENV DERP_ADDR :443
ENV DERP_STUN true
ENV DERP_STUN_PORT 3478
ENV DERP_HTTP_PORT 80
ENV DERP_VERIFY_CLIENTS false
ENV DERP_VERIFY_CLIENT_URL ""
COPY derper .
CMD /app/derper --hostname=$DERP_DOMAIN \
--certmode=$DERP_CERT_MODE \
--certdir=$DERP_CERT_DIR \
--a=$DERP_ADDR \
--stun=$DERP_STUN \
--stun-port=$DERP_STUN_PORT \
--http-port=$DERP_HTTP_PORT \
--verify-clients=$DERP_VERIFY_CLIENTS \
--verify-client-url=$DERP_VERIFY_CLIENT_URL
执行docker-compose.yml端口号支持灵活配置,tcp不限制443。
version: '3.8'
services:
derper:
image: derper-nohomepage:1.98.3
container_name: derper
restart: always
environment:
- DERP_DOMAIN=derp.your.domain # 填写你的域名
- DERP_ADDR=:8888 # DERP 服务监听端口
- DERP_HTTP_PORT=8888 # 与上面保持一致
- DERP_STUN=true
- DERP_STUN_PORT=9999
- DERP_VERIFY_CLIENTS=true # 如果不需要验证客户端身份,设为 false
ports:
- "8888:8888" # TCP 端口
- "9999:9999/udp" # UDP 端口
volumes:
- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
配置
最后需要在tailscale控制台修改ACL启用自建derp服务器,推荐放在ssh前面
"derpMap": {
"OmitDefaultRegions": false, // 是否屏蔽官方节点,若设为 true 则仅使用自建节点
"Regions": {
"901": { // 自建编号从901开始
"RegionID": 901,
"RegionCode": "nuc",
"RegionName": "Location", // 显示在netcheck中的名称
"Nodes": [
{
"Name": "NUC",
"RegionID": 901,
"HostName": "derp.your.domain",
"DERPPort": 8888, // TCP
"STUNPort": 9999, // UDP
"STUNOnly": false,
},
],
},
},
},
参考
tailscale/cmd/derper at main · tailscale/tailscale
derper-docker/Dockerfile at main · kaaanata/derper-docker
DERP servers · Tailscale Docs

浙公网安备 33010602011771号