Webfactor VPN Network
Пълна документация за нашата self-hosted mesh VPN мрежа
Какво е Headscale?
Headscale е open-source, self-hosted имплементация на Tailscale координатора. Tailscale е mesh VPN базиран на WireGuard, който позволява на всички машини в мрежата да комуникират директно помежду си, без да минават през централен сървър.
Какво получаваме:
- Mesh VPN - всяка машина се свързва директно с всяка друга (peer-to-peer)
- WireGuard криптиране - бърз, модерен VPN протокол
- MagicDNS - всяка машина е достъпна по име (
s13.webfactor.internal) - NAT traversal - работи дори зад NAT и firewall
- Zero config - няма нужда от конфигурация на всяка машина поотделно
- Self-hosted - данните са при нас, не при Tailscale
Tailscale vs Headscale
| Tailscale (SaaS) | Headscale (Self-hosted) | |
|---|---|---|
| Координатор | Tailscale сървъри | Наш сървър (s13) |
| Данни | При Tailscale | При нас |
| Цена | Free до 100 устройства | Безплатно завинаги |
| Клиент | Един и същ (tailscale) | |
| WireGuard | Peer-to-peer, идентично | |
Архитектура
Важно: Координаторът (Headscale на s13) НЕ рутира трафик. Той само казва на машините как да се намерят една друга. След това комуникацията е директна (peer-to-peer) по WireGuard тунели. Ако s13 падне, вече свързаните машини продължават да работят помежду си.
DERP сървъри (relay)
Когато директна връзка не е възможна (тежък NAT), Tailscale използва DERP relay сървъри. Използваме Tailscale публичните DERP сървъри (има в Европа, САЩ и Азия). Данните са криптирани end-to-end, DERP сървърите не могат да ги четат.
Информация за мрежата
| Параметър | Стойност |
|---|---|
| Координатор URL | https://head.webfactor.com |
| Web UI | https://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>
Скриптът автоматично:
- Открива OS-a
- Инсталира Tailscale клиента
- Пита за auth key
- Свързва машината към мрежата
- Оправя 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
Ръчно
# 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
sudo systemctl enable --now tailscaled
sudo tailscale up \
--login-server https://head.webfactor.com \
--authkey <auth-key> \
--hostname <hostname> \
--accept-routes \
--accept-dns
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
- Инсталирай Tailscale от App Store
- Отвори приложението
- Отиди на Settings > Use an alternate server
- Въведи:
https://head.webfactor.com - Ще се отвори браузър за регистрация
docker exec headscale headscale nodes list
docker exec headscale headscale nodes register --user 1 --key <nodekey:xxx>
Windows
Свали от tailscale.com/download/windows
& "C:\Program Files\Tailscale\tailscale.exe" up --login-server https://head.webfactor.com --authkey KEY --hostname my-pc
https://head.webfactor.com
iOS / Android
- Инсталирай Tailscale от App Store / Google Play
- Отвори приложението
- Натисни три точки (...) или Settings
- Намери "Use an alternate server" или "Custom coordination server"
- Въведи:
https://head.webfactor.com - Ще се отвори уеб страница - одобри регистрацията от 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:
- Отвори https://headplane.s13.webfactor.com/admin/
- Въведи API ключа при login
- Оттам можеш да управляваш: машини, маршрути, DNS, ACL
Headplane позволява:
- Преглед на всички свързани машини и техния статус
- Преименуване и изтриване на машини
- Управление на маршрути (routes)
- Настройка на DNS записи
- Редактиране на ACL политики
- Рестартиране на Headscale
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.internal | s13.webfactor.internal | Пълно име (FQDN) |
<hostname>.admin.webfactor.internal | s13.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
Скриптове
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
Машината не може да се свърже
- Auth key изтекъл? Генерирай нов.
- Firewall? Tailscale ползва UDP 41641 (WireGuard) и HTTPS 443 (координатор).
tailscale netcheck- мрежова диагностикаjournalctl -u tailscaled -f- логове
Машината е "offline" в списъка
- Провери дали
tailscaledе стартиран:systemctl status tailscaled - Провери дали е свързан:
tailscale status - Рестартирай:
sudo systemctl restart tailscaled
Искам да сменя 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
Файлове и пътища (на s13)
| Файл | Описание |
|---|---|
/opt/apps/docker-compose.yml | Docker compose (headscale, headplane, vpn-portal) |
/opt/apps/headscale/config/config.yaml | Headscale конфигурация |
/opt/apps/headscale/data/ | Headscale данни (db, keys) |
/opt/apps/headplane/config.yaml | Headplane конфигурация |
/opt/apps/headscale/web/ | VPN портал (HTML + join.sh) |
/opt/apps/headscale/join-network.sh | Join скрипт (оригинал) |
Портове
| Порт | Услуга | Достъп |
|---|---|---|
| 443 (HTTPS) | NPM reverse proxy | Публичен |
| 80 (HTTP) | NPM (redirect to HTTPS) | Публичен |
| 8080 | Headscale (вътрешен) | Docker мрежа |
| 3000 | Headplane (вътрешен) | Docker мрежа |
| 41641/UDP | WireGuard (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 # последни логове