Loading

自建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

posted @ 2026-05-29 16:41  azureology  阅读(34)  评论(0)    收藏  举报