Headscale — это реализация координационного сервера Tailscale с открытым исходным кодом. Tailscale существует уже некоторое время и позволяет пользователям создавать безопасные сети с беспрепятственным подключением нескольких устройств, независимо от физического местоположения этих устройств. Короче говоря, Tailscale делает процесс развертывания и управления VPN проще и удобнее для пользователя.
Технология Tailscale создает безопасную ячеистую сеть, которая позволяет всем подключенным к ней устройствам взаимодействовать друг с другом и вести себя так, как если бы они находились в одной локальной сети. Headscale полностью отделен от Tailscale и разработан независимо. В этой статье мы установим, настроим и будем использовать Headscale для создания ячеистой сети и подключения ваших устройств.
1. Установите Headscale на Ubuntu 22.04
Сначала подключитесь к своему серверу через SSH и убедитесь, что он обновлен.
sudo apt-get update -y && sudo apt-get upgrade -y
Загрузите последний пакет Headscale для вашей платформы (.deb для Ubuntu и Debian) со страницы выпусков 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 dpkg --install ./headscale_${VERSION}_linux_amd64.deb
Мы можем включить запуск службы при загрузке системы.
sudo systemctl enable headscale.service
2. Настройте службу Headscale.
Вы можете настроить параметры конфигурации Headscale, отредактировав файл /etc/headscale/config.yaml
.
sudo nano /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 start headscale.service
Статус службы можно проверить с помощью команды systemctl.
sudo systemctl status headscale.service
Список портов, используемых службой 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.example.com указывает на 128.140.96.199.
Мы можем подтвердить, что настроенная запись DNS работает.
host vpn.example.com
vpn.example.com has address 128.140.96.199
Установите веб-сервер Nginx в вашей системе Ubuntu.
sudo apt install nginx
Создайте виртуальный хост для Headscale.
sudo nano /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.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 верны.
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 nano /etc/headscale/config.yaml
server_url: http://vpn.example.com:80
Вам необходимо перезапустить службу Headscale, чтобы изменения вступили в силу.
sudo systemctl restart headscale.service
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.example.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.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 в файл. Вы можете подтвердить это, просмотрев его содержимое.
cat /etc/nginx/conf.d/headscale.conf
Перезапустите веб-сервер nginx.
sudo systemctl restart nginx.service
Наконец, обновите конфигурацию Headscale и установите URL-адрес домена и https.
sudo nano /etc/headscale/config.yaml
server_url: https://vpn.example.com:443
Перезапустите службу Headscale.
sudo systemctl restart headscale.service
Обратите внимание, что сертификаты также можно указать внутри файла конфигурации Headscale, если не используется прокси-сервер Nginx.
sudo nano /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.
Давайте создадим пользователя с именем myfirstuser на сервере Headscale.
headscale users create myfirstuser
User created
На клиентском компьютере выполните команду входа в Tailscale
:
tailscale up --login-server http://vpn.example.com
To authenticate, visit:
https://vpn.example.com:443/register/nodekey:410155d1792d0f81a5f39415a1a418f882208751570c2e5195f7a6842ca44e6a
Когда вы открываете ссылку в своем браузере, вам предоставляются команды, которые нужно использовать при регистрации машины, добавляемой в сеть Headscale.
Зарегистрируйте машину:
Скопируйте и вставьте команду на терминал сервера Headscale, заменив USERNAME на созданного пользователя.
headscale nodes register --user myfirstuser --key nodekey:410155d1792d0f81a5f39415a1a418f882208751570c2e5195f7a6842ca44e6a
Machine rocky8 registered
Список пользователей, созданных на сервере Headscale.
headscale user list
ID | Name | Created
1 | myfirstuser | 2023-10-14 15:02:12
2 | Slacer | 2023-10-14 15:05:51
Чтобы зарегистрировать машину через 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] | Slacer | 100.64.0.1, fd7a:115c:a1e0::1 | false | 2023-10-05 16:48:58 | 0001-01-01 00:00:00 | online | no
Зарегистрируйте машину, используя предварительно аутентифицированный ключ
Вы также можете зарегистрировать новую машину, используя предварительно аутентифицированный ключ.
Сначала сгенерируйте ключ с помощью командной строки:
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 Slacer preauthkeys create --reusable --expiration 24h
4763c4f4293b260eff230065378e5668c13db44f4569ed7b
# On Machine to be registered
# tailscale up --login-server http://vpn.example.com --authkey 4763c4f4293b260eff230065378e5668c13db44f4569ed7b
Команда регистрации машины с предварительно проверенным ключом не дает никаких результатов. Но вы можете подтвердить, добавлены ли новые узлы из 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] | 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
Удалите узел в вашей сети.
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>
Создайте ключ API:
headscale apikeys create --expiration 90d
Список ключей API:
headscale apikeys list
Срок действия ключа API истекает:
headscale apikeys expire --prefix "<PREFIX>"
Вывод
Сегодня в этой статье вы узнали, как Headscale установить и проверить общие сведения об этой технологии.
Надеюсь, вам понравилась эта беззаботная статья и вы поможете нам распространить эту статью среди ваших друзей.
Не стесняйтесь поделиться своим опытом и дополнительными советами в комментариях ниже!