输入搜索…

· ops · 5 min 阅读 (更新于

自定义 DERP 服务器(中继)

自定义 DERP 中继,以解决使用 tailscale 延时问题

自定义 DERP 服务器(中继)

@boliviainteligente

在使用 Tailscale 时,我们可能会遇到在某些网络环境下无法进行点对点连接的情况。这时,流量会通过中继服务器传输。由于 Tailscale 官方没有在中国大陆部署中继服务器,这会导致较高的延迟和丢包。因此,我需要自己部署一台中继服务器来解决这一问题。可以参考官方文档了解详细部署步骤:Tailscale 官方文档


1. 一台拥有公网 IP 的主机

我推荐使用 docker 部署服务,你也可以不这样做😃。主机防火墙需要放开 3478/UDP 和 80&443/TCP 端口,或者你也可以使用一个自定义端口(下面方案使用自定义端口完成)。

⚠️ 注意
下面方案假设你使用的域名为 qq.com,端口为 8443。实际部署时,请替换为自己的信息。


2. 创建容器镜像并运行容器

  1. 配置 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
  1. 配置 docker-compose.yml 文件

这里需要注意 /opt/cert 为宿主机证书存放地址,请以实际值替换。

⚠️ 注意:证书格式需要满足 **.crt**.key,例如 qq.com.crtqq.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
  1. 启动容器

    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 中继是否生效

  1. 浏览 https://qq.com:8443 ,你应该会看到一些提示包括 This is a Tailscale DERP server.
  2. 在终端使用命令 tailscale netcheck 查看 Report 信息,验证 DERP latency 是否为你自定义的
  3. 将手机切换为移动数据模式,电脑终端使用 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

返回文章列表