前言

最近又被群友提起,要组个虚拟局域网,
欸恰好,我手头有个多的广州大宽带云服务器:)
于是兜兜转转又拾起了在古早博客里面写的Headscale(下文可能称HS)组网文章,然后再做点修缮

也是在看Headscale文档的时候发现了一个新的UI: Headplane, 有一种别样的原版的风格,很讨我喜欢)

TIPS: 不用管为什么右上角加载不出来头像, 这个得问微软/作者

任务前置

首先, 本文默认你有

  • 一定的Linux命令行操作知识

  • 一台服务器和域名(大陆内服务器需完成备案,需要有SSL证书) (又Tips: SSL证书这个HS客户端其实提供了acme来自动申请le证书,但是我懒得折腾,直接部署了我自己的SSL)

  • 会配置反向代理(比如Nginx,图省事的用面板)

  • 已经安装Docker和Docker Compose

什么? 这些都不会? 那就装1Panel去, 图形化操作也不会那就没救了

以下则为要做的炒鸡简单的架构示意

配置OIDC服务

这一步我会很快带过,因为每一个OIDC服务商的配置不一样,我这里只展示Azure Entra ID的

首先到portal.azure.com , 登录你的租户(没有的自己注册去)

在Entra ID中选择应用注册,然后创建一个新应用

(一个重定向URI是不够的)

创建完成之后再增加一个

并创建一个应用机密(客户端密码),时间你自己选,然后复制保留备用(只能查看一次)

下一步拉配置文件

由于本文中使用了两个组件,分别为Headscale本体还有Headplane,且他们配置文件都是config.yaml ,所以配置前请先仔细看有没有弄错文件(

Headscale配置文件

本文将使用v0.26.0作为教学,那么根据官方文档,首先要把示例配置文件拉下来

配置文件地址为: https://github.com/juanfont/headscale/blob/v0.26.0/config-example.yaml

如果你连GitHub打不开那也烷基八氮咯

接下来要进行逐个修改

将server_url修改为https://yourdomain.com:443
listen_addr为0.0.0.0:8080
prefix处你喜欢改就改
derp项将其开启(如果你有其他小鸡在作为derp也可以不开启)
region_code和region_name这个自己喜欢改就改,改了之后会是这样显示的

urls项默认为官方derp服务, 如果你怕奇奇怪怪的绕路,那么可以删掉变成这样

urls: []

往下滑,policy项的mode设置为database,否则面板不能修改ACL

接下来是重头戏,oidc配置

在配置文件327行处可以看到有被注释掉的oidc配置,嫌找的慢的可以直接复制下面代码

oidc:
  issuer: "https://login.microsoftonline.com/<你的租户ID>/v2.0"
  client_id: "<客户端ID>"
  client_secret: "<客户端密钥>"

  scope: ["openid", "profile", "email"]
  extra_params:
    # 让登录时提示选择用户
    prompt: select_account

把该填的填完然后扔回配置文件里即可

Headplane配置文件

该作者也是学习到了hs的精髓,依旧手拉配置文件

下载 https://github.com/tale/headplane/blob/main/config.example.yaml

然后进行修改

cookie_secret改为一个32字符的任何文本

url: 改成 https://yourdomain.com

docker: enabled: 改为true

往下滑来到OIDC一栏,同上面hs的配置文件一样填写即可,记得把下面redirect_url改成https://yourdomain.com/admin/oidc/callback

这样hp的配置文件也搞定了:)

配置反代

默认你们会配置反代了

相当于把/反代到8080(即hs的端口),把/admin反代到3000(即hp的端口)

我是直接用的1p面板生成的openresty配置文件),实在懒得写了,大伙图个乐呵

务必配置SSL

部署容器

在上面步骤完成之后这一步已经相当简单了

找一个地方创建文件夹,然后写个docker compose文件

#改自Headplane文档
services:
  headplane:
    image: ghcr.io/tale/headplane:0.6.0
    container_name: headplane
    restart: unless-stopped
    ports:
      - '3000:3000'
    volumes:
      - './headplane-config/:/etc/headplane/'
      # 这里出现的headscale是因为hp会修改hs的配置文件来实现在面板中修改配置
      - './headscale-config/:/etc/headscale/'
      - './headplane-data:/var/lib/headplane'
      - '/var/run/docker.sock:/var/run/docker.sock:ro'
  headscale:
    image: headscale/headscale:0.26.0
    container_name: headscale
    restart: unless-stopped
    command: serve
    labels:
      # 这一个同hp配置的docker那里一样
      me.tale.headplane.target: headscale
    ports:
      - '8080:8080'
      # udp是给STUN用的
      - '3478:3478/udp'
    volumes:
      - './headscale-data:/var/lib/headscale'
      - './headscale-config:/etc/headscale'

然后依次将你的两个配置文件分别放到headscale-config文件夹和headplane-config文件夹(没有你就不会创建吗)中

然后docker compose up,那么一切就将正常运行

如果你发现容器在卡重启,那我建议仔细看看日志输出

再配置一下Headplane配置文件

还记得配置文件里跳过的一些东西吗?

现在你的容器已经创建好了,执行以下命令:

docker exec headscale headscale apikeys create --expiration 999d

如果跑不起来那就自己修

得到的APIKey将他填入headscale_api_key:一栏中

开始使用

在一切大(问)功(题)告(频)成(出)之后,现在你理应可以打开https://yourdomain.com/admin页面了

我建议你现在就用SSO登录, 因为第一个使用SSO进行登录的会获得后台面板权限,后面在想进admin面板的就只能添加permitted user了

至于后面的操作,那就是你该探索的东西了:)