DERP 是一个 Tailscale 自行开发的中继服务。当所处网络环境难以穿透(如校园网、移动大内网、4G、5G 等)时,所有流量都会经由 DERP 中转至目标地址。

在默认情况下,Tailscale 官方已经提供了环大陆的官方 DERP 服务,但是由于中国大陆的网络连通性等问题,官方并未提供大陆的 DERP 节点。

为了确保大陆的打通成功率,我们需要在大陆自建一个 DERP 服务,方便我们实现对等链接

部署

使用现有的项目
tailscale‘s selfhosted derp-server docker image
https://github.com/fredliang44/derper-docker

services:
  derper:
    image: fredliang/derper
    restart: always
    ports:
      - 3478:3478/udp
      - 23333:443
    environment:
      - DERP_DOMAIN=derp.example.com

Caddy 中配置转发

derp.example.com { 
    reverse_proxy localhost:23333 
}

Caddy 自 2.5 版本以后支持了 tailscale 插件,因此证书申请方便多了.

derp.domain.com {
    tls {
        get_certificate tailscale
    }
    reverse_proxy http://127.0.0.1:5050
}

使用

# /etc/headscale/derp.yaml
regions:
  900:
    regionid: 900
    regioncode: thk 
    regionname: Tencent Hongkong 
    nodes:
      - name: 900a
        regionid: 900
        hostname: xxxx
        ipv4: xxxx
        ipv6: xxxx
        stunport: 3478
        stunonly: false
        derpport: 443
      - name: 900b
        regionid: 900
        hostname: xxxx
        ipv4: xxxx
        ipv6: xxxx
        stunport: 3478
        stunonly: false
        derpport: 443
  901:
    regionid: 901
    regioncode: hs 
    regionname: Huawei Shanghai 
    nodes:
      - name: 901a
        regionid: 901
        hostname: xxxx
        ipv4: xxxx
        ipv6: xxxx
        stunport: 3478
        stunonly: false
        derpport: 443
  • regions 是 YAML 中的 对象, 下面的每一个对象表示一个 可用区,每个可用区里面可设置多个 DERP 节点,即 nodes.
  • 每个可用区的 regionid 不能重复.
  • 每个 node 的 name 不能重复.
  • regionname 服务器所在地区 regioncode 地区缩写
  • ipv4 ipv6 服务器 ip ,正确配置 dns 后可以留空.
  • stunonly 服务器是否只支持 stun
  • stunport stun port
  • derpport derp port 这里是 443

    • 必须是访问能显示一个网页: DERP This is a Tailscale DERP server.

在 headscale 配置中

# /etc/headscale/config.yaml
derp:
  # List of externally available DERP maps encoded in JSON
  urls:
  #  - https://controlplane.tailscale.com/derpmap/default

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths:
    - /etc/headscale/derp.yaml

  # If enabled, a worker will be set up to periodically
  # refresh the given sources and update the derpmap
  # will be set up.
  auto_update_enabled: true

  # How often should we check for DERP updates?
  update_frequency: 24h

安全性

默认是全部人都能用,只有域名方式才能鉴权.

  • 有 Tailscale 且已加入网络.
  • 启动时 –verify-clients -> DERP_VERIFY_CLIENTS: "true"
  • 这样 derp 只会让你自己网络的客户端通过.

需要将 /var/run/tailscale/tailscaled.sock 映射到 docker,让容器内能检测到 tailscaled.

验证

在客户端查看 tailscale netcheck

tailscale netcheck  

tailscale status 显示各个客户端状态

tailscale status

tailscale ping 测试到客户端延迟,通常是 先 derp 再走打洞的直连

资料

Why run your own DERP server?
https://tailscale.com/kb/1118/custom-derp-servers

浅探 Tailscale DERP 中转服务
https://kiprey.github.io/2023/11/tailscale-derp/

Tailscale 组网 - 自建 DERP
https://jasper1024.com/jasper/20221211110202/

Tailscale 的 DERP Map
https://controlplane.tailscale.com/derpmap/default

Tailscale 基础教程:部署私有 DERP 中继服务器
https://icloudnative.io/posts/custom-derp-servers

标签: Headscale, P2PNET

添加新评论