headscale+derp+tailscale自建部署教程

【2026.10】headscale_v0.29.5+derp+tailscale自建部署教程

一.前言

这套方案大概稳定使用3年时间,10月份由于之前部署headscale服务器到期想更换,所以产生了重新部署最新版的念头,这份文档是几年前写在飞书里面,这次更新之后发到L站供佬友们参考。先叠个甲本文大部分都是自己重新编辑排版,不属于AI生成转发到论坛,且部署教程还是以文字发布较为友好,故只使用少量图片请各位佬手下留情。

然后说下自己对内网搭建的体验和经验,其实论坛的佬友对于tailscale/WireGuard/netbird/easytier/Zerotier等等内网穿透的方案都有不同的理解,我觉得原因在于每个人用的网络运营商,包括每台设备的运营商,还有服务器的服务商和所在区域等等属性都完全不一样,众说纷纭有的好用有的不好用都是正常的。所以并没有一个固定答案哪个方案最好,自己实际部署使用下来没问题就行,至于丝滑还是卡的一批,那纯粹是选方案时的直觉或者说运气问题了。当然也有可能是本人网络相关经验和认知不足(是的就是很菜),所以本次文档中有什么纰漏和错误,还请各位佬友指出多多交流。

网络及设备

本人的设备几乎所有系统都包含了,几台linux\win\mac\ios\android\nas组件的内网,然后网络的话也是电信移动联通都有,headscale是搭建在一台龟上面(自带derp),一个derp节点是放在腾子的国内服务器上。

域名及证书

公网ip是必要的(虽然easytier是去中心化的但好像还是有个公网服务器比较好?这个没有搭建过所以先容我提个问题),然后最好是用域名来指向headscale服务(因为如果用是公网ip,迁移headscale服务器的时候,tailscale客户端全都得用新的地址来重新连接,如果用域名的话后续迁移就省下客户端重连这一步)。关于域名备案的问题,我是国内注册的域名都备案了,国外注册的都托管在小黄云上,所以本次教程没遇到拦截问题。

证书的话其实用Caddy来反代+申续签是比较好的,headscale的官方也有推荐这个方式,但是多年前并没有这个选项,以及因为我的证书全都是在1panel上管理,所以本次教程中也以自己手动上传证书为主。

二.Headscale服务端部署

这次部署有个很大的区别,是官方安装包自带derp服务好使了(不是用hs官方derp节点来中转意思,这个很慢不稳定),几年前的版本好像还有很多不完善才没用,好像是不能验证客户端还是什么问题忘了,所以最后又用docker部署2个derp节点,现在是一个hs服务自带一个derp节点,再另外部署一个derp节点就搞定了。

1.适用环境

  • 设备:公网服务器 Ubuntu 24.04;
  • 版本:Headscale 0.29.5 官方 DEB;
  • 域名:hs.openai.com(hah记得用自己的域名);
  • 端口:服务器安全列表及实例防火墙(ufw)开放 TCP 443、UDP 3478

2.Headscale部署

2.1 官方教程

官方的教程地址:

https://headscale.net/stable/setup/install/official/

安装deb脚本

sudo apt update
sudo apt install -y curl ca-certificates
VERSION=0.29.5
ARCH=$(dpkg --print-architecture)
curl -fL -o headscale.deb "https://github.com/juanfont/headscale/releases/download/v${VERSION}/headscale_${VERSION}_linux_${ARCH}.deb"
sudo apt install -y ./headscale.deb
headscale version
sudo systemctl status headscale --no-pager

APT 若显示“Download is performed unsandboxed as root”,但同时有 Setting up headscale 和 systemd 服务链接,则 DEB 已安装成功;这条 N: 只是本地 DEB 所在目录不允许 apt 用户读取的提示,不应再叠加安装独立二进制。

上传并部署证书

1Panel 产出的 fullchain.pem、privkey.pem 如果上传到 /home/ubuntu/headscale/certs/。官方 DEB 的 systemd 单元设置 ProtectHome=true,因此服务不能直接读取 /home/ubuntu 下的文件;该目录只作为上传源,需复制到 /etc/headscale/tls/。证书必须覆盖 hs.openai.com,fullchain 必须包含完整证书链。

