Webfactor VPN Network

Пълна документация за нашата self-hosted mesh VPN мрежа

Какво е Headscale?

Headscale е open-source, self-hosted имплементация на Tailscale координатора. Tailscale е mesh VPN базиран на WireGuard, който позволява на всички машини в мрежата да комуникират директно помежду си, без да минават през централен сървър.

Какво получаваме:

Tailscale vs Headscale

Tailscale (SaaS)Headscale (Self-hosted)
КоординаторTailscale сървъриНаш сървър (s13)
ДанниПри TailscaleПри нас
ЦенаFree до 100 устройстваБезплатно завинаги
КлиентЕдин и същ (tailscale)
WireGuardPeer-to-peer, идентично

Архитектура

Headscale (s13) https://head.webfactor.com Координатор / Control Plane | +-------+-------+-------+-------+ | | | | | s13 s14 laptop office phone .0.1 .0.2 .0.3 .0.4 .0.5 | | | | | +---<== WireGuard mesh ==>---+ Direct peer-to-peer tunnels

Важно: Координаторът (Headscale на s13) НЕ рутира трафик. Той само казва на машините как да се намерят една друга. След това комуникацията е директна (peer-to-peer) по WireGuard тунели. Ако s13 падне, вече свързаните машини продължават да работят помежду си.

DERP сървъри (relay)

Когато директна връзка не е възможна (тежък NAT), Tailscale използва DERP relay сървъри. Използваме Tailscale публичните DERP сървъри (има в Европа, САЩ и Азия). Данните са криптирани end-to-end, DERP сървърите не могат да ги четат.

Информация за мрежата

ПараметърСтойност
Координатор URLhttps://head.webfactor.com
Web UIhttps://headplane.s13.webfactor.com/admin/
Тази документацияhttps://vpn.s13.webfactor.com
Headscale версияv0.28.0
MagicDNS домейн*.webfactor.internal
IPv4 обхват100.64.0.0/10
IPv6 обхватfd7a:115c:a1e0::/48
Хост на координатораs13 (159.195.7.184)
Потребителadmin (ID: 1)
Headplane UI Уеб интерфейс за управление
VPN Portal Бързо присъединяване
join.sh Скрипт за автоматично присъединяване
Тази документация Пълна документация

Бързо присъединяване

Една команда:

curl -sL https://vpn.s13.webfactor.com/join.sh | sudo bash -s -- <hostname>

Скриптът автоматично:

  1. Открива OS-a
  2. Инсталира Tailscale клиента
  3. Пита за auth key
  4. Свързва машината към мрежата
  5. Оправя DNS (ако resolv.conf е заключен)

Генериране на auth key

Auth key се генерира на s13 (координатора). SSH до s13:

# Еднократен ключ (валиден 1 час)
docker exec headscale headscale preauthkeys create --user 1 --expiration 1h

# Многократен ключ (за няколко машини)
docker exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24h

# Ключ за ephemeral nodes (автоматично се махат при disconnect)
docker exec headscale headscale preauthkeys create --user 1 --ephemeral --expiration 1h

# Виж всички ключове
docker exec headscale headscale preauthkeys list --user 1
Съвет: За сигурност, генерирай еднократни ключове с кратка валидност. Многократните ключове са удобни когато добавяш няколко машини наведнъж.

Linux

Автоматично (с join.sh)

curl -sL https://vpn.s13.webfactor.com/join.sh | sudo bash -s -- my-server

Ръчно

1
Инсталирай Tailscale
# Debian / Ubuntu
curl -fsSL https://tailscale.com/install.sh | sh

# Fedora / CentOS / RHEL
curl -fsSL https://tailscale.com/install.sh | sh

# Arch Linux
sudo pacman -S tailscale

# Alpine
sudo apk add tailscale
2
Стартирай tailscaled
sudo systemctl enable --now tailscaled
3
Свържи се
sudo tailscale up \
    --login-server https://head.webfactor.com \
    --authkey <auth-key> \
    --hostname <hostname> \
    --accept-routes \
    --accept-dns
4
Провери
tailscale status
ping s13.webfactor.internal

macOS

CLI (препоръчително)

brew install tailscale
sudo tailscaled &
sudo tailscale up --login-server https://head.webfactor.com --authkey KEY --hostname my-mac

GUI App

  1. Инсталирай Tailscale от App Store
  2. Отвори приложението
  3. Отиди на Settings > Use an alternate server
  4. Въведи: https://head.webfactor.com
  5. Ще се отвори браузър за регистрация
Забележка: При GUI app не можеш да подадеш authkey директно. Ще трябва да одобриш машината ръчно от s13:
docker exec headscale headscale nodes list
docker exec headscale headscale nodes register --user 1 --key <nodekey:xxx>

Windows

1
Свали и инсталирай

Свали от tailscale.com/download/windows

