Headscale 的部署方法和使用教程(20230401版)

本文最后更新于 378 天前, 如有失效请评论区留言.

目的打通所有环境(VM和k8s以及移动端), 组建大局域网

WireGuard是什么

WireGuard是一个易于配置、快速且安全的开源VPN技术, 主要优点配置和部署 WireGuard 就像配置和使用SSH一样容易。

主要用途取代OpenVPN等传统组网工具。

Tailscale是什么

Tailscale 是一款基于 WireGuard 的虚拟组网工具, 简化了WireGuard部署流程,开箱即用。
Tailscale 是一款商业产品,但个人用户是可以白嫖的, 基本可以满足使用需求。

Headscale是什么

实现了 Tailscale 控制服务器的所有主要功能, 自主可控

Headscale 部署

部署比较简单, 这里简单记录一下

下载二进制

wget https://github.com/juanfont/headscale/releases/download/v0.20.0/headscale_0.20.0_linux_amd64
chmod +x headscale_0.20.0_linux_amd64
mv headscale_0.20.0_linux_amd64 /usr/local/bin/headscale

准备相关目录或者文件

# 创建配置目录
mkdir -p /etc/headscale
# 创建目录用来存储数据与证书
mkdir -p /var/lib/headscale
# 创建空的 SQLite 数据库文件
touch /var/lib/headscale/db.sqlite
# 下载 Headscale 配置文件
wget https://github.com/juanfont/headscale/raw/main/config-example.yaml -O /etc/headscale/config.yaml
# 创建用户
useradd headscale -d /home/headscale -m
chown -R headscale:headscale /var/lib/headscale

编辑配置

---
server_url: https://global.vip.ysicing.net:443
listen_addr: 0.0.0.0:443
metrics_listen_addr: 127.0.0.1:9090
grpc_listen_addr: 0.0.0.0:50443
grpc_allow_insecure: false
private_key_path: /var/lib/headscale/private.key
noise:
  private_key_path: /var/lib/headscale/noise_private.key
ip_prefixes:
  - 10.77.0.0/24
derp:
  server:
    enabled: true
    region_id: 999
    region_code: "headscale"
    region_name: "Headscale Embedded DERP"
    stun_listen_addr: "0.0.0.0:3478"
  urls:
    - https://controlplane.tailscale.com/derpmap/default
  paths:
    - /etc/headscale/derp.yaml
  auto_update_enabled: true
  update_frequency: 1h
disable_check_updates: false
ephemeral_node_inactivity_timeout: 30m
node_update_check_interval: 10s
db_type: sqlite3
db_path: /var/lib/headscale/db.sqlite
acme_url: https://acme-v02.api.letsencrypt.org/directory
acme_email: "[email protected]"
tls_letsencrypt_hostname: "global.vip.ysicing.net"
tls_client_auth_mode: relaxed
tls_letsencrypt_cache_dir: /var/lib/headscale/cache
tls_letsencrypt_challenge_type: TLS-ALPN-01
tls_letsencrypt_listen: ":http"
tls_cert_path: ""
tls_key_path: ""
log:
  level: info
  format: text
acl_policy_path: ""
dns_config:
  nameservers:
    - 1.1.1.1
  domains: []
  magic_dns: false
  base_domain: example.com
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"
logtail:
  enabled: false
randomize_client_port: false

如上只需要将global.vip.ysicing.net替换成自己的域名即可, 另外如果默认的ipv4段10.77.0.0/24冲突, 可自行替换其他可用ip端

derp配置

regions:
  900: # 自定义derper从900-999
    regionid: 900
    regioncode: sh
    regionname: china
    nodes:
      - name: 900a
        regionid: 900
        hostname: derper.sh.ysicing.net
        stunport: 0 # 0表示默认
        stunonly: false
        derpport: 7777

启动HeadScale

# cat /etc/systemd/system/headscale.service
[Unit]
Description=headscale controller
After=syslog.target
After=network.target

[Service]
Type=simple
User=headscale
Group=headscale
ExecStart=/usr/local/bin/headscale serve
Restart=always
RestartSec=5

# Optional security enhancements
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/lib/headscale /var/run/headscale
AmbientCapabilities=CAP_NET_BIND_SERVICE
RuntimeDirectory=headscale