sudo install -d -o root -g headscale -m 0750 /etc/headscale/tls
sudo install -o root -g headscale -m 0640 /home/ubuntu/headscale/certs/fullchain.pem /etc/headscale/tls/fullchain.pem
sudo install -o root -g headscale -m 0640 /home/ubuntu/headscale/certs/privkey.pem /etc/headscale/tls/privkey.pem
sudo -u headscale test -r /etc/headscale/tls/fullchain.pem
sudo -u headscale test -r /etc/headscale/tls/privkey.pem

修改配置并启动

编辑 /etc/headscale/config.yaml 中已存在的字段,不要在末尾重复追加第二个 derp: 或 dns: 段。以下只展示目标字段,其他版本对应的默认项保持不变;SQLite、Noise 私钥、prefixes 等沿用包内默认配置。

sudo cp /etc/headscale/config.yaml /etc/headscale/config.yaml.bak
sudo vim /etc/headscale/config.yaml

在现有文件中找到并修改对应字段,不要在文件末尾追加第二份同名 YAML 字段:

  • server_url: https://hs.openai.com 一定得是https,对应443端口
  • listen_addr: 0.0.0.0:443
  • tls_cert_path: “”、tls_key_path: “”:这里填上一步上传的证书的位置,如果你是用 caddy 就留空,https 由 Caddy 处理。
  • dns.magic_dns: false、dns.override_local_dns: false:沿用之前不接管客户端 DNS 的习惯。
  • derp.server.enabled: true、derp.server.verify_clients: true、derp.server.ipv4: 188.8.8.88。注释掉示例中的 derp.server.ipv6,除非你确有公网 IPv6。
  • 可以暂时保留 derp.urls 中官方默认 DERP 地址作为迁移期间的备用中继。内置 DERP 测试通过后,如希望仅使用自建中继,再改为 urls: 。
  • 保留包内默认的 SQLite 路径、Noise 私钥路径和 prefixes。公网没有 IPv6,也不要求删除 Tailscale 的内网 IPv6 前缀。

示例:

# /etc/headscale/config.yaml
server_url: https://hs.openai.com
listen_addr: 0.0.0.0:443
tls_letsencrypt_hostname: ""
tls_cert_path: /etc/headscale/tls/fullchain.pem
tls_key_path: /etc/headscale/tls/privkey.pem

derp:
  server:
    enabled: true
    region_id: 999
    region_code: "headscale"
    region_name: "Headscale Embedded DERP"
    verify_clients: true
    stun_listen_addr: "0.0.0.0:3478"
    automatically_add_embedded_derp_region: true
    ipv4: 188.8.8.88
    # 没有真实公网 IPv6 时,注释示例 ipv6: 2001:db8::1
  urls: []
  paths: []

保存后测试配置通过后重启服务:

sudo -u headscale headscale configtest
sudo systemctl restart headscale
sudo systemctl status headscale --no-pager
sudo journalctl -u headscale -n 80 --no-pager -l

2.2 使用独立二进制文件部署(可忽略)

之前用的是二进制文件部署,那个时候好像因为用deb安装包之后,会有很多用户权限的问题,导致很多bug才没用。但这次问了AI之后不再推荐独立部署,所以直接用的2.1安装deb包,如有这方面需求的佬友,可以找找其他的帖子,我记得是有的。

2.3 创建headscale用户

这里生成的authkey,可以方便tailscale客户端直接同一行命令连接上来。而不用一个个客户端发起请求,然后到hs端批准,这样就太麻烦了。

# 名字自己取
sudo headscale user create yourname
# 生成一个过期时间 24h 且可以重复使用的 authkey ,<用户ID> 创建了一个 yourname 就填 1 ,是的就是填索引值
sudo headscale preauthkeys create --user <用户ID> --reusable --expiration 24h # 365d
# 查看下创建的authkey
sudo headscale preauthkeys --user yourname list

三.Tailscale客户端

1.安装

只推荐官方给的客户端安装教程:

https://tailscale.com/download/linux/ubuntu-2204

里面可以选择各个不同平台的安装方式,非常简单,不在此赘述。

2.连接使用

2.1 windows

安装完成后打开cmd后者powershell,软件安装后自动配置了环境变量。

