Як встановити Headscale на Ubuntu 24.04 | Ubuntu 22.04 | Ubuntu 20.04

Як встановити Headscale на Ubuntu 24.04 | Ubuntu 22.04 | Ubuntu 20.04

 

Headscale є реалізацією координаційного сервера Tailscale з відкритим вихідним кодом. Tailscale існує вже деякий час, і він дозволяє користувачам створювати безпечні мережі з кількома пристроями, які безперешкодно підключаються, незалежно від фізичного розташування цих пристроїв. У двох словах, Tailscale робить процес розгортання та управління VPN простішим і зручнішим для користувача.

Технологія Tailscale створює безпечну mesh-мережу, яка дозволяє всім підключеним до неї пристроям спілкуватися один з одним і поводитися так, ніби вони знаходяться в одній локальній мережі. Headscale повністю відокремлена від Tailscale і розроблена самостійно. У цій статті ми встановимо, налаштуємо та використаємо Headscale для створення mesh-мережі та підключення ваших пристроїв.

Крок 1. Завантажте пакет Headscale Apt

Оновити систему apt package index.

sudo apt update

Відвідайте сторінку релізів Headscale на Github. Під тегами ви можете отримати останній номер стабільного випуску.

VERSION=$(curl --silent "https://api.github.com/repos/juanfont/headscale/releases/latest"|grep '"tag_name"'|sed -E 's/.*"([^"]+)".*/\1/'|sed 's/v//')
wget https://github.com/juanfont/headscale/releases/download/v${VERSION}/headscale_${VERSION}_linux_amd64.deb

Встановіть пакет після його завантаження за допомогою команди.apt

sudo apt install -f ./headscale_${VERSION}_linux_amd64.deb

Ми можемо включити запуск служби при завантаженні системи.

sudo systemctl enable headscale

Крок 2. Налаштуйте службу Headscale

Ви можете налаштувати параметри конфігурації Headscale, відредагувавши файл /etc/headscale/config.yaml

sudo vim /etc/headscale/config.yaml

Помітними параметрами для налаштування є:

# The url clients will connect to.
server_url: http://127.0.0.1:8080

# Address to listen to / bind to on the server
listen_addr: 127.0.0.1:8080

# Address to listen to /metrics, you may want
metrics_listen_addr: 127.0.0.1:9090

Ви можете налаштувати прослуховування на всіх інтерфейсах.

server_url: http://0.0.0.0:8080
listen_addr: 0.0.0.0:8080

Або конкретна IP-адреса.

server_url: http://192.168.20.10:8080
listen_addr: 192.168.20.10:8080

Ви можете налаштувати інші параметри відповідно до вашого випадку використання та перезапустити службу після завершення.

sudo systemctl restart headscale.service

Статус служби можна перевірити за допомогою команди.systemctl

