1. Как работает Tailscale и зачем Headscale
Tailscale создаёт mesh-сеть на основе WireGuard: каждое устройство получает постоянный IP из диапазона 100.64.0.0/10 и видит остальные устройства сети напрямую. Не нужно открывать порты, настраивать маршруты или управлять WireGuard-ключами вручную.
Как это работает
Tailscale работает отлично, но контрол-сервер — в облаке Tailscale. Это означает зависимость от стороннего сервиса и ограничения бесплатного тарифа (3 пользователя, 100 устройств). Headscale — open source реализация того же контрол-сервера, которую вы запускаете на своём VPS. Клиенты остаются официальными — только указывают на ваш сервер вместо Tailscale.
| Параметр | Tailscale Cloud | Headscale self-hosted |
|---|---|---|
| Стоимость | Бесплатно до 3 юзеров / $6/мес за пользователя | Только стоимость VPS (~300 ₽/мес) |
| Узлов | 100 (бесплатно) | Без лимита |
| Пользователей | 3 (бесплатно) | Без лимита |
| Данные | Метаданные у Tailscale | Только на вашем сервере |
| Клиенты | Официальные Tailscale | Официальные Tailscale |
| Magic DNS | ✓ | ✓ |
| ACL | ✓ | ✓ |
| Надёжность | Managed SLA | Зависит от вашего VPS |
Версия Headscale в этом гайде — v0.28.0
Это актуальная стабильная версия (5 февраля 2026). В ней переработана система аутентификации и pre-auth ключи теперь хранятся в bcrypt-хеше — показываются только один раз при создании.
2. Требования к серверу
Headscale потребляет очень мало ресурсов — контрол-плейн занимается только координацией ключей, не пропуская через себя пользовательский трафик.
| Параметр | Минимум | Рекомендуется |
|---|---|---|
| CPU | 1 vCPU | 1 vCPU (достаточно для 100+ узлов) |
| RAM | 256 МБ | 512 МБ (с запасом для Nginx) |
| Диск | 5 ГБ | 10 ГБ |
| ОС | Ubuntu 22.04, Debian 12 | Ubuntu 22.04 LTS |
| Публичный IP | Обязателен | Статический IP |
| Домен | Обязателен | Поддомен: vpn.ваш-домен.ru |
Можно поставить на уже работающий VPS
Headscale отлично уживается с Nginx, Docker и другими сервисами. Контрол-сервер потребляет 20–50 МБ RAM в покое. Специальный VPS для Headscale не нужен — достаточно добавить его к существующему серверу.
3. Установка Headscale
Рекомендуемый способ — deb-пакет. Он автоматически создаёт системного пользователя, устанавливает конфиг по умолчанию и регистрирует systemd-сервис.
wget https://github.com/juanfont/headscale/releases/download/v0.28.0/headscale_0.28.0_linux_amd64.debsudo apt install ./headscale_0.28.0_linux_amd64.debПосле установки сервис ещё не запущен — сначала нужно отредактировать конфиг. Проверьте, что всё установилось корректно:
headscale version
# headscale v0.28.0Файлы после установки
- /etc/headscale/config.yaml — конфигурация
- /var/lib/headscale/ — база данных и ключи
- /var/run/headscale/ — unix-сокет
4. Настройка конфига
Откройте конфиг и измените ключевые параметры под ваш домен:
sudo nano /etc/headscale/config.yamlНайдите и измените следующие параметры (конфиг большой — используйте Ctrl+W для поиска):
# URL, по которому клиенты будут подключаться к вашему серверу
server_url: https://vpn.ваш-домен.ru
# Адрес для прослушивания (Nginx будет проксировать на этот порт)
listen_addr: 127.0.0.1:8080
# Метрики (опционально — для Prometheus)
metrics_listen_addr: 127.0.0.1:9090
# IP-диапазоны для узлов mesh-сети
prefixes:
v4: 100.64.0.0/10
v6: fd7a:115c:a1e0::/48
allocation: sequential
# База данных (SQLite — подходит для домашнего и небольшого проф. использования)
database:
type: sqlite
sqlite:
path: /var/lib/headscale/db.sqlite
write_ahead_log: true
# DERP — публичные relay-серверы Tailscale (использовать бесплатно)
derp:
urls:
- https://controlplane.tailscale.com/derpmap/default
auto_update_enabled: true
update_frequency: 24h
# Magic DNS
dns:
magic_dns: true
base_domain: vpn.ваш-домен.ruВажно: base_domain ≠ server_url домен
server_url — домен контрол-сервера (vpn.ваш-домен.ru).base_domain — суффикс для Magic DNS имён устройств (server1.vpn.ваш-домен.ru). Они могут совпадать — это нормально.
5. Nginx + SSL
Headscale использует HTTP/2 и WebSocket — конфиг Nginx немного отличается от стандартного reverse proxy.
Шаг 1: добавить DNS-запись
vpn.ваш-домен.ru → A → IP_СЕРВЕРАШаг 2: установить и настроить Nginx
sudo apt install -y nginxmap $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name vpn.ваш-домен.ru;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_http_version 1.1;
# WebSocket и HTTP/2 upgrade
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
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 $scheme;
# Важно: отключить буферизацию для стриминга событий
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}Шаг 3: SSL-сертификат и запуск
Certbot автоматически добавит HTTPS-блок в конфиг и настроит редирект с HTTP.
Если на сервере включён UFW
Certbot использует HTTP-01 challenge — порт 80 должен быть доступен извне. Откройте порты до запуска certbot:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp
# Активировать конфиг
sudo ln -s /etc/nginx/sites-available/headscale /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# Получить SSL-сертификат (certbot сам добавит HTTPS-блок в конфиг)
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d vpn.ваш-домен.ru
# Запустить Headscale
sudo systemctl enable --now headscale
# Проверить статус
sudo systemctl status headscaleПосле успешного запуска проверьте, что сервер отвечает:
curl https://vpn.ваш-домен.ru/health
# {"status":"pass"}6. Подключение первого узла (Linux)
Сначала создадим пользователя в Headscale и сгенерируем ключ аутентификации. Затем установим Tailscale-клиент на первый сервер.
На сервере с Headscale: создать пользователя
sudo headscale users create mynetsudo headscale preauthkeys create --user mynet --reusable --expiration 24hСохраните ключ — он выглядит как hskey-auth-xxxxxxxxxxxx-xxxxxxxx. После создания он больше не будет показан. Флаг --reusable позволяет использовать один ключ для нескольких узлов.
В v0.28 флаг --user стал необязательным — его можно опустить, ключ создастся без привязки к пользователю. Команда preauthkeys list теперь также показывает все ключи глобально, без фильтрации по --user.
На подключаемом сервере: установить Tailscale
curl -fsSL https://tailscale.com/install.sh | shsudo tailscale up --login-server https://vpn.ваш-домен.ru --authkey hskey-auth-xxxxxxxxxxxx-xxxxxxxxПроверить регистрацию узла
sudo headscale nodes list
# ID | Hostname | Name | User | IP addresses | Ephemeral | Last seen | Online | Expired
# 1 | server1 | server1 | mynet | 100.64.0.1, fd7a::1/128 | false | 2026-02-05 ... | yes | noУзел подключён! Он получил адрес из диапазона 100.64.x.x. Проверить связь между узлами можно командой tailscale ping 100.64.0.X.
7. Подключение Windows, macOS, Android, iOS
На устройствах без командной строки есть два способа входа — через ключ (как выше) или через браузер с последующим подтверждением на Headscale.
- 1Установите официальный Tailscale-клиент с tailscale.com/download.
- 2Откройте Command Prompt или PowerShell от имени администратора.
- 3Выполните: tailscale login --login-server https://vpn.ваш-домен.ru
- 4Откроется браузер — скопируйте показанную команду и выполните её на сервере Headscale.
- 1Установите официальный Tailscale-клиент с tailscale.com/download.
- 2Зажмите Option и нажмите на иконку Tailscale в строке меню → Debug → Custom Login Server → Add Account.
- 3Введите: https://vpn.ваш-домен.ru и нажмите «Log in».
- 4Откроется браузер — скопируйте показанную команду и выполните её на сервере Headscale.
- 1Установите Tailscale из Google Play Store.
- 2Откройте Settings → Accounts → три точки → «Use an alternate server».
- 3Введите: https://vpn.ваш-домен.ru
- 4Завершите авторизацию, выполнив команду на сервере Headscale.
- 1Установите Tailscale из App Store.
- 2Нажмите иконку профиля → Log in → кнопку меню → «Use custom coordination server».
- 3Введите: https://vpn.ваш-домен.ru
- 4Завершите авторизацию, выполнив команду на сервере Headscale.
Подтвердить узел через Headscale CLI
При входе через браузер (без pre-auth ключа) Tailscale показывает команду вида:
sudo headscale nodes register --user mynet --key nodekey:xxxxxxxxxx8. Magic DNS: обращение по имени хоста
С включённым Magic DNS все узлы сети доступны по коротким именам — не нужно помнить IP-адреса. Headscale автоматически настраивает DNS-суффикс на всех подключённых устройствах.
Как именуются узлы
server1100.64.0.1server1.vpn.ваш-домен.ruserver2100.64.0.2server2.vpn.ваш-домен.rulaptop100.64.0.3laptop.vpn.ваш-домен.ru# Пинг соседнего сервера по короткому имени
ping server2
# SSH на другой VPS без пароля (если настроены ключи)
ssh user@server2
# Curl к приложению на другом сервере
curl http://server2:8080/api/healthTailscale полностью заменяет /etc/hosts
Больше не нужно прописывать IP-адреса серверов в /etc/hosts. При добавлении нового узла в сеть он сразу становится доступен по имени на всех остальных узлах — Magic DNS обновляется автоматически.
9. Несколько VPS в приватной сети
Основной сценарий для Headscale — объединить несколько серверов в приватную сеть без открытых портов. Вот типичная топология:
# Пример инфраструктуры
┌─────────────────────────────────────────────────┐
│ Headscale VPS │
│ vpn.ваш-домен.ru (публичный) │
│ только control plane — не узел сети │
└───────────────┬─────────────────────────────────┘
│ управление ключами (HTTPS/443)
┌────────┴────────┐
▼ ▼
┌────────────┐ ┌────────────┐
│ App VPS │◄──►│ DB VPS │
│ 100.64.0.2 │ │ 100.64.0.3 │
│ Нет откр. │ │ Нет откр. │
│ портов DB │ │ портов │
└────────────┘ └────────────┘
# Прямое WireGuard-соединение между App и DB VPS
# Трафик не идёт через Headscale VPS
Подключаем каждый VPS к Headscale с одним pre-auth ключом:
# Установить Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
# Подключиться к вашей Headscale
sudo tailscale up --login-server https://vpn.ваш-домен.ru --authkey hskey-auth-xxxxxxxxxxxx-xxxxxxxxТеперь серверы видят друг друга по адресам 100.64.x.x. PostgreSQL на DB VPS больше не нужно выставлять наружу — подключайтесь изнутри сети:
# На App VPS — подключение к базе данных на DB VPS
psql -h db-vps -U myuser -d mydb
# db-vps разрешается через Magic DNS в 100.64.0.3🔒 Нет открытых портов
PostgreSQL, Redis, внутренние API — закрыты снаружи. Доступны только внутри сети Headscale.
⚡ Минимальная задержка
Трафик идёт напрямую между серверами по WireGuard, не через Headscale VPS.
🔑 Автоматическая ротация ключей
WireGuard-ключи ротируются автоматически — не нужно следить вручную.
Полезные команды управления
# Список всех узлов
sudo headscale nodes list
# Список пользователей
sudo headscale users list
# Создать ещё один reusable ключ (для новых серверов)
sudo headscale preauthkeys create --user mynet --reusable --expiration 7d
# Список ключей (в v0.28 показывает все ключи глобально)
sudo headscale preauthkeys list
# Удалить узел из сети
sudo headscale nodes delete --id 3
# Статус на клиентском сервере
tailscale status10. Свой DERP-сервер (опционально)
DERP-relay используется когда два узла не могут установить прямое WireGuard-соединение (жёсткий NAT, файрвол, блокировка протокола). DERP оборачивает трафик в HTTPS на 443/TCP — это часто проходит там, где WireGuard детектится и блокируется (например, ТСПУ в РФ).
Когда нужен свой DERP
- Вы из РФ — публичные DERP Tailscale geo-blocked
- Между узлами в разных юрисдикциях — прямой WireGuard детектится DPI
- Нужна максимальная приватность — никакой Tailscale-инфраструктуры в цепочке
Шаг 1: установить derper
derper — официальная программа DERP-relay от Tailscale, написанная на Go. Установить можно через go install или скачать готовый бинарник. Нужен сервер с отдельным доменом (например, derp.ваш-домен.ru) — DERP требует валидный SSL.
# Установить Go (если нет)
sudo apt install -y golang-go
# Скомпилировать derper
go install tailscale.com/cmd/derper@latest
# Бинарник окажется в ~/go/bin/derper — переместите в /usr/local/bin
sudo install -m 755 ~/go/bin/derper /usr/local/bin/derper
derper --versionШаг 2: A-запись и systemd-сервис
Создайте A-запись derp.ваш-домен.ru→ IP сервера. derper сам получит SSL через Let's Encrypt при первом запуске (нужен открытый 80/tcp).
sudo tee /etc/systemd/system/derper.service << 'EOF'
[Unit]
Description=Tailscale DERP relay
After=network.target
[Service]
ExecStart=/usr/local/bin/derper -hostname derp.ваш-домен.ru -certmode letsencrypt -certdir /var/lib/derper
Restart=on-failure
RestartSec=5
DynamicUser=yes
StateDirectory=derper
[Install]
WantedBy=multi-user.target
EOF
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo systemctl daemon-reload
sudo systemctl enable --now derperШаг 3: подключить DERP к Headscale
Создайте /etc/headscale/derp.yaml с описанием вашего DERP:
regions:
900:
regionid: 900
regioncode: my-derp
regionname: My Private DERP
nodes:
- name: 900a
regionid: 900
hostname: derp.ваш-домен.ru
ipv4: IP_DERP_СЕРВЕРА
derpport: 443В /etc/headscale/config.yaml найдите блок derp: и добавьте свой файл:
derp:
urls:
- https://controlplane.tailscale.com/derpmap/default
paths:
- /etc/headscale/derp.yaml
auto_update_enabled: true
update_frequency: 24hПерезапустите Headscale — новый DERP появится в списке доступных узлам: sudo systemctl restart headscale. На клиенте проверить можно командой tailscale netcheck — ваш DERP появится в списке regions.
11. Headplane: веб-интерфейс для Headscale
Headscale из коробки управляется только через CLI. Если хочется веб-панель как у Tailscale.com — поставьте Headplane (github.com/tale/headplane), самый функциональный сторонний UI. Актуальная версия на май 2026 — 0.6.1.
Что умеет Headplane
- Управление узлами (переименовать, продлить срок, удалить, теги)
- Создание и отзыв pre-auth ключей
- Редактор ACL (правила доступа между узлами)
- OIDC SSO — вход через свой провайдер (Authentik, Keycloak)
- Web-SSH доступ к узлам прямо из браузера
- Просмотр Magic DNS-настроек
Установка через Docker
Самый простой способ — Docker контейнер рядом с Headscale. Headscale должен быть установлен и работать (см. разделы 3–5). Headplane берёт API-доступ к Headscale через локальный сокет.
version: "3"
services:
headplane:
image: ghcr.io/tale/headplane:0.6.1
container_name: headplane
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
volumes:
- /etc/headscale/config.yaml:/etc/headscale/config.yaml:ro
- /var/run/headscale/headscale.sock:/var/run/headscale/headscale.sock
- ./headplane-data:/var/lib/headplane
environment:
- HEADPLANE_SERVER_HOST=0.0.0.0
- HEADPLANE_SERVER_PORT=3000
- HEADPLANE_HEADSCALE_URL=https://vpn.ваш-домен.ru
- HEADPLANE_COOKIE_SECRET=сгенерируйте_случайную_строку_32_символаЗапустите и пробросьте через Nginx (по аналогии с разделом 5) на свой поддомен, например admin.ваш-домен.ru:
docker compose up -d
docker logs headplane
# Открыть в браузере (через Nginx с SSL)
# https://admin.ваш-домен.ruВажно: ограничьте доступ к веб-интерфейсу
Headplane даёт полный контроль над сетью. Защитите доступ: либо открывайте только из приватной Tailscale-сети (через Magic DNS — admin.vpn.ваш-домен.ru на 100.64.0.1), либо настройте OIDC SSO в самом Headplane.