tailscale up --login-server https://hs.openai.com --hostname <自己取名> --accept-routes=true --accept-dns=false --authkey <2.3生成的 authkey>
# 例如: tailscale up --login-server https://hs.openai.com --hostname windows-1 --accept-routes=true --accept-dns=false --authkey dsadsdsadsadasdasdsadsad

遇到解决不了的问题,直接卸载重装再运行一遍(老版本就是有很多bug,新版本感觉bug少了很多,可以忽略),卸载时重装前需要删除以下两个文件夹:

C:\ProgramData\Tailscale
# user换成你的电脑账户名
C:\Users\user\AppData\Local\Tailscale

2.2 linux/macos

官方给的命令都是要 root 权限的,所以要加 sudo

sudo tailscale up --login-server https://hs.openai.com --hostname <自己取名> --accept-routes=true --accept-dns=false --authkey <2.3生成的 authkey>

同样遇到奇葩问题,比如连接不上,就卸载重装吧,省时间,下面给出一个快速删除重新安装的脚本:

Ubuntu 清理:

sudo apt purge tailscale -y
sudo rm -rf /etc/default/tailscaled /etc/systemd/system/tailscaled.service.d

apt-cache policy tailscale
sudo apt-get install -y tailscale

Centos 清理:

#!/bin/bash

# Stop the Tailscale service
sudo systemctl stop tailscaled

# Remove Tailscale package
sudo yum remove -y tailscale

# Clean up Tailscale directories and files
sudo rm -rf /var/lib/tailscale
sudo rm -rf /etc/systemd/system/tailscaled.service.d
sudo rm -rf /etc/default/tailscaled
sudo rm -rf /usr/lib/systemd/system/tailscaled.service
sudo rm -rf /var/run/tailscale
sudo rm -rf /var/log/tailscale*

# Reload systemd
sudo systemctl daemon-reload

# Install yum-utils if not already installed
sudo yum install -y yum-utils

# Add Tailscale repository
sudo yum-config-manager --add-repo https://pkgs.tailscale.com/stable/centos/7/tailscale.repo

# Install Tailscale
sudo yum install -y tailscale

# Enable and start Tailscale service
sudo systemctl enable --now tailscaled

echo "Tailscale installation and setup complete."

# 创建一个bahs.sh复制粘贴以上内容进去
# chmod +x bash.sh
# ./bash.sh 即可

2.3 IOS

在 appstore 下载 tailscale 程序,估计需要美区账号,直接在 app 里设置headscale server url,设置步骤:

  1. 打开app正常安装vpn,但先别打开。

  2. 然后点击右上角小人图标

  3. 再点击右上角圆圈三个点

  4. 把https://hs.openai.com的url填进去,注意要先关闭vpn才能跳转。

  5. 复制它给出的连接,到headscale服务端去运行一下即可,其中USERNAME要替换成刚刚 2.3 中 headscale 生成的账户名称 ‘yourname’。

3.阿里云服务器(旧)

这里单独开一个小节是因为有个大bug,阿里云和apt的内网dns都是在100网段,和 tailscale 的默认网段冲突了,会导致阿里云一旦开启 tailscale 后就无法正常解析域名,也无法更新gpt,所以在 tailscale 客户端启动前的时候要加个参数:

# 全局设置netfilter模式为nodivert,将创建和管理Tailscale子链,但将这些链的调用留给管理员。
# 全局设置Tailscale客户端接受Tailscale admin设置的dns
sudo tailscale set --netfilter-mode=nodivert --accept-dns=true

这是几年前遇到的bug,不知道现在有没有这个问题,先保留在这里。

四.Derp中继服务部署

因为普通部署的derp服务,暴露在公网被扫一下端口很容易发现,且headscale配置derp节点的时候只需要域名和ip,并没有验证所以很容易被白嫖。一定记得在部署derp的时候添加DERP_VERIFY_CLIENTS参数来限制,而这个前提是要先搭建tailscale客户端并登录,也就是说前面所有的步骤都得先行完成(当然部署完了再来改也是可以的)。

1.使用域名部署

这种方案需要满足以下几个条件:

  • 要有自己的域名,并且申请了 SSL 证书(使用1panel生成的证书,且有自动续签的功能,较为方便)

  • 需要准备一台云主机(阿里云实测不行,最好是腾讯云)

  • 如果服务器在国内,域名需要备案。

