Headscale tailscale

Материал из ALT Linux Wiki

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, для меня это было открытием неким, несмотря на большой опыт работы с сетями )))