Headscale — это реализация координационного сервера Tailscale с открытым исходным кодом. Tailscale существует уже некоторое время и позволяет пользователям создавать безопасные сети с беспрепятственным подключением нескольких устройств, независимо от физического местоположения этих устройств. Короче говоря, Tailscale делает процесс развертывания и управления VPN проще и удобнее для пользователя.

Технология Tailscale создает безопасную ячеистую сеть, которая позволяет всем подключенным к ней устройствам взаимодействовать друг с другом и вести себя так, как если бы они находились в одной локальной сети. Headscale полностью отделен от Tailscale и разработан независимо. В этой статье мы установим, настроим и будем использовать Headscale для создания ячеистой сети и подключения ваших устройств.

1. Установите Headscale на Ubuntu 22.04

Сначала подключитесь к своему серверу через SSH и убедитесь, что он обновлен.

1
sudo apt-get update -y && sudo apt-get upgrade -y

Загрузите последний пакет Headscale для вашей платформы (.deb для Ubuntu и Debian) со страницы выпусков Headscale на Github:

1
2
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.

1
sudo dpkg --install ./headscale_${VERSION}_linux_amd64.deb

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

1
sudo systemctl enable headscale.service

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

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

1
sudo nano /etc/headscale/config.yaml

Известные параметры для настройки:

1
2
3
4
5
6
7
8
# 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

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

1
2
server_url: http://0.0.0.0:8080
listen_addr: 0.0.0.0:8080

Или конкретный IP-адрес.

1
2
server_url: http://192.168.20.10:8080
listen_addr: 192.168.20.10:8080

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

1
sudo systemctl start headscale.service

Статус службы можно проверить с помощью команды systemctl.

1
sudo systemctl status headscale.service

Список портов, используемых службой Headscale.

1
2
3
$ 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.example.com указывает на 128.140.96.199.

Мы можем подтвердить, что настроенная запись DNS работает.

1
2
host vpn.example.com
vpn.example.com has address 128.140.96.199

Установите веб-сервер Nginx в вашей системе Ubuntu.

1
sudo apt install nginx

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

1
sudo nano /etc/nginx/conf.d/headscale.conf

Вставьте приведенную ниже информацию и обновите значение server_name.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
map $http_upgrade $connection_upgrade {
    default      keep-alive;
    'websocket'  upgrade;
    ''           close;
}

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

    server_name vpn.example.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 верны.

1
2
3
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 можно настроить на использование доменного имени.

1
2
sudo nano /etc/headscale/config.yaml
server_url: http://vpn.example.com:80

Вам необходимо перезапустить службу Headscale, чтобы изменения вступили в силу.

1
sudo systemctl restart headscale.service

4. Защита Headscale с помощью SSL-сертификатов

Мы настроим Headscale для использования TLS. Это могут быть коммерческие сертификаты, Free Let’s Encrypt SSL или самозаверяющие сертификаты.

Использование Let’s Encrypt SSL

Начните с установки инструмента certbot

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

Создайте Let’s Encrypt SSL для Headscale, используя доменное имя, настроенное в файле nginx headscale.conf.

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

Успешное возобновление вывода.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Account registered.
Requesting a certificate for vpn.example.com

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/vpn.example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/vpn.example.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.example.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 в файл. Вы можете подтвердить это, просмотрев его содержимое.

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

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

1
sudo systemctl restart nginx.service

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

1
2
sudo nano /etc/headscale/config.yaml
server_url: https://vpn.example.com:443

Перезапустите службу Headscale.

1
sudo systemctl restart headscale.service

Обратите внимание, что сертификаты также можно указать внутри файла конфигурации Headscale, если не используется прокси-сервер Nginx.

1
2
3
4
sudo nano /etc/headscale/config.yaml
## Use already defined certificates:
tls_cert_path: ""
tls_key_path: ""

Использование пользовательских сертификатов SSL

Если вы используете пользовательские сертификаты, вы можете изменить

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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.

Давайте создадим пользователя с именем myfirstuser на сервере Headscale.

1
2
headscale users create myfirstuser
User created

На клиентском компьютере выполните команду входа в Tailscale:

1
2
3
4
tailscale up --login-server http://vpn.example.com

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

Когда вы открываете ссылку в своем браузере, вам предоставляются команды, которые нужно использовать при регистрации машины, добавляемой в сеть Headscale.

Зарегистрируйте машину:

Скопируйте и вставьте команду на терминал сервера Headscale, заменив USERNAME на созданного пользователя.

1
2
headscale nodes register --user myfirstuser --key nodekey:410155d1792d0f81a5f39415a1a418f882208751570c2e5195f7a6842ca44e6a
Machine rocky8 registered

Список пользователей, созданных на сервере Headscale.

1
2
3
4
headscale user list
ID | Name        | Created
1  | myfirstuser | 2023-10-14 15:02:12
2  | Slacer      | 2023-10-14 15:05:51

Чтобы зарегистрировать машину через headscale, синтаксис команды следующий:

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

Теперь вы можете перечислить узлы, добавленные в сеть Headscale.

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

Зарегистрируйте машину, используя предварительно аутентифицированный ключ

Вы также можете зарегистрировать новую машину, используя предварительно аутентифицированный ключ.

Сначала сгенерируйте ключ с помощью командной строки:

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

Выполнение команды возвращает предварительно проверенный ключ, используемый для подключения узла к headscale при запуске команды tailscale:

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

Давайте посмотрим пример ниже.

1
2
3
4
5
6
# On Headscale server
# headscale --user Slacer preauthkeys create --reusable --expiration 24h
4763c4f4293b260eff230065378e5668c13db44f4569ed7b

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

Команда регистрации машины с предварительно проверенным ключом не дает никаких результатов. Но вы можете подтвердить, добавлены ли новые узлы из CLI сервера Headscale.

1
2
3
4
headscale node list
ID | Hostname | Name   | MachineKey | NodeKey | User    | IP addresses                  | Ephemeral | Last seen           | Expiration          | Online | Expired
1  | rocky8   | rocky8 | [s+TG9]    | [QQFV0] | Slacer | 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] | Slacer | 100.64.0.2, fd7a:115c:a1e0::2 | false     | 2023-10-05 17:06:32 | 0001-01-01 00:00:00 | online | no

6. Полезные команды Headscale

Удалите узел в вашей сети.

1
headscale node delete -i <ID>

Переместить узел другому пользователю

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

Переименуйте машину в вашей сети

1
headscale node rename  -i  <ID>  <NEW_NAME>

Срок действия (выход из системы) машины в вашей сети

1
headscale node expire -i <ID>

Создайте ключ API:

1
headscale apikeys create --expiration 90d

Список ключей API:

1
headscale apikeys list

Срок действия ключа API истекает:

1
headscale apikeys expire --prefix "<PREFIX>"

Вывод

Сегодня в этой статье вы узнали, как Headscale установить и проверить общие сведения об этой технологии.

Надеюсь, вам понравилась эта беззаботная статья и вы поможете нам распространить эту статью среди ваших друзей.

Не стесняйтесь поделиться своим опытом и дополнительными советами в комментариях ниже!