如果以上条件都具备,就可以按照下面的步骤开始部署了。

1.1 docker部署

26年7月份实测通过的部署命令,之前使用的yangchuansheng的derp镜像已经失效了。

sudo docker run -d \
  --restart always \
  --name derper \
  --network host \
  -v /home/ubuntu/softs/certs/:/app/certs \
  -v /run/tailscale:/var/run/tailscale \
  -e TZ=Asia/Shanghai \
  -e DERP_CERT_MODE=manual \
  -e DERP_CERT_DIR=/app/certs \
  -e DERP_ADDR=:12345 \
  -e DERP_DOMAIN=derp.openai.com \
  -e DERP_HTTP_PORT=-1 \
  -e DERP_STUN_PORT=3478 \
  -e DERP_VERIFY_CLIENTS=true \
  fredliang/derper:latest

注意点:

  • 服务器的端口记得放开,ipv4的 tcp 12345和3478端口,以及ipv4的 udp 3478端口。

  • ssl证书有要求,/home/ubuntu/softs/certs文件夹下包含两个文件,crt和key文件。假设你的域名是 derp.openai.com,那么证书的名称必须是 derp.openai.com.crt,一个字符都不能错!同理,私钥名称必须是 derp.openai.com.key,一个字符都不能错!

  • 域名记得换成你的 derp.openai.com。

  • -e DERP_VERIFY_CLIENTS=true一定要先安装登录tailscale客户端,然后和-v /var/run/tailscale:/var/run/tailscale配套一起启动。

1.2 官方部署

这里我没有尝试,因为要开的端口更多

https://tailscale.com/docs/reference/derp-servers/custom-derp-servers

2.Headscale配置Derp

部署好 derper 之后,就可以修改 Headscale 的配置来使用自定义的 DERP 服务器了。Headscale 可以通过两种形式的配置来使用自定义 DERP:

  • 一种是在线 URL,格式是 JSON,与 Tailscale 官方控制服务器使用的格式和语法相同。

  • 另一种是本地文件,格式是 YAML。

# sudo vim /etc/headscale/derp.yaml
regions:
  901:
    regionid: 901
    regioncode: BJ
    regionname: beijing 
    nodes:
      - name: 901a
        regionid: 901
        hostname: <就是上面的域名>  # derp.openai.com 必须与远端证书匹配
        ipv4: <公网ip> # 如果域名有正确的公网 A 记录,不用写 ipv4;若要写,必须填远端服务器的真实 IPv4,不能填域名
        stunport: 3478
        stunonly: false
        derpport: 12345

配置说明:

  • regions 是 YAML 中的对象,下面的每一个对象表示一个可用区,每个可用区里面可设置多个 DERP 节点,即 nodes。

  • 每个可用区的 regionid 不能重复。

  • 每个 node 的 name 不能重复。

  • regionname 一般用来描述可用区,regioncode 一般设置成可用区的缩写。

  • ipv4 字段不是必须的,如果你的域名可以通过公网解析到你的 DERP 服务器地址,这里可以不填。 如果你使用了一个二级域名,而这个域名你并没有在公共 DNS server 中添加相关的解析记录,那么这里就需要指定 IP(前提是你的证书包含了这个二级域名,这个很好支持,搞个泛域名证书就行了)。

  • stunonly: false 表示除了使用 STUN 服务,还可以使用 DERP 服务。

保存后让 Headscale 用户可读:

sudo chown root:headscale /etc/headscale/derp.yaml
sudo chmod 640 /etc/headscale/derp.yaml

接下来还需要修改 Headscale 的配置文件,编辑 /etc/headscale/config.yaml,引用上面的自定义 DERP 配置文件(把现有的 paths: 改为 /etc/headscale/derp.yaml)。

需要修改的配置项如下(只粘贴了需要修改的地方!!!):

# sudo vim /etc/headscale/config.yaml
derp:
  server:
    enabled: true
    # 这里保留你现有的区域 999 等配置
  urls: []
    # - https://controlplane.tailscale.com/derpmap/defaul
  paths:
    - /etc/headscale/derp.yaml
  # paths: []