[Install]
WantedBy=multi-user.target

开启启动

systemctl enable --now headscale
systemctl status headscale

查看端口情况

ss -tulnp|grep headscale
tcp   LISTEN 0      32768      127.0.0.1:9090       0.0.0.0:*    users:(("headscale",pid=4426,fd=15))
tcp   LISTEN 0      32768              *:50443            *:*    users:(("headscale",pid=4426,fd=10))
tcp   LISTEN 0      32768              *:80               *:*    users:(("headscale",pid=4426,fd=13))
tcp   LISTEN 0      32768              *:443              *:*    users:(("headscale",pid=4426,fd=14))

稍等片刻访问设置的域名显示https即可

命名空间管理

Tailscale 中有一个概念叫 tailnet,你可以理解成租户,租户与租户之间是相互隔离的,具体看参考 Tailscale 的官方文档: What is a tailnet。Headscale 也有类似的实现叫 namespace,即命名空间。我们需要先创建一个 namespace,以便后续客户端接入

# 创建命名空间
headscale namespaces create default
# 查看命名空间
headscale namespaces list
ID | Name    | Created
1  | default | 2022-09-02 13:00:37

多端接入

Linux接入

Debian 11安装:

# 使用我提供的镜像站加速哈哈哈
curl -fsSL https://pkgs.tailscale.com/stable/debian/bullseye.noarmor.gpg | tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/tailscale-archive-keyring.gpg] https://mirrors.ysicing.net/tailscale/stable/debian bullseye main" | tee /etc/apt/sources.list.d/tailscale.list
# 安装
apt update
apt install tailscale

默认脚本安装:

# 安装
curl -fsSL https://tailscale.com/install.sh | sh
# 默认不开启dns, 不然会很影响体验, 更多参数参考 tailscale up --help
tailscale up --login-server=https://<自定义域名> --accept-routes=true --accept-dns=false

执行完上面的命令后,会出现下面的信息

To authenticate, visit:

https://xxxxxx:443/register/de703e5f2e326cfa4b95c866ce13397433b81fcc22de6cf4e39770095facf921

在浏览器中打开该链接, 将页面的命令复制粘贴到 headscale 所在机器的终端中,并将 NAMESPACE 替换为前面所创建的 namespace, 类似如下:

headscale -u default nodes register --key de703e5f2e326cfa4b95c866ce13397433b81fcc22de6cf4e39770095facf921

如果节点比较多:

#!/bin/bash
headscale -u default nodes register --key $1
headscale node list

macOS安装

可以参考macOS配置

群晖DS218+安装

下载客户端并安装tailscale-x86_64-dsm7

ssh登录群晖

sudo tailscale down
sudo tailscale up --login-server=https://自定义域名 --accept-dns=false
# 后续同

另外需要额外设置如下, 不过在任务计划里设置开机任务, 具体设置参考官方文档synology

sudo /var/packages/Tailscale/target/bin/tailscale configure-host
sudo synosystemctl restart pkgctl-Tailscale.service

其他细节也可以参考 群晖上基于Headscale内网穿透

局域网(含容器网络)打通

# 添加route
tailscale up --login-server=https://<自定义域名> --accept-routes=true --accept-dns=false --advertise-routes=10.80.0.0/16,10.90.0.0/16
# 开启路由
headscale routes enable -r 21
# 路由列表
headscale routes list
Route        | Enabled
10.80.0.0/16 | true
10.90.0.0/16 | true

测试

# 查看路由
ip route show table 52 | grep 10.80.0.0/16
10.80.0.0/16 dev tailscale0
# 测试访问k3s coredns

iOS支持

在1.38.x版本后支持自定义控制端地址,可以设置为headscale地址.

注意

在阿里云部署可能会导致服务访问阿里云服务,需要手动执行如下,删除默认tailscale路由

iptables -D ts-input -s 100.64.0.0/10 ! -i tailscale0 -j DROP
iptables -D ts-forward -s 100.64.0.0/10 -o tailscale0 -j DROP

附录阅读

基于 Caddy2 部署私有 DERP 中继服务器(20230401版)
Headscale 部署私有 DERP 中继服务器

Comments