Files
mengyanote/mengyanote-frontend/public/mengyanote/.trash/搭建derp和headscale避坑与指南.md
2025-12-13 20:48:21 +08:00

10 KiB
Raw Blame History

derpDocker安装

#Docker容器一键化启动
#默认开启tcp端口33445 udp端口3478
docker run --restart always \
  --name derper1 \
  -p 33445:33445 \
  -p 3478:3478/udp \
  -v /shumengya/ssl/derp1/:/app/certs \
  -e DERP_CERT_MODE=manual \
  -e DERP_ADDR=:33445 \
  -e DERP_DOMAIN=derp1.shumengya.top \
  -e DERP_CERT_FILE=/app/certs/derp1.shumengya.top.crt \
  -e DERP_KEY_FILE=/app/certs/derp1.shumengya.top.key \
  -d ghcr.io/yangchuansheng/derper:latest
  
  docker run --restart always \
  --name derper2 \
  -p 33445:33445 \
  -p 3478:3478/udp \
  -v /shumengya/ssl/derp2/:/app/certs \
  -e DERP_CERT_MODE=manual \
  -e DERP_ADDR=:33445 \
  -e DERP_DOMAIN=derp2.shumengya.top \
  -e DERP_CERT_FILE=/app/certs/derp2.shumengya.top.crt \
  -e DERP_KEY_FILE=/app/certs/derp2.shumengya.top.key \
  -d ghcr.io/yangchuansheng/derper:latest
  
docker run --restart always \
  --name derper3 \
  -p 33445:33445 \
  -p 3478:3478/udp \
  -v /shumengya/ssl/derp3/:/app/certs \
  -e DERP_CERT_MODE=manual \
  -e DERP_ADDR=:33445 \
  -e DERP_DOMAIN=derp3.shumengya.top \
  -e DERP_CERT_FILE=/app/certs/derp3.shumengya.top.crt \
  -e DERP_KEY_FILE=/app/certs/derp3.shumengya.top.key \
  -d ghcr.io/yangchuansheng/derper:latest

#默认使用Let's Encrypt签发ssl证书
#默认需要关闭nginx占用80端口来签发证书
curl -s https://get.acme.sh | sh

source ~/.bashrc

acme.sh --issue --standalone -d 你的域名
#安装依赖
apt update && apt install -y socat
yum install -y socat
dnf install -y socat

acme.sh --register-account -m 你的邮箱地址

headscale直接部署systemctl运行:

headscale默认放行9090~9092 和50443

配置一个域名: headscale.shumengya.top 下载headscalehttps://github.com/juanfont/headscale 下载headscale-uihttps://github.com/juanfont/headscale

新建文件夹(用来放相关文件) mkdir -p shumengya/headscale

安装headscale dpkg -i headscale_0.26.1_linux_amd64.deb

修改headscale配置

---
# headscale 会按照以下顺序查找名为 `config.yaml` (或 `config.json`) 的配置文件:
#
# - `/etc/headscale`
# - `~/.headscale`
# - 当前工作目录

# 客户端将要连接的 URL。
# 通常应为一个域名,例如:
#
# https://myheadscale.example.com:443
#
server_url: http://127.0.0.1:9091

# 服务器监听/绑定的地址
#
# 生产环境建议:
listen_addr: 0.0.0.0:9092
#listen_addr: 127.0.0.1:8080

# /metrics 和 /debug 的监听地址,你可能希望
# 将此端点限制在内网
metrics_listen_addr: 127.0.0.1:9090

# gRPC 的监听地址。
# gRPC 用于通过 CLI 远程控制 headscale 服务器
# 注意:只有在使用有效证书时,远程访问才可用。
#
# 生产环境建议:
grpc_listen_addr: 0.0.0.0:50443
#grpc_listen_addr: 127.0.0.1:50443

# 是否允许 gRPC 管理接口以 **不安全** 模式运行。
# 不推荐启用,因为流量将不加密。只有在你完全理解风险时才启用。
grpc_allow_insecure: false

# Noise 部分包含 TS2021 Noise 协议的特定配置
noise:
  # Noise 私钥用于在 headscale 和 Tailscale 客户端之间
  # 使用新的基于 Noise 的协议加密流量。缺少的密钥将会自动生成。
  private_key_path: /var/lib/headscale/noise_private.key