2
Свържи се (от PowerShell като Administrator):
& "C:\Program Files\Tailscale\tailscale.exe" up --login-server https://head.webfactor.com --authkey KEY --hostname my-pc
Алтернативно: При стартиране на Tailscale GUI, в system tray-а кликни иконката > Use an alternate coordination server > въведи https://head.webfactor.com

iOS / Android

  1. Инсталирай Tailscale от App Store / Google Play
  2. Отвори приложението
  3. Натисни три точки (...) или Settings
  4. Намери "Use an alternate server" или "Custom coordination server"
  5. Въведи: https://head.webfactor.com
  6. Ще се отвори уеб страница - одобри регистрацията от s13

Docker контейнери

За да свържеш Docker контейнер към VPN мрежата:

# docker-compose.yml пример
services:
  my-app:
    image: my-app:latest
    network_mode: "service:tailscale"

  tailscale:
    image: tailscale/tailscale:latest
    hostname: my-app-ts
    environment:
      - TS_AUTHKEY=<auth-key>
      - TS_EXTRA_ARGS=--login-server=https://head.webfactor.com --hostname=my-app
      - TS_STATE_DIR=/var/lib/tailscale
    volumes:
      - ts-state:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - net_admin
      - sys_module
    restart: unless-stopped

volumes:
  ts-state:

Headplane Web UI

Достъп до Headplane:

  1. Отвори https://headplane.s13.webfactor.com/admin/
  2. Въведи API ключа при login
  3. Оттам можеш да управляваш: машини, маршрути, DNS, ACL

Headplane позволява:

CLI команди (на s13)

Машини (Nodes)

# Списък машини
docker exec headscale headscale nodes list

# Подробна информация за машина
docker exec headscale headscale nodes list -o json

# Изтрий машина
docker exec headscale headscale nodes delete --identifier <ID>

# Преименувай машина
docker exec headscale headscale nodes rename <ID> new-name

# Регистрирай машина ръчно (без auth key)
docker exec headscale headscale nodes register --user 1 --key nodekey:xxxx

# Expire (принуди ре-автентикация)
docker exec headscale headscale nodes expire --identifier <ID>

Auth ключове

# Създай еднократен ключ
docker exec headscale headscale preauthkeys create --user 1 --expiration 1h

# Създай многократен ключ
docker exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24h

# Списък ключове
docker exec headscale headscale preauthkeys list --user 1

API ключове

# Създай API ключ (за Headplane или API достъп)
docker exec headscale headscale apikeys create --expiration 9999d

# Списък API ключове
docker exec headscale headscale apikeys list

Потребители

# Списък потребители
docker exec headscale headscale users list

# Създай нов потребител
docker exec headscale headscale users create <name>

# Изтрий потребител
docker exec headscale headscale users destroy <ID>

# Преименувай
docker exec headscale headscale users rename <ID> new-name
Какво е "потребител"?

В Headscale, потребител (user) е група от машини. Всяка машина принадлежи на точно един потребител. По подразбиране машините на един потребител могат да комуникират помежду си. За комуникация между потребители, нужно е ACL правило.

ACL (Access Control)

ACL политиките определят коя машина с коя може да комуникира. Без ACL, всички машини на един потребител имат пълен достъп помежду си.

# Пример ACL политика (JSON)
{
  "acls": [
    {
      "action": "accept",
      "src": ["admin"],
      "dst": ["admin:*"]
    }
  ]
}

ACL може да се управлява от Headplane UI или чрез API.

Exit nodes и маршрути

Всяка машина може да обяви маршрути (routes) или да бъде exit node:

# Обяви маршрут (напр. цяла подмрежа)
sudo tailscale set --advertise-routes=192.168.1.0/24

# Направи машината exit node (целият трафик минава през нея)
sudo tailscale set --advertise-exit-node

# Одобри маршрут от s13
docker exec headscale headscale routes list
docker exec headscale headscale routes enable -r <route-id>

Как работи MagicDNS

MagicDNS позволява достъп до всяка машина по име вместо по IP адрес.

Формат на имената:

ФорматПримерЗабележка
<hostname>s13Кратко име (ако нямa конфликт)
<hostname>.webfactor.internals13.webfactor.internalПълно име (FQDN)
<hostname>.admin.webfactor.internals13.admin.webfactor.internalС потребител

DNS имена

# Провери DNS от всяка свързана машина
tailscale status                    # виж всички машини
ping s13.webfactor.internal         # пинг по пълно име
ping s13                            # пинг по кратко име
nslookup s13.webfactor.internal     # DNS lookup

Claude Code интеграция

Как да кажеш на Claude Code да добави машина към VPN:

Дай му следните инструкции:

# Стъпка 1: Инсталирай Tailscale
curl -fsSL https://tailscale.com/install.sh | sh
systemctl enable --now tailscaled

# Стъпка 2: Свържи се (замени AUTH_KEY и HOSTNAME)
tailscale up \
    --login-server https://head.webfactor.com \
    --authkey AUTH_KEY \
    --hostname HOSTNAME \
    --accept-routes --accept-dns

# Стъпка 3: Провери
tailscale status

