目 录CONTENT

文章目录

Headscale

moke
2024-10-18 / 0 评论 / 0 点赞 / 77 阅读 / 0 字

常用命令

常用命令

Docker

进入Docker容器

docker exec -it headscale /bin/sh

namespace 用户

查看所有用户

headscale namespace list

创建用户

headscale namespace create sap560
  • 创建sap560 为用户,可自行设置

删除用户

headscale namespace destroy sap560
  • 删除sap560用户

重命名

headscale namespace rename sap560  560e
  • 重命名sap560560e

node 节点

列出所有节点

headscale node list

列出所有的节点,同时显示出tag信息

headscale node ls -t

只看sap560用户下的所有节点

headscale -n sap560 node ls

删除节点

headscale node delete -i=1
  • 通过 headscale node list 查看所有的节点和ID
  • 删除ID为1的节点

route 路由

查看路由节点

headscale routes list

开启子网路由功能

headscale routes enable --route 1
  • 1 为子网的ID,通过 headscale routes list 命令查看

删除路由节点

headscale routes delete -r=1
  • 1 为子网的ID,通过 headscale routes list 命令查看

apikeys

创建用户的apikey

headscale apikeys create --expiration 9999d
  • 创建一个有效期9999天的KEY

列出创建的KEY

headscale apikeys list

Docker部署

Docker compose部署Headscale服务端

部署方式

  1. 在站点根目录下创建Headscale文件夹
  2. Headscale文件夹内创建docker-compose.yml文件和config文件夹
  3. Headscale\config目录下创建config.yaml文件
  4. 运行部署命令:
docker-compose up -d

部署文件配置

docker-compose.yml

version: '3.5'

services:
  headscale:
    image: headscale/headscale:0.22.3
    container_name: headscale
    networks:
      - headscale-network
    volumes:
      - ./config:/etc/headscale
      - ./data:/var/lib/headscale
    ports:
      - 5600:5600
    command: ["headscale", "serve"]
    restart: unless-stopped

networks:
  headscale-network:
    name: headscale-network
    external: true

注意:官方的最新版本使用docker部署,会无法启动,当前测试较为稳定的版本是0.22.3,所以镜像指定了版本为0.22.3


config.yaml

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

# 客户端将连接的URL。
# 通常这将是一个域名,比如:
#
# https://myheadscale.example.com:443

# 请将域名修改为你的域名
server_url: https://xxxx.sap560.com

# 服务器要监听/绑定的地址
#
# 用于生产:
# listen_addr: 0.0.0.0:8080
listen_addr: 0.0.0.0:5600

# 监听/metrics的地址,您可能希望
# 将此端点保持私有,仅对内部网络可见
#
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

# 用于加密headscale和Tailscale客户端之间流量的私钥。
# 如果丢失,私钥文件将自动生成。
#
private_key_path: /var/lib/headscale/private.key

# 噪音部分包括TS2021 Noise协议的特定配置
noise:
  # Noise私钥用于在使用新的基于Noise的协议时加密
  # headscale和Tailscale客户端之间的流量。它必须与旧的私钥不同。
  private_key_path: /var/lib/headscale/noise_private.key

# 用于分配tailaddresses的IP前缀列表。
# 每个前缀包括IPv4或IPv6地址,
# 以及关联的前缀长度,由斜杠分隔。
# 它必须在Tailscale客户端支持的IP范围内 - 即,100.64.0.0/10和fd7a:115c:a1e0::/48的子网。
# 请参阅下面的链接:
# IPv6: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#LL81C52-L81C71
# IPv4: https://github.com/tailscale/tailscale/blob/22ebb25e833264f58d7c3f534a8b166894a89536/net/tsaddr/tsaddr.go#L33
# 不支持任何其他范围,会导致意外问题。
ip_prefixes:
  - 100.100.100.0/10
  - fd7a:115c:a1e0::/48

# DERP是Tailscale在无法建立直接连接时使用的中继系统。
# https://tailscale.com/blog/how-tailscale-works/#encrypted-tcp-relays-derp
#
# headscale需要提供给客户端的DERP服务器列表。
derp:
  server:
    # 如果启用,将运行嵌入式DERP服务器,并将其合并到DERP配置的其余部分中
    # 上面定义的Headscale服务器URL必须使用https,DERP需要建立TLS连接
    enabled: false

    # 用于嵌入式DERP服务器的区域ID。
    # 如果区域ID与来自常规DERP配置的其他区域ID冲突,本地DERP优先。
    region_id: 999

    # 区域代码和名称在Tailscale UI中显示,以标识DERP区域
    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"

  # 以JSON编码的外部可用DERP映射列表
  urls:
    - https://controlplane.tailscale.com/derpmap/default

  # 以YAML编码的本地可用DERP映射文件
  #
  # 此选项对于托管自己的DERP服务器的人来说可能更有趣:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths: []

  # 如果启用,将设置工作程序以定期刷新给定的来源并更新derpmap
  # 将被设置。
  auto_update_enabled: true

  # 我们应该多久检查DERP更新?
  update_frequency: 24h

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

