使用Docker + Traefik + Derper 自建 Tailscale 中继服务器完整教程

本教程将介绍如何使用 Docker、Traefik 和 Tailscale 自建中继服务器,以提高 Tailscale 网络的性能和安全性。

使用Docker + Traefik + Derper 自建 Tailscale 中继服务器完整教程
Photo by NASA / Unsplash

准备工作

  • 一台云服务器,推荐配置:2核4G,50G硬盘, 需公网IP
  • 一个域名,并已备案
  • 给 derper 分配一个域名,如 derper.example.com,并将DNS解析到云服务器
  • 防火墙开放2个的端口备用,如 16443、3478。
  • 云服务器已安装 Docker 运行环境,安装教程:https://docs.docker.com/engine/install/

国内 阿里云、腾讯云等轻量服务器基本能满足要求。

配置服务器

安装 Traefik

写入 Traefik 配置到 /etc/traefik/traefik.toml文件,

# 创建 Traefik 配置文件

cat <<EOF > /etc/traefik/traefik.toml
[global]
  defaultEntryPoints = ["https"]

[entryPoints]
  [https]
    address = ":443"
    compress = true
    tls = true
    [tls.certificates]
      default = letsencrypt.acme

[acme]
  email = "your_email@example.com" # 改成你自己的邮箱
  domains = ["derper.example.com"] # 改成你自己的域名
  [acme.httpChallenge]
    entryPoint = "https"

启动 Traefik

# 创建网络
docker create network traefik
# 启动 Traefik
docker run -d --name traefik \
  --restart always \
  --network traefik \
  -v /etc/traefik/traefik.toml:/etc/traefik/traefik.toml \
  -p 80:80 \
  -p 443:443 \
  traefik/traefik

安装 Derper

version: '3'

services:
  derp:
    image: fredliang/derper:latest
    container_name: derp
    restart: always
    ports:
      - "0.0.0.0:3478:3478/udp"
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
    environment:
      - DERP_DOMAIN=derper.example.com
      - DERP_ADDR=:16443
      - DERP_HTTP_PORT=-1
      - DERP_VERIFY_CLIENTS=true # 很重要,避免被别人滥用
    networks:
      - traefik
      - default
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.routers.derper.rule=Host(`derper.example.com`)"
      - "traefik.http.services.derper.loadbalancer.server.port=16443"
networks:
  default:
    internal: true
    name: derp
  traefik:
    external: true
  • 启动 Derper:
vi docker-compose.yml # 把上面的配置根据自己的实际情况修改后保存
docker-compose up -d

配置 Tailscale

{
   // 追加到原配置文件中
    "derpMap": {
		// OmitDefaultRegions 用来忽略官方的中继节点,一般自建后就看不上官方小水管了
		"OmitDefaultRegions": true,
		"Regions": {
			"901": {
				"RegionID":   901, // 901 三个地方保持一致,900开始,多个节点可以往后+1
				"RegionCode": "sh",
				"RegionName": "ShangHai",
				"Nodes": [
					{
						"Name":     "example",
						"RegionID": 901,
						"HostName": "derper.example.com", // 换成你的子域名
						"IPv4":     "1.1.1.1", // 改成你的公网IP
						"DERPPort": 443,
						"STUNPort": 3478,
						"CanPort80": false,
					},
				],
			},
     }
}
  • 保存配置

验证成果

服务器

浏览器打开 https://derper.example.com ,会看到

derper 服务运行中

Mac 平台

打开 Terminal(终端),执行:/Applications/Tailscale.app/Contents/MacOS/Tailscale netcheck
会看到如下结果:
Tailscale netcheck 结果
我建了3个节点,国内的节点延迟就非常低。

	* DERP latency:
		- shh2: 46ms    (ShangHai)
		- shh: 46.2ms  (ShangHai)
		-  us: 601.1ms (American)

Linux 平台

执行 sudo tailscale netcheck 会得到类似的结果。

常见问题

  1. 为什么没有 IPv6? A: 需要云服务器支持
  2. 为什么用 traefik? A: traefik 自动生成 tls 证书,方便做流量代理

参考链接