iaun
iaun
发布于 2025-05-25 / 1,120 阅读
17
0

Docker Headscale的部署和使用

前言

Headscale是一种异地组网的方法,它是Tailscale的开源版本,虽然Tailscale对个人是免费使用的,但还是觉得控制器自己部署使用放心点,Tailscale本身只是个控制器,如果不能打洞成功那就还需要搭配derper做流量中转。

已经在海外服务器部署过用了快1年,但是海外延迟很高,体验一般。

趁着国内服务器带宽变高了(虽然是共享的),决定把Headscale控制器和derper都迁移到国内服务器。

Headscale部署

下面将以文章编写时间的最新版本(v0.26.0)做教程,服务器为x86_64的CPU架构,运行在docker容器中

下载Headscale

拉取Headscale docker镜像

docker pull headscale/headscale:v0.26

下载配置文件

wget https://github.com/juanfont/headscale/raw/refs/tags/v0.26.0/config-example.yaml -O config/config.yaml

编辑配置文件

vim config/config.yaml
  1. 修改服务器URL:server_url

替换为你的域名或IP,如:

server_url: http://1.2.3.4:80

如果有反向代理转https:

server_url: https://headscale.example.com:443
  1. 修改监听端口:listen_addr

为了让nginx容器能够转发,我们监听0.0.0.0

listen_addr: 0.0.0.0:8080
  1. 修改ip网段:prefixes

保留v4修改为1个小段(个人用应该够了),v6如果用不到,可注释掉,有需要可开启

prefixes:
  v4: 100.64.0.0/23
# v6: fd7a:115c:a1e0::/48
  1. 关闭DNS功能:magic_dns

  magic_dns: false
  1. 开启客户端随机端口

randomize_client_port: true

启动前准备

生成空的db文件

touch lib/db.sqlite

启动服务器

部分参数请根据情况修改

docker run -dit \
  --name headscale \
  --restart always \
  --network local \
  -v "/root/docker/headscale/config:/etc/headscale" \
  -v "/root/docker/headscale/lib:/var/lib/headscale" \
  -v "/root/docker/headscale/run:/var/run/headscale" \
  headscale/headscale:v0.26 \
  serve

查看服务器情况

docker ps -a
docker logs headscale

如未正常启动,请再检查log,或检查设定是否正确

反向代理&DNS

如果有使用域名+HTTPS,需要加到前端反向代理,同时在DNS服务商添加一条记录

注意:必须要启用WebSocket

e.g. nginx

server {
    if ($host = headscale.example.com) {
        return 301 https://$host$request_uri;
    }

    server_name headscale.example.com;
    listen 80;
    return 404;
}


server {
    server_name hsheadscale.example.com;
    listen 443 ssl;
    ssl_certificate /fullchain.pem;
    ssl_certificate_key /privkey.pem;
    location / {
        proxy_pass http://headscale.local:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Headscale使用

创建用户

用户可以理解为隔离的租户环境

docker exec -it headscale headscale user create <username>

如成功创建会返回如下信息:

User created

查看用户创建情况

docker exec -it headscale headscale user list

自建 DERP 服务器 (derper)

derp服务器是在headscale无法直接打通双方通信的情况作中转用

前置准备

本文是以有HTTPS证书的情况下进行,且有nginx作反向代理

  1. 准备工作目录&证书目录

mkdir -p /root/docker/headscale/derper/certs
cd /root/docker/headscale/derper/certs
  1. 链接到HTTPS证书

作者是使用letsencrypt申请的泛域名证书,此处注意替换路径和你的域名

ln -s /etc/letsencrypt/live/***/fullchain.pem <derper domain>.crt
ln -s /etc/letsencrypt/live/***/privkey.pem <derper domain>.key

部署

镜像可以在 https://hub.docker.com/r/fredliang/derper 查找,本文撰写时的最新版本是v1.82.5,下文以此为例

  1. 拉取镜像

docker pull fredliang/derper:v1.82.5
  1. 启动derper服务器

注意替换<derper domain>

docker run -d \
--name derper \
--restart always \
--network local \
-e DERP_DOMAIN=<derper domain> \
-e DERP_CERT_MODE=manual \
-v /root/docker/headscale/derper/certs:/app/certs \
-v /etc/letsencrypt:/etc/letsencrypt \
-p 3478:3478/udp \
fredliang/derper:v1.82.5

添加反向代理

e.g. nginx 请根据实际情况修改

server {
    if ($host = <derper domain>) {
        return 301 https://$host$request_uri;
    }

    server_name <derper domain>;
    listen 80;
    return 404;
}


server {
    server_name <derper domain>;
    listen 443 ssl;
    ssl_certificate /fullchain.pem;
    ssl_certificate_key /privkey.pem;
    location / {
        proxy_pass https://derper.local;
        proxy_ssl_name $host;
        proxy_ssl_server_name on;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

将derper加入到Headscale中

  1. 新建derper配置文件

cd /root/docker/headscale
vim config/derp.yaml

输入以下内容:

regions:
  900:
    regionid: 900
    regioncode: <region code>
    regionname: <region name>
    nodes:
      - name: <name>
        regionid: 900
        hostname: <derper domain>
        stunport: 3478
        stunonly: false
        derpport: 443

其中 region code、region name都可以自定义,derper domain请填写derper服务器的域名,其他信息根据自己情况填写

  1. 将derp配置应用到derp

vim config/config.yaml

找到derp的配置项,将tailscale默认服务器注释:

  urls:
    - https://controlplane.tailscale.com/derpmap/default

  # urls:
  #   - https://controlplane.tailscale.com/derpmap/default

将derp文件路径加入到paths

  paths: []

  paths:
    - /etc/headscale/derp.yaml

Linux上安装Tailscale

安装

请根据系统进行安装:

https://tailscale.com/download/linux

官网一键安装指令:

curl -fsSL https://tailscale.com/install.sh | sh

设定

安装完成后,设定自启动

systemctl enable --now tailscaled

启动连接,下面替换为你的Headscale Server域名

tailscale up --login-server=https://<headscale domain> --accept-routes=true --accept-dns=false

之后会出现如下:

To authenticate, visit:

        https://<headscale domain>:443/register/*********

我们把这个链接粘贴到浏览器,一般会得到如下信息:

headscale
Machine registration
Run the command below in the headscale server to add this machine to your network:

headscale nodes register --user USERNAME --key *********

根据提示,我们在服务器上执行:

docker exec -it headscale headscale nodes register --user <user> --key *********

之后,我们应该可以看到待认证那边提示Success,代表加入成功


评论