# 无活动的瞬时节点被删除之前的时间?
ephemeral_node_inactivity_timeout: 30m

# 在tailnet内检查节点更新的周期。过低的值会严重影响
# Headscale的CPU消耗。值过高(超过60秒)会导致问题
# 节点,因为它们不会获得足够频繁的更新或保持活动消息。
# 如果有疑问,不要更改默认值10s。
node_update_check_interval: 10s

# SQLite配置
db_type: sqlite3

# 用于生产:
db_path: /var/lib/headscale/db.sqlite

# # Postgres配置
# 如果要使用Unix套接字连接到Postgres,请在“host”字段中设置套接字路径,并将“port”留空。
# db_type: postgres
# db_host: localhost
# db_port: 5432
# db_name: headscale
# db_user: foo
# db_pass: bar

# 如果需要其他'sslmode'而不是'require(true)'和'disabled(false)',请在“db_ssl”字段中设置所需的'sslmode'。
# 参考https://www.postgresql.org/docs/current/libpq-ssl.html Table 34.1。
# db_ssl: false

### TLS配置
#
## 让我们加密/ ACME

# headscale支持自动请求和设置
# Let's Encrypt的域名TLS。
#
# ACME目录的URL
acme_url: https://acme-v02.api.letsencrypt.org/directory

# 注册ACME提供程序时使用的电子邮件
acme_email: ""

# 请求TLS证书的域名:
tls_letsencrypt_hostname: ""

# 存储证书和letsencrypt所需的元数据的路径
# 用于生产:
tls_letsencrypt_cache_dir: /var/lib/headscale/cache

# 要使用的ACME挑战类型,目前支持的类型:
# HTTP-01或TLS-ALPN-01
# 有关更多信息,请参见[docs/tls.md](docs/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
  level: info

# 包含ACL策略的文件路径。
# ACL可以定义为YAML或HUJSON。
# https://tailscale.com/kb/1018/acls/
acl_policy_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_config:
  # 是否首选使用Headscale提供的DNS还是使用本地DNS。
  override_local_dns: true

  # 要向客户端公开的DNS服务器列表。
  nameservers:
    - 114.114.114.114

  # NextDNS(请参阅https://tailscale.com/kb/1218/nextdns/)。
  # "abc123"是NextDNS ID的示例,将其替换为您自己的。
  #
  # 带有元数据共享:
  # nameservers:
  #   - https://dns.nextdns.io/abc123
  #
  # 没有元数据共享:
  # nameservers:
  #   - 2a07:a8c0::ab:c123
  #   - 2a07:a8c1::ab:c123

  # 拆分DNS(请参见https://tailscale.com/kb/1054/dns/),
  # 搜索域列表和要查询的每个域名的DNS。
  #
  # restricted_nameservers:
  #   foo.bar.com:
  #     - 1.1.1.1
  #   darp.headscale.net:
  #     - 1.1.1.1
  #     - 8.8.8.8

  # 要注入的搜索域。
  domains: []

  # 额外的DNS记录
  # 到目前为止,只支持A记录(在tailscale一侧)
  # 请参阅https://github.com/juanfont/headscale/blob/main/docs/dns-records.md#Limitations
  # extra_records:
  #   - name: "grafana.myvpn.example.com"
  #     type: "A"
  #     value: "100.64.0.3"
  #
  #   # 也可以将其放在一行中
  #   - { name: "prometheus.myvpn.example.com", type: "A", value: "100.64.0.3" }

  # 是否使用[MagicDNS](https://tailscale.com/kb/1081/magicdns/)。
  # 仅在至少定义了一个nameserver时才有效。
  magic_dns: false

  # 定义用于创建MagicDNS主机名的基本域。
  # `base_domain`必须是FQDN,没有尾随点。
  # 主机的FQDN将是
  # `hostname.user.base_domain`(例如,_myhost.myuser.example.com_)。
  base_domain: example.com

