Hary / untitled
995 字
5 分钟
Headscale + Tailscale + DERP
部署 Headscale
配置
- 创建存放配置的文件夹
Terminal window mkdir -p /etc/headscale && mkdir -p /var/lib/headscale - 下载配置模板
Terminal window wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml - 修改配置
Terminal window vim /etc/headscale/config.yaml- 将 127.0.0.1替换为 0.0.0.0(用于端口转发访问 headscale docker 服务)
- 关闭 DNS
dns:magic_dns: false
- 开启随机端口
randomize_client_port: true
- 填写 server_url
server_url: https://<domain>:<port>
部署
- 创建 docker-compose.yaml
Terminal window vim docker-compose.yamlversion: "3"services:headscale:image: headscale/headscale:stablerestart: alwaysvolumes:# 配置文件目录- /etc/headscale:/etc/headscale# 数据库目录- /var/lib/headscale:/var/lib/headscalecommand: serveports:- 8080:8080- 9090:9090 - 运行
Terminal window docker-compose up -d - 创建用户
Terminal window headscale user create <user>Terminal window headscale user list
反向代理
- nginx 配置
map $http_upgrade $connection_upgrade {default upgrade;'' close;}server {listen 443 ssl;ssl_certificate /etc/ssl/<domain>/cert.pem;ssl_certificate_key /etc/ssl/<domain>/key.pem;server_name <server_name>;charset utf-8;location / {proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection $connection_upgrade;proxy_set_header Host $server_name;proxy_redirect http:// https://;proxy_buffering off;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;proxy_pass http://localhost:8080;}// 若不部署下面的 Web UI 管理面板可忽略以下配置location /admin {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://localhost:8000/admin;proxy_read_timeout 90s;}}
Headscale Web UI控制面板(可选)
- 部署面板
Terminal window docker run -itd -p 8000:80 goodieshq/headscale-admin:latest - 在 headscale 机器中生成 apikey
Terminal window headscale apikey create - 配置面板

节点安装 Tailscale
-
添加 TailScale 的 package signing key 和 repository
Terminal window curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/nullTerminal window curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list -
安装 Tailscale
Terminal window sudo apt-get update && sudo apt-get install tailscale -
注册
-
节点申请注册
Terminal window tailscale up --login-server=<server_url> --accept-routes=true --accept-dns=falseTo authenticate, visit:
-
在浏览器中打开上述链接,会出现以下页面:

-
复制页面中的链接并将 USERNAME 改为上述创建用户时的用户名
<user>,接着在 headscale 机器中运行 -
查看注册节点
Terminal window headscale nodes list
-
部署 DERP(中继服务器)
部署
-
创建 docker-compose 文件
Terminal window vim docker-compose.yamlversion: '3'services:derper:image: ghcr.io/yangchuansheng/derper:latestcontainer_name: derperrestart: alwaysports:- "12345:12345"- "3478:3478/udp"volumes:# 关于证书部分需要重点说明:假设你的域名是 xxx.com,那么证书的名称必须是 xxx.com.crt,一个字符都不能错!同理,私钥名称必须是 xxx.com.key,一个字符都不能错!- /etc/ssl/<domain>/cert.pem:/app/certs/<domain>.crt- /etc/ssl/<domain>/key.pem:/app/certs/<domain>.key# 不做客户端校验可注释此行,建议开启客户端校验,否则别人拿到你的中继服务器可直接使用- /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sockenvironment:- DERP_CERT_MODE=manual- DERP_ADDR=:12345- DERP_DOMAIN=<domain># 不做客户端校验可注释此行,建议开启客户端校验,否则别人拿到你的中继服务器可直接使用- DERP_VERIFY_CLIENTS=true -
运行
Terminal window docker-compose up -d目前 derper 运行一段时间就会崩溃,暂时还没有更好的解决方案,只能通过定时重启来解决,比如通过 crontab 来设置每两小时重启一次容器:
0 */2 * * * docker restart derper &> /dev/null -
修改 Headscale 配置
- 创建 Derp 服务器相关的配置
Terminal window vim /etc/headscale/derp.yamlregions:900:regionid: 900regioncode: hkregionname: Hongkongnodes:- name: clawregionid: 900hostname: <derp_domain>stunport: <stunport>stunonly: falsederpport: <derpport>配置说明:
regions是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即nodes。- 每个可用区的
regionid不能重复。 - 每个
node的name不能重复。 regionname一般用来描述可用区,regioncode一般设置成可用区的缩写。ipv4字段不是必须的,如果你的域名可以通过公网解析到你的 DERP 服务器地址,这里可以不填。如果你使用了一个二级域名,而这个域名你并没有在公共 DNS server 中添加相关的解析记录,那么这里就需要指定 IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了)。stunonly:false表示除了使用 STUN 服务,还可以使用 DERP 服务。
- 修改 Headscale 配置
Terminal window vim /etc/headscale/config.yamlderp:# 可把官方节点/配置注释掉paths:- /etc/headscale/derp.yaml - 重启
Terminal window docker-compose up -d
- 创建 Derp 服务器相关的配置
-
检查
3478/udp端口Terminal window tailscale netcheck -
检查 Derp 服务器
12345端口,浏览器打开https://<derp_domain>:12345
-
查看与通信对端的连接方式:
Terminal window tailscale status
参考文章
Headscale + Tailscale + DERP
https://blog.beocean.net/posts/headscale/