Headscale安装

下载二进制文件

https://github.com/juanfont/headscale/releases/

将下载好的二进制文件移动到/usr/ local/bin/目录下并改名名 headscale,然后进行部署准备:

# 附加可运行属性
chmod +x /usr/local/bin/headscale
# 创建配置目录
mkdir -p /etc/headscale
# 创建证书和数据目录
mkdir -p /var/lib/headscale
# 创建空数据库
touch /var/lib/headscale/db.sqlite

开启服务器端口

8080
9090

配置文件设置

下载配置文件存放到/etc/headscale/ 目录下并改名 config.yaml,需要修改的配置项如下:

修改以下的节点信息
server_url: http://XXX.XXX.XXX.XXX:8080  # 这里填写你的实际外网地址,域名或ip都可以
listen_addr: 0.0.0.0:8080
metrics_listen_addr: 0.0.0.0:9090
ip_prefixes:
  - fd7a:115c:a1e0::/48
  - 10.1.0.0/16
randomize_client_port: true
# 修改对自己来说方便的DNS,可以保持默认
dns_config:
	nameservers:
		- 223.5.5.5
# 建议关闭Magic DNS,否则有可能造成客户端无法正常上网
magic_dns: false
# 修改Socket存储位置
unix_socket: /var/run/headscale/headscale.sock

创建sock

# 创建文件夹
mkdir /var/run/headscale
# 创建文件
touch /var/run/headscale/headscale.sock

创建Headscale 用户

adduser --no-create-home --disabled-login --shell /sbin/nologin --disabled-password headscale

修改数据库的Owner

chown -R headscale:headscale /var/lib/headscale

测试运行

headscale serve

设置自启动

新建Service文件

touch /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

# 可选的权限和安全配置
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 start headscale
# 关闭服务
systemctl stop headscale
# 开机自启
systemctl enable headscale
# 查看状态
systemctl status headscale

Headscale命名空间设置

创建命名空间

# <namespace>替换为你自定义的租户名称
headscale namespaces create <namespace>
# 列出所有命名空间
headscale namespaces list

Nginx配置(如果是域名的话,ip则省略)

server {                                                                                     listen       80;                                                
  server_name  域名;
  location / {                              
    proxy_pass http://127.0.0.1:8080;                                    
    proxy_read_timeout  600;                     
    proxy_send_timeout 600;                                      
}

Headscale常用命令

# 显示节点列表
headscale nodes ls
# 删除节点
headscale nodes delete -i  <id>
# 启动服务
systemctl start headscale
# 开机自启
systemctl enable headscale
# 查看状态
systemctl status headscle
# 创建命名空间
headscale namespaces create <namespace>
# 查看命名空间列表
headscale namespaces list
# mac ping
/Applications/Tailscale.app/Contents/MacOS/Tailscale ping 100.64.0.2

自建Derp节点

安装Tailscale

# 安装
curl -fsSL https://tailscale.com/install.sh | sh
# 注册节点
tailscale up --login-server=http://你自己的域名或ip:8080 --accept-dns=false
# 在headscale的服务器添加节点(跟Headscale同一台就直接执行)
headscale -n 命名空间 nodes register --key nodekey:上面这行命令返回结果的key

使用Docker Compose运行derp镜像

以下是docker-derp.yaml配置文件

version: '3.5'
services:
  derper:
    container_name: derper
    image: fredliang/derper
    restart: always
    volumes:
      - ./cert:/cert
      - /var/run/tailscale/tailscaled.sock:/var/run/tailscale/tailscaled.sock
    ports:
      - 3478:3478/udp
      - 23479:23479
    environment:
      DERP_DOMAIN: 你的域名
      DERP_ADDR: ":23479"
      DERP_CERT_MODE: manual
      DERP_CERT_DIR: /cert
      DERP_VERIFY_CLIENTS: "true"

在docker-derp.yaml目录下运行

docker-compose up -d

在Headscale配置节点信息

配置文件/etc/headscale/derp.yaml

regions:
  901:
    regionid: 901
    regioncode: sh
    regionname: Tencent ShangHai
    nodes:
      - name: 901a
        regionid: 901
        hostname: '你的域名'
        stunport: 3478
        stunonly: false
        derpport: 23479

修改headscale配置/etc/headscale/config.yaml

derp:
  # List of externally available DERP maps encoded in JSON
  urls:
    - https://controlplane.tailscale.com/derpmap/default

  # Locally available DERP map files encoded in YAML
  #
  # This option is mostly interesting for people hosting
  # their own DERP servers:
  # https://tailscale.com/kb/1118/custom-derp-servers/
  #
  # paths:
  #   - /etc/headscale/derp-example.yaml
  paths:
    - /etc/headscale/derp.yaml

  # If enabled, a worker will be set up to periodically
  # refresh the given sources and update the derpmap
  # will be set up.
  auto_update_enabled: true

  # How often should we check for DERP updates?
  update_frequency: 24h

开放端口

udp 3478
tcp 23479

各终端加入节点方法

Mac

# 下载官方Tailscale客户端(去其他区,例如美区)
# 浏览器打开
http://你的域名或ip:8080/apple
# 执行页面中的命令行
tailscale login --login-server http://你的域名或ip:8080
# 获取返回的命令
headscale -n 命名空间 nodes register --key nodekey:上面这行命令返回结果的key
# 到Headscale服务器上执行返回的命令

Window

# 下载官方Tailscale客户端(官网)
# 浏览器打开
http://你的域名或ip:8080/windows
# 执行页面中的命令行
tailscale login --login-server http://你的域名或ip:8080
# 获取返回的命令
headscale -n 命名空间 nodes register --key nodekey:上面这行命令返回结果的key
# 到Headscale服务器上执行返回的命令

Linux

# 执行命令行
tailscale up --login-server=http://你的域名或ip:8080 --accept-routes=true --accept-dns=false
# 获取返回的命令
headscale -n 命名空间 nodes register --key nodekey:上面这行命令返回结果的key
# 到Headscale服务器上执行返回的命令

IOS

# 下载官方Tailscale客户端(去其他区,例如美区)
# 设置-往下拉到Tailscale
# 如果之前打开过APP登录过,需要打开Reset Keychain
# 在最下方ALTERNATE COORDINATION SERVER URL中设置自己的Headscale地址(域名或ip:8080)
# 然后开启Tailscale应该会进入到自己的页面而非官方的授权页面
# 具体参考https://headscale.net/iOS-client/#configuring-the-headscale-url

Q.E.D.