$ systemctl status headscale.service
headscale.service - headscale coordination server for Tailscale
     Loaded: loaded (/lib/systemd/system/headscale.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2024-07-22 07:11:04 UTC; 3s ago
   Main PID: 5901 (headscale)
      Tasks: 8 (limit: 19092)
     Memory: 9.4M
        CPU: 68ms
     CGroup: /system.slice/headscale.service
             └─5901 /usr/bin/headscale serve

Jul 22 07:11:04 workstation systemd[1]: Started headscale coordination server for Tailscale.
Jul 22 07:11:04 workstation headscale[5901]: An updated version of Headscale has been found (0.23.0-alpha1 vs. your current v0.22.3). Check it out https://github.com/juanfont/headscale/releases
Jul 22 07:11:04 workstation headscale[5901]: 2024-07-22T07:11:04Z INF Setting up a DERPMap update worker frequency=86400000
Jul 22 07:11:04 workstation headscale[5901]:2024-07-22T07:11:04Z INF listening and serving HTTP on: 0.0.0.0:9080
Jul 22 07:11:04 workstation headscale[5901]: 2024-07-22T07:11:04Z INF listening and serving metrics on: 0.0.0.0:9090

Список портів, що використовуються сервісом Headscale.

$ ss -tunelp | egrep '9080|9090'
tcp   LISTEN 0      128                *:9080             *:*    users:(("headscale",pid=5901,fd=11)) uid:1002 ino:69679 sk:b cgroup:/system.slice/headscale.service v6only:0 <->
tcp   LISTEN 0      128                *:9090             *:*    users:(("headscale",pid=5901,fd=13)) uid:1002 ino:69680 sk:c cgroup:/system.slice/headscale.service v6only:0 <->

Крок 3. Налаштування проксі Nginx для Headscale

У цьому посібнику ми налаштуємо Nginx як проксі-сервер для Headscale. Зіставлення IP-адрес та імен DNS:

  • VPN.наймати інженерів.com вказує на 128.140.96.199.

Ми можемо підтвердити, що налаштований DNS-запис працює.

$ host vpn.hirebestengineers.com
vpn.hirebestengineers.com has address 128.140.96.199

Встановіть веб-сервер Nginx у свою систему Ubuntu.

sudo apt install nginx

Створіть віртуальний хост для Headscale.

sudo vim /etc/nginx/conf.d/headscale.conf

Вставте інформацію нижче та оновіть значення server_name.

map $http_upgrade $connection_upgrade {
    default      keep-alive;
    'websocket'  upgrade;
    ''           close;
}

server {
    listen 80;
	listen [::]:80;

    server_name vpn.hirebestengineers.com;

    location / {
        proxy_pass  http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $server_name;
        proxy_redirect http:// https://;
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    }
}

Переконайтеся, що конфігурації nginx правильні.

$ sudo nginx  -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Headscale можна налаштувати на використання доменного імені.

$ sudo vim /etc/headscale/config.yaml
server_url: http://vpn.hirebestengineers.com:80

Вам потрібно буде перезапустити службу Headscale, щоб зміни відбулися.

Крок 4. Захист Headscale за допомогою SSL-сертифікатів

Ми налаштуємо Headscale для використання TLS. Це можуть бути комерційні сертифікати, Free Let’s Encrypt SSL або самопідписані сертифікати.

Використання Let’s Encrypt SSL

Почніть із встановлення інструменту certbot

sudo apt update && sudo apt install snapd
sudo snap install --classic certbot

Згенеруйте Let’s Encrypt SSL для Headscale, використовуючи доменне ім’я, налаштоване у файлі nginx.headscale.conf

DOMAIN=vpn.hirebestengineers.com
sudo certbot --register-unsafely-without-email --agree-tos --nginx -d $DOMAIN

Успішне відновлення виходу.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account registered.
Requesting a certificate for vpn.hirebestengineers.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/vpn.hirebestengineers.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/vpn.hirebestengineers.com/privkey.pem
This certificate expires on 2024-01-02.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.

Deploying certificate
Successfully deployed certificate for vpn.hirebestengineers.com to /etc/nginx/conf.d/headscale.conf
Congratulations! You have successfully enabled HTTPS on https://vpn.hirebestengineers.com

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
 * Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
 * Donating to EFF:                    https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Інструмент Certbot автоматично вставить конфігурації SSL у файл. Ви можете переконатися в цьому, переглянувши його вміст.

cat /etc/nginx/conf.d/headscale.conf

Перезапустіть веб-сервер nginx.

sudo systemctl restart nginx

Нарешті, оновіть конфігурацію Headscale і встановіть URL-адресу на домен і https.

$ sudo vim /etc/headscale/config.yaml
server_url: https://vpn.hirebestengineers.com:443

Перезапустіть службу headscale.

sudo systemctl restart headscale

Зауважте, що сертифікати також можна вказувати у файлі конфігурації Headscale, якщо не використовується проксі-сервер Nginx.

$ sudo vim /etc/headscale/config.yaml
## Use already defined certificates:
tls_cert_path: ""
tls_key_path: ""

Використання користувальницьких SSL-сертифікатів

Якщо ви використовуєте власні сертифікати, ви можете змінити

map $http_upgrade $connection_upgrade {
    default      keep-alive;
    'websocket'  upgrade;
    ''           close;
}

server {
    listen 80;
	listen [::]:80;

	listen 443      ssl http2;
	listen [::]:443 ssl http2;

    server_name your_fqdn;

    ssl_certificate <PATH_TO_CERT>;
    ssl_certificate_key <PATH_CERT_KEY>;
    ssl_protocols TLSv1.2 TLSv1.3;

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $server_name;
        proxy_redirect http:// https://;
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
    }
}

Крок 5. Приєднання клієнтських пристроїв до сітки Headscale