# CLI用于无需身份验证连接的Unix套接字
# 注意:对于生产,您将希望将其设置为类似于:
unix_socket: /var/lib/headscale/headscale.sock
unix_socket_permission: "0770"
#
# headscale支持实验性的OpenID连接支持,
# 它仍在测试中,可能存在一些错误,请
# 帮助我们测试它。
# 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`以从文件中读取密钥。
#   # 它解析环境变量,使其集成到systemd的
#   # `LoadCredential`简单明了:
#   client_secret_path: "${CREDENTIALS_DIRECTORY}/oidc_client_secret"
#   # client_secret和client_secret_path是互斥的。
#
#   # 从节点通过OpenID进行身份验证开始的时间
#   # 过期,需要重新身份验证。
#   # 将该值设置为"0"表示不过期。
#   expiry: 180d
#
#   # 使用从OpenID登录时接收的令牌中的到期时间,
#   # 这通常会导致需要频繁重新身份验证,应该
#   # 仅在知道自己在做什么时才启用。
#   # 注意:启用此选项将导致忽略`oidc.expiry`。
#   use_expiry_from_token: false
#
#   # 自定义OIDC流中使用的范围,默认为"openid","profile"和"email",并添加自定义查询
#   # 参数到授权端点请求。范围默认为"openid","profile"和"email"。
#
#   scope: ["openid", "profile", "email", "custom"]
#   extra_params:
#     domain_hint: example.com
#
#   # 列出允许的主域和/或用户。如果已经认证的用户的域不在此列表中,
#   # 将拒绝身份验证请求。
#
#   allowed_domains:
#     - example.com
#   # 注意:keycloak中的组有一个前导'/'
#   allowed_groups:
#     - /headscale
#   allowed_users:
#     - alice@example.com
#
#   # 如果`strip_email_domain`设置为`true`,将删除用户名电子邮件地址的域部分。
#   # 这将把`first-name.last-name@example.com`转换为用户`first-name.last-name`
#   # 如果`strip_email_domain`设置为`false`,域部分将不会被删除,从而产生以下结果
#   用户:`first-name.last-name.example.com`
#
#   strip_email_domain: true

# Logtail配置
# Logtail是Tailscale的日志和审计基础设施,它允许控制面板
# 指示tailscale节点将其活动日志发送到远程服务器。
logtail:
  # 为headscale的客户端启用logtail。
  # 由于headscale中当前没有支持在headscale中覆盖日志服务器,因此默认情况下已禁用。启用此选项将使您的客户端将日志发送到Tailscale Inc。
  enabled: false

# 启用此选项使设备更喜欢WireGuard流量的随机端口
# 而不是默认的静态端口41641。此选项旨在解决一些有缺陷的
# 防火墙设备的问题。有关更多信息,请参见https://tailscale.com/kb/1181/firewalls/。
randomize_client_port: true

配置修改:

  1. 配置中server_url: https://xxxx.sap560.com的域名改为部署的域名,可以不加端口号。
  2. 配置中listen_addr: 0.0.0.0:5600 为组网所需的UDP端口,需要改为你的UDP端口,同时注意要在云主机和宝塔面板开放对应的端口5600
  3. 配置中 urls: https://controlplane.tailscale.com/derpmap/default 为使用官方默认的DERP地址,如果自建DERP服务器,可注释本行链接或者改为你自建DERP服务器的地址

WEB-UI界面

提示:

Headscale服务端通过命令行进行管理,WEB-UI项目为Headscale提供了一个界面化的管理,这个是独立的项目,需要单独部署

docker compose配置

docker-compose.yaml的配置:

version: '3.5'

services:
  headscale-ui:
    image: ifargle/headscale-webui:latest
    restart: unless-stopped
    container_name: headscale-ui
    networks:
      - headscale-network
    environment:
      - TZ=Asia/Shanghai  # 设置时区为亚洲/上海
      - COLOR=red  # 设置界面颜色为红色
      - HS_SERVER=http://aaa.xxx.com:56010  # Headscale 服务的链接地址
      - DOMAIN_NAME=https://bbb.xxx.com  # 设置WEB-UI的登录域名
      - SCRIPT_NAME=/admin  # 设置脚本路径为/admin
      - KEY="wmFHE71QT+DkR4DTU4NBCmtIxxxxxxx"  # 设置密钥
      - AUTH_TYPE=Basic  # 设置认证类型为基本认证
      - LOG_LEVEL=info  # 设置日志级别为info
      - BASIC_AUTH_USER=xxxx  # 设置登录用户名
      - BASIC_AUTH_PASS=xxxxxx  # 设置登录密码
    volumes:
      - ./web-ui:/data  # 映射本地web-ui目录到容器的/data目录
      - ./config:/etc/headscale/:ro  # 映射本地config目录到容器的/etc/headscale/目录,并设置为只读
    ports:
      - 56000:5000  #设置WEU-UI的登录端口