# 为 tailnet 分配地址的 IP 前缀列表。
# 每个前缀由 IPv4 或 IPv6 地址 + 前缀长度组成,以斜杠分隔。
# 必须在 Tailscale 客户端支持的范围内
# 即 100.64.0.0/10 和 fd7a:115c:a1e0::/48 的子网。
# 否则会导致异常问题。
prefixes:
  v4: 100.64.0.0/10
  #v6: fd7a:115c:a1e0::/48

  # 节点 IP 分配策略,可选:
  # - sequential默认按顺序分配下一个可用 IP
  # - random使用伪随机生成器分配可用 IP
  allocation: sequential

# DERP 是 Tailscale 在无法建立直连时使用的中继系统。
# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
#
# headscale 需要一个 DERP 服务器列表供客户端使用。
derp:
  server:
    # 启用后,将运行内置 DERP 服务器并合并到 DERP 配置中
    # 上面的 server_url 必须使用 httpsDERP 需要 TLS
    enabled: false

    # 内置 DERP 服务器的区域 ID。
    # 如果与外部配置的区域 ID 冲突,则本地 DERP 优先。
    region_id: 999

    # 区域代码和名称会在 Tailscale UI 中显示
    region_code: "headscale"
    region_name: "Headscale Embedded DERP"

    # 在指定地址上监听 UDP 端口以支持 STUN 连接(帮助 NAT 穿透)。
    # 如果启用内置 DERP必须定义 stun_listen_addr。
    #
    # 更多详情可参考https://tailscale.com/blog/how-tailscale-works/
    stun_listen_addr: "0.0.0.0:3478"

    # 用于加密 headscale DERP 与 Tailscale 客户端之间流量的私钥。
    # 缺少时会自动生成。
    private_key_path: /var/lib/headscale/derp_server_private.key

    # 此标志用于控制是否自动将内置 DERP 写入 DERP map。
    # 若设为 false则需通过 DERP.paths 手动配置。
    automatically_add_embedded_derp_region: true

    # 为了更稳定的连接(特别是 Exit-Node + DNS 不可用时),
    # 可以选择性地将公网 IPv4/IPv6 地址写入 Derp-Map
    ipv4: 1.2.3.4
    ipv6: 2001:db8::1

  # 外部可用的 DERP map 列表JSON 格式)
  urls:
   # - https://controlplane.tailscale.com/derpmap/default
    #- https://你的域名/web/derp.json

  # 本地可用的 DERP map 文件YAML 格式)
  #
  # 对于自建 DERP 服务器很有用:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths: []

  # 若启用,将定期刷新上述 DERP 源并更新 derpmap
  auto_update_enabled: true

  # 检查 DERP 更新的间隔
  update_frequency: 24h

# 禁用启动时自动检查 headscale 更新
disable_check_updates: false

# 非活跃临时节点在多久后被删除?
ephemeral_node_inactivity_timeout: 30m

database:
  # 数据库类型可选sqlite, postgres
  # 注意:强烈不推荐使用 Postgres仅为遗留原因保留。
  # 所有新开发和优化都基于 SQLite。
  type: sqlite

  # 启用调试模式。需要 log.level 设置为 "debug" 或 "trace"。
  debug: false

  # GORM 配置
  gorm:
    # 启用预编译语句。
    prepare_stmt: true

    # 启用参数化查询。
    parameterized_queries: true

    # 跳过 “record not found” 错误日志。
    skip_err_record_not_found: true

    # 慢查询阈值(毫秒)
    slow_threshold: 1000

  # SQLite 配置
  sqlite:
    path: /var/lib/headscale/db.sqlite

    # 启用 WAL 模式。推荐生产环境启用。
    # https://www.sqlite.org/wal.html
    write_ahead_log: true

    # WAL 文件在达到多少帧时自动 checkpoint。
    # 设为 0 可禁用自动 checkpoint。
    wal_autocheckpoint: 1000

  # # Postgres 配置(不推荐,仅遗留支持)
  # postgres:
  #   # 使用 Unix socket 时,设置 host 为 socket 路径port 留空。
  #   host: localhost
  #   port: 5432
  #   name: headscale
  #   user: foo
  #   pass: bar
  #   max_open_conns: 10
  #   max_idle_conns: 10
  #   conn_max_idle_time_secs: 3600
  #
  #   # SSL 配置,参考官方文档
  #   ssl: false

