常用命令
常用命令
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
- 重命名
sap560
为560e
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服务端
部署方式
- 在站点根目录下创建
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服务器的地址
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
目录内需要有Headscale
的config
文件(直接复制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
部分,有三个区域的配置:
- 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中继通信。
- 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中继通信。
- 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服务器