Headscale-DERP中继
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
服务器是否只支持 stunstunport
stun portderpport
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