### TLS 配置
#
## Let's Encrypt / ACME
#
# headscale 支持使用 Let's Encrypt 自动申请 TLS 证书
#
# ACME 目录 URL
acme_url: https://acme-v02.api.letsencrypt.org/directory

# ACME 注册邮箱
acme_email: ""

# 要申请 TLS 证书的域名
tls_letsencrypt_hostname: ""

# 存储证书和元数据的路径
# 生产环境建议:
tls_letsencrypt_cache_dir: /var/lib/headscale/cache

# ACME 挑战类型,目前支持:
# HTTP-01 或 TLS-ALPN-01
# 详见 docs/ref/tls.md
tls_letsencrypt_challenge_type: HTTP-01
# 使用 HTTP-01 时letsencrypt 必须监听:
# :http = 80 端口
tls_letsencrypt_listen: ":http"

## 使用已有证书
tls_cert_path: ""
tls_key_path: ""

log:
  # 日志输出格式text 或 json
  format: text
  # 日志级别info, debug, trace
  level: info

## 策略
# headscale 支持 Tailscale 的 ACL 策略
# 文档https://tailscale.com/kb/1018/acls/
policy:
  # 模式file 或 database
  mode: file
  # 若为 file 模式,指定 HuJSON 文件路径
  path: ""

## DNS
#
# headscale 支持 Tailscale 的 DNS 配置和 MagicDNS。
# 文档:
# https://tailscale.com/kb/1054/dns/
# https://tailscale.com/kb/1081/magicdns/
# https://tailscale.com/blog/2021-09-private-dns-with-magicdns/
#
# 注意:要使 DNS 配置生效,客户端必须启用 `--accept-dns=true`。
# 否则将不生效。
dns:
  # 是否启用 MagicDNS
  magic_dns: true

  # MagicDNS 的基础域名,必须与 server_url 域名不同。
  base_domain: example.com

  # 是否覆盖本地 DNS 设置
  override_local_dns: false

  # 全局 DNS 服务器列表
  nameservers:
    global:
      - 1.1.1.1
      - 1.0.0.1
      - 2606:4700:4700::1111
      - 2606:4700:4700::1001
      # NextDNS 示例
      # - https://dns.nextdns.io/abc123

    # Split DNS 示例(为特定域使用不同 DNS
    split: {}

  # 自定义搜索域
  search_domains: []

  # 额外 DNS 记录(支持 A/AAAA
  extra_records: []
  #   - name: "grafana.myvpn.example.com"
  #     type: "A"
  #     value: "100.64.0.3"

# CLI 使用的 Unix socket无认证
# 生产环境建议自定义
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"

# OpenID Connect 配置(实验功能)
# oidc:
#   only_start_if_oidc_is_available: true
#   issuer: "https://your-oidc.issuer.com/path"
#   client_id: "your-oidc-client-id"
#   client_secret: "your-oidc-client-secret"
#   client_secret_path: "${CREDENTIALS_DIRECTORY}/oidc_client_secret"
#   expiry: 180d
#   use_expiry_from_token: false
#   scope: ["openid", "profile", "email", "custom"]
#   extra_params:
#     domain_hint: example.com
#   allowed_domains:
#     - example.com
#   allowed_groups:
#     - /headscale
#   allowed_users:
#     - alice@example.com
#   pkce:
#     enabled: false
#     method: S256

# Logtail 配置
# Logtail 是 Tailscale 的日志与审计系统
logtail:
  # 启用后,客户端将日志发送到 Tailscale 服务器
  enabled: false

# 启用后,设备将优先使用随机端口进行 WireGuard 流量
# 以避免某些防火墙兼容性问题。
# 详见https://tailscale.com/kb/1181/firewalls/
randomize_client_port: false


设置反向代理: 公网域名->127.0.0.1:9092

location /web {
  index index.html;
  alias /shumengya/headscale/web;
}