Headscale tailscale
HeadScale сервер для клиентов TailScale
HeadScale сервер - это сетевой брокер для клиентов TailScale. Предназначен для обмена ключами между клиентами, сбора информации о белых IP-адресах клиентов (сами клиенты с серыми IP за NAT), реализацией протокола STUN для клиентов и помощи в работе технологии UDP Hole Punching (два клиента в своих сетях за NAT организуют прямой UDP туннель - подробнее о технологии смотрите в Google).
Почитать можно тут: https://headscale.net/stable/.
В конечном итоге используя HeadScale-сервер и клиенты TailScale можно построить достаточно надежную приватную сетку (по умолчанию 100.64.0.0/10) и все устройства будут видеть друг друг и пользоваться ресурсами (сервера, ПК, ноуты, телефоны, NAS, etc - см. под какие ОС есть TailScale клиенты).
Загрузка и установка HeadScale на ALT Linux Server
# Ставим EPM:
apt-get install eepm
# Загружаем крайнюю версию с HeadScale под Debian x64:
wget https://github.com/juanfont/headscale/releases/download/v0.25.0/headscale_0.25.0_linux_amd64.deb
# Устанавливаем с перепаковкой через epm:
epm install --repack /root/headscale_0.25.0_linux_amd64.deb
После установки всех зависимостей у нас в системе будет установлен пакет примерно вот такой пакет: headscale-0.25.0-epm1.repacked.2.x86_64
Его содержимое ожидается вот таким:
[root@headscalealt ~]# rpm -q -l headscale
/etc/headscale
/etc/headscale/config.yaml
/usr/bin/headscale
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/headscale.service
/var/lib
/var/lib/headscale
/var/run/headscale
Настройка и запуск HeadScale сервера
Нам нужно, чтобы у нас был белый IP-адрес (не обязательно на этом сервере), внешнее выбранное DNS-имя и опубликованный до headscale-сервера порт TCP/8080.
Конфигурационный файл только один, минимально требуется исправить два аргумента:
[root@headscalealt ~]# diff /etc/headscale/config.yaml /etc/headscale/config.yaml.original
13c13
< server_url: http://uunit.dorlasufa.ru:8080
---
> server_url: http://127.0.0.1:8080
19c19
< listen_addr: 0.0.0.0:8080
---
> listen_addr: 127.0.0.1:8080
Чтобы успешно запустить службу, далее поработаем с файлом: /usr/lib/systemd/system/headscale.service
Исправим поля с юзером и группой (вместо headscale впишем root), а также закомментируем часть спец-разрешений и прав. Итоговый файл:
[Unit]
After=syslog.target
After=network.target
Description=headscale coordination server for Tailscale
X-Restart-Triggers=/etc/headscale/config.yaml
[Service]
Type=simple
User=root
Group=root
ExecStart=/usr/bin/headscale serve
ExecReload=/usr/bin/kill -HUP $MAINPID
Restart=always
RestartSec=5
WorkingDirectory=/var/lib/headscale
ReadWritePaths=/var/lib/headscale /var/run
AmbientCapabilities=CAP_NET_BIND_SERVICE CAP_CHOWN
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_CHOWN
LockPersonality=true
NoNewPrivileges=true
PrivateDevices=true
PrivateMounts=true
PrivateTmp=true
ProcSubset=pid
ProtectClock=true
ProtectControlGroups=true
ProtectHome=true
ProtectHostname=true
ProtectKernelLogs=true
ProtectKernelModules=true
ProtectKernelTunables=true
#ProtectProc=invisible
#ProtectSystem=strict
RemoveIPC=true
#RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
#RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
RuntimeDirectory=headscale
RuntimeDirectoryMode=0750
StateDirectory=headscale
StateDirectoryMode=0750
SystemCallArchitectures=native
#SystemCallFilter=@chown
#SystemCallFilter=@system-service
#SystemCallFilter=~@privileged
UMask=0077
[Install]
WantedBy=multi-user.target
Включаем службу, запускаем, проверяем:
systemctl enable headscale.service
systemctl start headscale.service
systemctl status headscale.service
# Далее проверяем журналы службы:
journalctl -u headscale -f
фев 18 12:30:55 headscalealt systemd[1]: Started headscale coordination server for Tailscale.
фев 18 12:30:55 headscalealt headscale[10659]: 2025-02-18T12:30:55+05:00 INF Opening database database=sqlite3 path=/var/lib/headscale/db.sqlite
фев 18 12:30:55 headscalealt headscale[10659]: 2025-02-18T12:30:55+05:00 INF ../../../home/runner/work/headscale/headscale/hscontrol/app.go:570 > Clients with a lower minimum version will be rejected minimum_version=v1.62.0
фев 18 12:30:56 headscalealt headscale[10659]: 2025-02-18T12:30:56+05:00 INF listening and serving HTTP on: 0.0.0.0:8080
фев 18 12:30:56 headscalealt headscale[10659]: 2025-02-18T12:30:56+05:00 INF listening and serving debug and metrics on: 127.0.0.1:9090
# Проверяем открытые порты:
headscale 10659 root 12u IPv4 35494 0t0 TCP 127.0.0.1:9090 (LISTEN)
headscale 10659 root 13u IPv6 35493 0t0 TCP *:8080 (LISTEN)
# Все, сервер успешно запущен
Создание клиентов для подключения удаленных узлов
Клиентов создать очень просто:
[root@headscalealt ~]# /usr/bin/headscale users create azure-deb1
User created
[root@headscalealt ~]# /usr/bin/headscale users create azure-deb2
User created
[root@headscalealt ~]# /usr/bin/headscale users create android-egor1
User created
[root@headscalealt ~]# /usr/bin/headscale users create alt-egor1
User created
Установка TailScale под Windows, Linux, Android
Для Android установил через Huawei Market через сайт apkpure.
Для Linux (ALT Workstation) установка через скрипт не проходит (не опознает ОС), НО, можно через VPN скачать статически слинкованную программу: https://pkgs.tailscale.com/stable/tailscale_1.80.2_amd64.tgz
В ней два готовых бинарника (клиент и демон) + 2 файла для SystemD. Читаем, кидаем в каталоги, запускаем как службу.
Для Windows установка через VPN, так как изначально скачивается мини-app, который уже при запуске подкачивает основную программу и через GeoIP не работает в России.
Подключение TailScale клиентов к HeadScale серверу
На Linux делается командой:
tailscale up --login-server=http://uunit.dorlasufa.ru:8080/ --reset
После запуска выводится ссылка, по ней нужно зайти браузером откуда угодно - там будет команда, которую нужно выполнить на HeadScale сервере, НО, вместо поля с логином нужно подставить имя пользователя, которое мы ранее на HeadScale сервере создавали (azure-deb1 или android или в т.р.). Как только мы это сделаем, мы ассоциируем подключающегося клиента с пользователем и на Linux узле все закончится успешно.
Проверить статус подключения можно командой: tailscale status
root@azure:/etc/apt/sources.list.d# tailscale status
100.64.0.1 azure egor linux -
100.64.0.2 azure2 egor2 linux -
100.64.0.3 localhost android android idle; offline, tx 3372 rx 2964
На HeadScale сервере есть подобные команды, например:
root@headscale:/etc/headscale# headscale nodes list
ID | Hostname | Name | MachineKey | NodeKey | User | IP addresses | Ephemeral | Last seen | Expiration | Connected | Expired
1 | azure | azure | [eNYlz] | [s/Vmc] | egor | 100.64.0.1, fd7a:115c:a1e0::1 | false | 2025-02-17 11:29:00 | N/A | online | no
2 | azure2 | azure2 | [bINYe] | [ZCOzT] | egor2 | 100.64.0.2, fd7a:115c:a1e0::2 | false | 2025-02-18 03:11:20 | N/A | online | no
3 | localhost | localhost | [6EIRk] | [AYwkd] | android | 100.64.0.3, fd7a:115c:a1e0::3 | false | 2025-02-18 03:07:38 | N/A | offline | no
root@headscale:/etc/headscale# headscale users list
ID | Name | Username | Email | Created
1 | | egor | | 2025-02-17 04:41:34
2 | | egor2 | | 2025-02-17 05:37:33
3 | | android | | 2025-02-18 02:59:32
Заключение
Все, можно тестировать работу, протоколы подключения, стабильность, iperf3 и т.д.
Также очень стоит прочитать про UDP Hole Punching, для меня это было открытием неким, несмотря на большой опыт работы с сетями )))