networks:
  headscale-network:
    name: headscale-network
    external: true

说明

  • http://aaa.xxx.com:56010 需要设置为Headscale服务器的地址
  • https://bbb.xxx.com 为WEB-UI的域名
  • ./config 目录内需要有Headscaleconfig文件(直接复制Headscale项目的配置文件)

设置WEB-UI数据目录的权限为100

docker-compose.yaml目录下运行命令

chown -R 1000:1000 web-ui

部署成功

配置DERP中继

增加derp服务端配置

在Headscale项目的config目录下,新建derp.yaml文件存放derp服务的地址

derp.yaml配置如下:

# If you plan to somehow use headscale, please deploy your own DERP infra: https://tailscale.com/kb/1118/custom-derp-servers/
regions:
  900:
    regionid: 900
    regioncode: 560
    regionname: ali-a
    nodes:
      - name: 900a
        regionid: 900
        hostname: derp.aaa.com
        stunport: 3478
        stunonly: false
        derpport: 443
      
  901:
    regionid: 901
    regioncode: 560
    regionname: ali-b
    nodes:
      - name: 901a
        regionid: 901
        hostname: derp.bbb.com
        stunport: 3478
        stunonly: false
        derpport: 443

  902:
    regionid: 902
    regioncode: 560
    regionname: hk
    nodes:
      - name: 902a
        regionid: 902
        hostname: hk.ccc.com
        stunport: 3478
        stunonly: false
        derpport: 443

配置说明

这个配置文件同样用于定义DERP服务器中的三个区域及其节点。在regions部分,有三个区域的配置:

  1. Region 900 - 阿里云地区"a"
    • regionid: 900: 区域唯一标识ID。
    • regioncode: 560: 区域代码,指明所属地区。
    • regionname: ali-a: 区域名称,友好的地区标识。
    • 节点配置:
      • name: 900a: 节点唯一标识名。
      • regionid: 900: 节点所属区域ID。
      • hostname: derp.aaa.com: 节点主机名,用于访问节点。
      • stunport: 3478: STUN协议端口,用于穿越NAT。
      • stunonly: false: 不仅使用STUN,还使用DERP。
      • derpport: 443: DERP协议端口,用于DERP中继通信。
  2. Region 901 - 阿里云地区"b"
    • regionid: 901: 区域唯一标识ID。
    • regioncode: 560: 区域代码,指明所属地区。
    • regionname: ali-b: 区域名称,友好的地区标识。
    • 节点配置:
      • name: 901a: 节点唯一标识名。
      • regionid: 901: 节点所属区域ID。
      • hostname: derp.bbb.com: 节点主机名,用于访问节点。
      • stunport: 3478: STUN协议端口,用于穿越NAT。
      • stunonly: false: 不仅使用STUN,还使用DERP。
      • derpport: 443: DERP协议端口,用于DERP中继通信。
  3. Region 902 - 香港地区
    • regionid: 902: 区域唯一标识ID。
    • regioncode: 560: 区域代码,指明所属地区。
    • regionname: hk: 区域名称,友好的地区标识。
    • 节点配置:
      • name: 902a: 节点唯一标识名。
      • regionid: 902: 节点所属区域ID。
      • hostname: hk.ccc.com: 节点主机名,用于访问节点。
      • stunport: 3478: STUN协议端口,用于穿越NAT。
      • stunonly: false: 不仅使用STUN,还使用DERP。
      • derpport: 443: DERP协议端口,用于DERP中继通信。

这个配置文件同样定义了三个地区的DERP节点,每个节点都有特定的设置,包括主机名、端口以及用于穿越NAT的协议。这样的配置允许在不同地区建立DERP中继通信,确保网络的连接和可靠性。

Headscale配置文件修改

修改Headscale项目的config.yaml文件的内容

只使用自建DERP服务

derp部分的urls修改为

- /etc/headscale/derp.yaml
  • 此路径为Headscale映射的config目录

如图:

  • 图例里注释了官方的DERP服务器,只使用自己部署的derp服务器

使用自建和官方DERP服务

同时使用官方的DERP服务器和自建的DERP服务器

博主关闭了所有页面的评论