Як встановити 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
Виконання команди повертає попередньо автентифікований ключ, який використовується для підключення вузла під час виконання команди:headscale
tailscale
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.
$ 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.
Згенеруйте ключ API на сервері Headscale, якщо у вас його немає.
headscale apikeys create --expiration 120d
Введіть URL-адресу Headscale та ключ API.