Или просто му дай:

curl -sL https://vpn.s13.webfactor.com/join.sh | AUTHKEY=KEY bash -s -- HOSTNAME
Важно: Auth key-ът трябва да бъде генериран предварително на s13. Claude Code няма достъп до s13, освен ако не работи на самия s13.

Скриптове

join.sh

Автоматичен скрипт за присъединяване: /join.sh

# Интерактивен режим
curl -sL https://vpn.s13.webfactor.com/join.sh | sudo bash -s -- my-server

# С auth key като environment variable
curl -sL https://vpn.s13.webfactor.com/join.sh | sudo AUTHKEY=hskey-auth-xxx bash -s -- my-server

API

Headscale има REST API достъпно на https://head.webfactor.com/api/v1/

# Примерна заявка
API_KEY="hskey-api-xxx"

# Списък машини
curl -s -H "Authorization: Bearer $API_KEY" \
    https://head.webfactor.com/api/v1/node | python3 -m json.tool

# Списък потребители
curl -s -H "Authorization: Bearer $API_KEY" \
    https://head.webfactor.com/api/v1/user | python3 -m json.tool

# Създай preauthkey
curl -s -X POST -H "Authorization: Bearer $API_KEY" \
    -H "Content-Type: application/json" \
    -d '{"user":"1","reusable":true,"expiration":"2026-02-09T00:00:00Z"}' \
    https://head.webfactor.com/api/v1/preauthkey | python3 -m json.tool

Проблеми и решения

DNS не работи / resolv.conf е заключен

Често при VPS, /etc/resolv.conf има immutable флаг:

sudo chattr -i /etc/resolv.conf
sudo systemctl restart tailscaled
sudo tailscale up --login-server https://head.webfactor.com --accept-dns

Машината не може да се свърже

Машината е "offline" в списъка

Искам да сменя hostname

sudo tailscale set --hostname new-name

Искам да премахна машина от мрежата

# На самата машина:
sudo tailscale logout

# От s13 (изтрий напълно):
docker exec headscale headscale nodes delete --identifier <ID>

Логове

# Headscale логове
docker logs headscale --tail 50 -f

# Headplane логове
docker logs headplane --tail 50 -f

# Tailscale клиент логове (на всяка машина)
journalctl -u tailscaled -f

# Tailscale debug info
tailscale bugreport

Backup

# Backup на Headscale данни
cp -a /opt/apps/headscale /opt/apps/headscale-backup-$(date +%Y%m%d)

# Важни файлове за backup:
# /opt/apps/headscale/data/db.sqlite     - базата данни
# /opt/apps/headscale/data/noise_private.key - private key
# /opt/apps/headscale/config/config.yaml  - конфигурация

Обновяване

# 1. Backup
cp -a /opt/apps/headscale /opt/apps/headscale-backup-$(date +%Y%m%d)

# 2. Смени версията в docker-compose.yml
#    image: headscale/headscale:v0.28.0 -> v0.29.0

# 3. Pull и рестартирай
cd /opt/apps
docker compose pull headscale
docker compose up -d headscale

# 4. Провери
docker exec headscale headscale version
docker exec headscale headscale nodes list
Важно при ъпгрейд: Headscale не поддържа прескачане на версии. Ако трябва да ъпгрейднеш от много стара версия, минавай последователно през всяка minor версия (0.26 > 0.27 > 0.28 и т.н.).

Файлове и пътища (на s13)

ФайлОписание
/opt/apps/docker-compose.ymlDocker compose (headscale, headplane, vpn-portal)
/opt/apps/headscale/config/config.yamlHeadscale конфигурация
/opt/apps/headscale/data/Headscale данни (db, keys)
/opt/apps/headplane/config.yamlHeadplane конфигурация
/opt/apps/headscale/web/VPN портал (HTML + join.sh)
/opt/apps/headscale/join-network.shJoin скрипт (оригинал)

Портове

ПортУслугаДостъп
443 (HTTPS)NPM reverse proxyПубличен
80 (HTTP)NPM (redirect to HTTPS)Публичен
8080Headscale (вътрешен)Docker мрежа
3000Headplane (вътрешен)Docker мрежа
41641/UDPWireGuard (Tailscale)Публичен

Полезни команди

# === На всяка свързана машина ===
tailscale status                # статус и списък peers
tailscale ip                    # моят VPN IP
tailscale ping <host>           # пинг до друга машина
tailscale netcheck              # мрежова диагностика
tailscale whois <ip>            # кой е на този IP
tailscale set --hostname <name> # смени hostname
tailscale down                  # временно изключи VPN
tailscale up                    # включи обратно
tailscale logout                # напусни мрежата

# === На s13 (координатора) ===
docker exec headscale headscale nodes list          # всички машини
docker exec headscale headscale users list           # всички потребители
docker exec headscale headscale preauthkeys create --user 1 --expiration 1h  # нов auth key
docker exec headscale headscale routes list          # маршрути
docker logs headscale --tail 20                      # последни логове