跳至主要內容

Docker部署

五六零网校大约 8 分钟

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服务器的地址