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.
Создайте виртуальный хост для 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:
Срок действия ключа API истекает:
1
| headscale apikeys expire --prefix "<PREFIX>"
|
Вывод#
Сегодня в этой статье вы узнали, как Headscale установить и проверить общие сведения об этой технологии.
Надеюсь, вам понравилась эта беззаботная статья и вы поможете нам распространить эту статью среди ваших друзей.
Не стесняйтесь поделиться своим опытом и дополнительными советами в комментариях ниже!