Docker部署
大约 8 分钟
Docker compose部署Headscale服务端
部署方式
- 在站点根目录下创建
Headscale
文件夹 - 在
Headscale
文件夹内创建docker-compose.yml
文件和config
文件夹 - 在
Headscale\config
目录下创建config.yaml
文件 - 运行部署命令:
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
配置修改:
配置中
server_url: https://xxxx.sap560.com
的域名改为部署的域名,可以不加端口号。配置中
listen_addr: 0.0.0.0:5600
为组网所需的UDP端口,需要改为你的UDP端口,同时注意要在云主机和宝塔面板开放对应的端口5600
配置中
urls: https://controlplane.tailscale.com/derpmap/default
为使用官方默认的DERP地址,如果自建DERP服务器,可注释本行链接或者改为你自建DERP服务器的地址