Давайте створимо користувача на ім’я infoit на сервері Headscale.

$ sudo su -
# headscale users create infoit
User created

Встановлюйте клієнти Tailscale

Встановіть Tailscale на Linux

Щоб встановити tailscale на Linux, виконайте наступні команди.

curl -fsSL https://tailscale.com/install.sh | sudo sh

Перевірити версію Tailscale можна за допомогою команд нижче.

$ tailscale --version
1.70.0
  tailscale commit: 0e0a212418fbf8243cb3f06634367b61e81ea9db
  other commit: 26f80df929d9ae698931e4dd1fbdf05f2138ff6f
  go version: go1.22.5

Встановлення на macOS

За допомогою Homebrew можна встановити:

brew install tailscale

Або запустивши скрипт.

curl -fsSL https://tailscale.com/install.sh | sudo sh

Ви можете переглянути сторінки довідки з використання:

tailscale up --help

Зареєструйте апарат за допомогою попередньо автентифікованого ключа

Ви можете зареєструвати новий апарат за допомогою попередньо автентифікованого ключа.

Список користувачів, створених на сервері Headscale.

$ headscale user list
ID | Name        | Created
1  | myfirstuser | 2023-10-04 14:01:42
2  | jkmutai     | 2023-10-04 14:03:31

Спочатку згенеруйте ключ за допомогою командного рядка:

headscale --user <username> preauthkeys create --reusable --expiration 24h

Виконання команди повертає попередньо автентифікований ключ, який використовується для підключення вузла під час виконання команди:headscaletailscale

tailscale up --login-server <YOUR_HEADSCALE_URL> --authkey <YOUR_AUTH_KEY>

Розглянемо приклад нижче.

# On Headscale server
# headscale --user jkmutai preauthkeys create --reusable --expiration 24h
4763c4f4293b260eff230065378e5668c13db44f4569ed7b

# On Machine to be registered
# tailscale up --login-server http://vpn.hirebestengineers.com --authkey 4763c4f4293b260eff230065378e5668c13db44f4569ed7b

Щоб вивести список Pre-auth key для користувача:

headscale preauthkeys --user <username> list

Команда реєстрації машини з попередньо автентифікованим ключем не дає виводу. Але ви можете підтвердити, чи додано новий вузол із CLI сервера Headscale.

# headscale node list
ID | Hostname | Name   | MachineKey | NodeKey | User    | IP addresses                  | Ephemeral | Last seen           | Expiration          | Online | Expired
1  | rocky8   | rocky8 | [s+TG9]    | [QQFV0] | jkmutai | 100.64.0.1, fd7a:115c:a1e0::1 | false     | 2023-10-05 17:05:58 | 0001-01-01 00:00:00 | online | no
2  | mail     | mail   | [V8WI2]    | [OvPLb] | jkmutai | 100.64.0.2, fd7a:115c:a1e0::2 | false     | 2023-10-05 17:06:32 | 0001-01-01 00:00:00 | online | no

Зареєструйте машину (звичайний логін)

На клієнтській машині виконайте команду входу:tailscale

tailscale up --login-server YOUR_HEADSCALE_URL

Дивіться приклад нижче.

# tailscale up --login-server http://vpn.hirebestengineers.com

To authenticate, visit:
	https://vpn.hirebestengineers.com:443/register/nodekey:410155d1792d0f81a5f39415a1a418f882208751570c2e5195f7a6842ca44e6a

Коли ви відкриваєте посилання у своєму браузері, вам надаються команди для використання під час реєстрації машини, що додається до мережі Headscale.

Як встановити Headscale на Ubuntu 24.04

Список користувачів, створених на сервері Headscale.

$ headscale user list
ID | Name        | Created
1  | myfirstuser | 2023-10-04 14:01:42
2  | jkmutai     | 2023-10-04 14:03:31

Скопіюйте та вставте команду на терміналі сервера Headscale, замінивши USERNAME на created user.

$ headscale nodes register --user infoit --key nodekey:410155d1792d0f81a5f39415a1a418f882208751570c2e5195f7a6842ca44e6a
Machine rocky8 registered

Щоб зареєструвати машину через синтаксис команди, це:headscale

headscale --user <username> nodes register --key <YOU_+MACHINE_KEY>

Тепер ви можете перераховувати вузли, додані до мережі Headscale.