上面只是需要改动的结构示意,不要复制后生成第二个 derp: 段。urls: 可以继续保持,表示不加入 Tailscale 官方的中继地图。修改完这两份配置后 需要重启headscale服务

sudo -u headscale headscale configtest
sudo systemctl restart headscale
sudo systemctl status headscale --no-pager

检测最简单的办法是直接打开 DERP 服务器的 URL:https://xxxx:12345,如果看到如下页面,且地址栏的 SSL 证书标签显示正常可用,那才是真没问题了。

3.从客户端验证两个区域

到任意一台刚刚部署了tailscale客户端上运行:

tailscale debug derp-map

地图应同时出现 999/headscale/443 和 901/BJ/12345。

4.证书过期

由于我的derp的证书是手动复制到服务器上的,所以1panel的自动续签无法直接更改(只对1panel上的应用生效),所以需要手动复制新的证书内容到服务器上(每三个月一次):

先去1panel找到域名证书,然后去derp服务器上改证书

cd /home/ubuntu/softs/certs
# 复制粘贴证书内容
sudo systemctl restart tailscaled
sudo docker restart derp容器id 

hs的证书也同理上传修改,然后重启hs服务

sudo vim /etc/headscale/tls/fullchain.pem
sudo vim /etc/headscale/tls/privkey.pem

sudo -u headscale test -r /etc/headscale/tls/fullchain.pem
sudo -u headscale test -r /etc/headscale/tls/privkey.pem

sudo systemctl restart headscale

五.常用命令

1.tailscale 客户端命令

# 检查网络和状态
tailscale netcheck
tailscale status

# macos
/Applications/Tailscale.app/Contents/MacOS/Tailscale status

2.headscale 服务端命令

基本上都要加 sudo

# 查所有的
sudo headscale nodes list
# 删除某个id的node
sudo headscale nodes delete --identifier 1
# 修改某个node的name,但不是hostname
sudo headscale nodes rename NEWNAME --identifier 1
# 查看认证key
sudo headscale preauthkeys --user yourname list

手动修改客户端的ipv4的内网地址,目前没有官方命令,只能改数据库hah:

# 估计都得先安装sqlite3
sudo apt update
sudo apt install sqlite3

# 然后再修改

sudo -u headscale sqlite3 /var/lib/headscale/db.sqlite \
  "BEGIN IMMEDIATE;
   UPDATE nodes SET ipv4='100.64.0.100'
   WHERE id=88
     AND NOT EXISTS (
       SELECT 1 FROM nodes WHERE ipv4='100.64.0.100' AND id<>88
     );
   SELECT changes();
   COMMIT;"


sudo systemctl restart headscale

这里面 ipv4 就是你想改的ip地址(记得100.64.0不能变,最后一位不要超过255),id就是‘sudo headscale nodes list’显示的客户端的索引

六.记录一些问题解决

1.如果遇到错误,要多看看tailscale和derp的日志,自己看不懂发给AI,能发现核心问题并解决,处理起来也简单。

2.有时候会遇到relay server unavailable这个问题,不是客户端版本的问题,而是加了客户端验证之后,derp节点的tailscale客户端要先重启一遍,才能把derp的verify client更新(sudo systemctl restart tailscaled)。

3.本文签证手动上传频率大概3个月一次,其实可以让AI写一个自动化脚本来解决的,毕竟全部搭建成功之后大家都在一个内网里,所以一个定时任务就可以搞定。

3 个赞

国内呢,活不长。国外呢,绕一圈。内网环境直连概率低。

确实有可能活不长,不过我很少大流量上传下载,可能这样才能稳定用几年。

我想知道想在外面公网串流家里的 PC,这个带宽要求是不是就比较高了?我看了下没啥合适的服务器

打洞成功应该就看你外面公网的下行和家里的上行带宽,理论上丝滑的。如果打洞失败就是看中转服务器的带宽了。

之前不懂的时候,GPT推荐我用 EasyTier ,然后我就用这个组网了,但还是不太稳定。佬了解过这个软件吗?

我靠还真没有,文档里我也还在提问哈哈哈。但你说的不稳定是指什么,经常连不上还是说经常打洞失败还是太慢。

总是掉线,就用着用着突然离线