# headscale node list
ID | Hostname | Name   | MachineKey | NodeKey | User    | IP addresses                  | Ephemeral | Last seen           | Expiration          | Online | Expired
1  | rocky8   | rocky8 | [s+TG9]    | [QQFV0] | jkmutai | 100.64.0.1, fd7a:115c:a1e0::1 | false     | 2023-10-05 16:48:58 | 0001-01-01 00:00:00 | online | no

Крок 6. Корисні команди Headscale

Видаліть вузол у вашій мережі.

headscale node delete -i <ID>

Перемістити вузол до іншого користувача

headscale node move  -i  <ID> -u <New-User>

Перейменування комп’ютера в мережі

headscale node rename  -i  <ID>  <NEW_NAME>

Завершення терміну дії (вихід із системи) комп’ютера у вашій мережі

headscale node expire -i <ID>

Список ключів попередньої аутентифікації:

headscale preauthkeys --user <username> list

Згенеруйте ключ попередньої автентифікації:

headscale --user <username> preauthkeys create --reusable --expiration <expiry>

Термін дії Pre-auth key:

headscale preauthkeys --user <username>  expire <key>

Створіть ключ API:

headscale apikeys create --expiration 90d

Список ключів API:

headscale apikeys list

Термін дії ключа API закінчується:

headscale apikeys expire --prefix "<PREFIX>"

Маршрути:

# headscale routes list
ID | Machine         | Prefix          | Advertised | Enabled | Primary
2  | pfsense-chaileo | 192.168.88.0/24 | true       | true    | true
3  | pfsense-gulled  | 192.168.89.0/24 | true       | false   | false

# headscale routes enable -r 3
# headscale routes list
ID | Machine         | Prefix          | Advertised | Enabled | Primary
2  | pfsense-chaileo | 192.168.88.0/24 | true       | true    | true
3  | pfsense-gulled  | 192.168.89.0/24 | true       | true    | true

Крок 7. Встановлення інтерфейсу Headscale UI

Headscale-UI — це веб-інтерфейс для координаційного сервера, сумісного з headscale. Ми запустимо це в Docker Container.

Встановіть Docker CE.

sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Створіть файл Compose для Headscale UI.

$ vim docker-compose.yml
services:
  headscale-ui:
    container_name: headscale-ui
    image: ghcr.io/guruinfoit/headscale-ui:latest
    pull_policy: always
    restart: unless-stopped
    ports:
        - 9080:80

Потім запустіть контейнер

docker compose up -d

Перевірте стан за допомогою команди docker.

$ docker ps
CONTAINER ID   IMAGE                                       COMMAND                  CREATED      STATUS      PORTS                                            NAMES
5fa151abfa99   ghcr.io/guruinfoit/headscale-ui:latest   "/bin/sh -c '/bin/sh…"   9 days ago   Up 9 days   443/tcp, 0.0.0.0:9080->80/tcp, :::9080->80/tcp   headscale-ui

Оновіть конфігурацію проксі-сервера Nginx для Headscale, щоб включити інтерфейс користувача./etc/nginx/conf.d/headscale.conf

map $http_upgrade $connection_upgrade {
    default      keep-alive;
    'websocket'  upgrade;
    ''           close;
}

server {

    server_name vpn.example.com;

    location /web/ {
    proxy_pass http://ServerIP:9080/web/;
    }


    location / {
        proxy_pass  http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Host $server_name;
        proxy_redirect http:// https://;
        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
        add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;
	add_header 'Access-Control-Allow-Origin' '';
    }

    listen [::]:443 ssl ipv6only=on; # managed by Certbot
    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/vpn.example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/vpn.example.com/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

}


server {
    if ($host = vpn.example.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
	listen [::]:80;

    server_name vpn.example.com;
    return 404; # managed by Certbot
}

Перезапустіть Nginx після оновлення конфігурацій.

sudo systemctl restart nginx

Відвідайте веб-інтерфейс Headscale-UI за адресою http://yourfqdn/web. Натисніть «Налаштування», щоб встановити URL-адресу Headscale та ключ API.

Як встановити Headscale на Ubuntu 24.041

Згенеруйте ключ API на сервері Headscale, якщо у вас його немає.

headscale apikeys create --expiration 120d

Введіть URL-адресу Headscale та ключ API.

Як встановити Headscale на Ubuntu 24.041

Прокрутка до верху