Tailscale для домашней лаборатории

Введение
Привет, друзья! Знаете эту боль — когда ваши сервера разбросаны по всему миру, а вы пытаетесь свести их в одну сеть? У меня такая история тянулась годами. Чего только не перепробовал: и прямые подключения между серверами (когда везло и это вообще было возможно), и классический OpenVPN со всеми его причудами. Но каждое решение приносило свой букет проблем и головной боли при эксплуатации.
Долгое время я слышал о Mesh VPN как о чём-то загадочном и сложном, обходил эту технологию десятой дорогой. Но недавно открыл для себя Tailscale — решение настолько элегантное и простое, что теперь не могу поверить, как жил без него раньше. И сегодня хочу поделиться этим открытием с вами.
Что такое Tailscale и зачем он нужен?
Представьте себе сеть, где каждое устройство может быть одновременно и клиентом, и сервером — это и есть Mesh VPN, а Tailscale делает эту технологию доступной каждому. Он работает на любой платформе, будь то Windows, Linux или ваш смартфон, а в основе лежит сверхбыстрый протокол WireGuard.
Но главная магия Tailscale в том, как он соединяет устройства напрямую, минуя всех посредников. Представьте, что вместо того, чтобы отправлять письмо через десять почтовых отделений, вы просто протягиваете руку и передаёте его адресату. Именно так работает Tailscale, обеспечивая минимально возможные задержки между узлами сети. А подключить новое устройство? Две команды в консоли — и готово!
Звучит слишком хорошо, чтобы быть правдой? Поначалу я тоже так думал. Давайте разберём, как эта магия работает на самом деле.
Допустим, у вас есть сервер дома, рабочий ноутбук в офисе и пара серверов в разных дата-центрах. Обычно для их объединения пришлось бы настраивать VPN-сервер, пробрасывать порты на роутере, следить за сертификатами, как то генерировать клиентские конфигурации. Знакомая картина, правда?
Tailscale решает эти проблемы играючи: вы просто устанавливаете клиент на каждое устройство, авторизуетесь — и все устройства автоматически видят друг друга, словно находятся в одной локальной сети. При этом:
- Не нужно настраивать файрволы и пробрасывать порты
- Соединение устанавливается автоматически, даже если устройства находятся за NAT — ох какой же это был кайф, когда я увидел что оно отлично работает, о DERP немного ниже
- Вы можете легко управлять доступом между устройствами через простой веб-интерфейс
Самое интересное начинается, когда вы запускаете на одном из устройств, например, веб-сервер. В обычной ситуации пришлось бы настраивать реверс-прокси, SSL-сертификаты, думать о безопасности внешнего доступа. С Tailscale же сервер автоматически получает внутренний IP-адрес, и вы можете обращаться к нему напрямую из любой точки мира, причём делать это безопасно — весь трафик идет по частному туннелю через VPN.
А что если прямое соединение между устройствами невозможно? Tailscale предусмотрел и это — в таких случаях подключение происходит через DERP (Designated Encrypted Relay for Packets) серверы. Это своего рода "запасной путь", который автоматически включается, когда прямое соединение установить не удается. Работает это так: если одно устройство не может напрямую достучаться до другого (например, из-за особо строгих настроек файрвола), то Tailscale находит "посредника" — другой узел вашей сети, который может связаться с обоими устройствами. Этот узел становится временным DERP-сервером, передавая зашифрованный трафик между устройствами. Для вас всё происходит совершенно прозрачно — вы просто работаете с сетью, а Tailscale сам разбирается, как лучше доставить данные.
Но есть один нюанс: по умолчанию Tailscale использует централизованный координационный сервер (control server) компании Tailscale Inc. Для многих это не проблема — сервер видит только метаданные и не имеет доступа к вашему трафику. Однако Tailscale Inc ограничивает использование своей технологии в разных странах мира, что является блокером к использованию для меня, поэтому дальше расскажу про решение этой проблемы.
Headscale — ваш собственный координатор сети
Прежде чем говорить о Headscale, давайте разберемся, почему он вообще нужен. По умолчанию Tailscale использует централизованный координационный сервер компании Tailscale Inc. Для многих пользователей это не проблема — сервер видит только метаданные и не имеет доступа к вашему трафику. Однако есть существенный нюанс: Tailscale Inc ограничивает использование своей технологии в разных странах мира, что для многих, включая меня, является серьезным препятствием. К счастью, есть элегантное решение.
Но сначала давайте разберем, как работает Tailscale "под капотом". Представим типичный сценарий: мы хотим соединить сервер и компьютер пользователя. Вот что происходит:

- При запуске Tailscale на сервере происходит регистрация устройства в сети через серверы Tailscale Inc
- Компьютер пользователя получает от серверов Tailscale Inc метаданные о зарегистрированных устройствах
- На основе этих данных устанавливается прямое защищенное соединение между компьютером и сервером
Ключевой момент здесь в том, что серверы Tailscale Inc выступают только как координаторы сети — своего рода "справочное бюро", которое помогает устройствам найти друг друга. При этом сам трафик между устройствами идет напрямую, минуя серверы Tailscale Inc.
И тут на сцену выходит Headscale — open source проект, позволяющий развернуть собственный координационный сервер. Его создание мы обязаны двум талантливым разработчикам: Кристофферу Дэлби из Tailscale и Хуану Фонту. Они реализовали полноценную альтернативу координационному серверу Tailscale Inc, поддерживающую большую часть необходимых функции для организации собственной сети.
Практическое руководство
Установка и настройка Headscale
Прежде чем мы начнем, давайте убедимся, что у нас есть все необходимое:
- Сервер с выделенным IP-адресом
- Docker и Docker Compose v2
- Домен или поддомен для Headscale и панели управления
- Базовые знания работы с командной строкой
Наша цель - развернуть три компонента, которые вместе создадут полноценный координационный центр для вашей Mesh-сети:
- Headscale - сам координационный сервер
- Headplane - удобную веб-панель управления сетью
- Caddy - reverse proxy для безопасного доступа по HTTPS
Для удобства использования мы развернем всю инфраструктуру с помощью Docker Compose. Давайте начнем с создания основных конфигурационных файлов.
- Создайте файл
docker-compose.yml
:
version: '3.8'
services:
headscale:
image: ghcr.io/juanfont/headscale:0.23
restart: unless-stopped
container_name: headscale
ports:
- 4444
- 9090
volumes:
- ./data:/etc/headscale
- ./var_headscale:/var/lib/headscale
command: serve
networks:
- external_network
headplane:
container_name: headplane
image: ghcr.io/tale/headplane:0.3.9
restart: unless-stopped
volumes:
- ./var_headscale:/var/lib/headscale
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock:ro
ports:
- 3000
environment:
HEADSCALE_URL: https://example.server.ru # замените на ваш домен
HEADSCALE_INTEGRATION: docker
HEADSCALE_CONTAINER: headscale
DISABLE_API_KEY_LOGIN: "true"
COOKIE_SECRET: "fillwithrandomstring" # замените на случайную строку
HOST: 0.0.0.0
PORT: "3000"
ROOT_API_KEY: abcdefghijklmnopqrstuvwxyz # замените на случайный ключ
networks:
- external_network
networks:
external_network:
external: true
- Создайте конфигурационный файл для Headscale
data/config.yaml
:
---
# Базовые настройки сервера
server_url: https://example.server.ru:443 # замените на ваш домен
listen_addr: 0.0.0.0:4444
# Настройки метрик и управления
metrics_listen_addr: 127.0.0.1:9090
grpc_listen_addr: 127.0.0.1:50443
grpc_allow_insecure: false
noise:
private_key_path: /var/lib/headscale/noise_private.key
# Настройки сети
prefixes:
v6: fd7a:115c:a1e0::/48 # изменить нельзя
v4: 100.64.0.0/10 # изменить нельзя
allocation: sequential # можно изменить на random
# DERP настройки (отключены для простоты)
derp:
server:
enabled: false
region_id: 999
region_code: "headscale"
region_name: "Headscale Embedded DERP"
stun_listen_addr: "0.0.0.0:3478"
private_key_path: /var/lib/headscale/derp_server_private.key
automatically_add_embedded_derp_region: true
ipv4: 1.2.3.4
ipv6: 2001:db8::1
urls:
- https://controlplane.tailscale.com/derpmap/default
paths: []
auto_update_enabled: true
update_frequency: 24h
database:
type: sqlite
debug: false
gorm:
prepare_stmt: true
parameterized_queries: true
skip_err_record_not_found: true
slow_threshold: 1000
sqlite:
path: /var/lib/headscale/db.sqlite
write_ahead_log: true
log:
format: text
level: info
policy:
mode: file
path: ""
dns:
magic_dns: true
# Указываем свой домен для MagicDNS, важно: он не должен быть такой же как в server_url
base_domain: myts.ru
nameservers:
global:
- 1.1.1.1
- 1.0.0.1
- 2606:4700:4700::1111
- 2606:4700:4700::1001
search_domains: []
# Тут можно указать дополнительные домены для ноды
extra_records: []
unix_socket: /var/run/headscale/headscale.sock
unix_socket_permission: "0770"
logtail:
enabled: false
randomize_client_port: false
Установить Caddy можно по официальной инструкции тут. Важно: не забудьте объединить контейнеры Caddy и Headscale/Headplane в единую сеть external_network
. Пример конфигурации Caddy:
# Совпадает со значением server_url в конфиге
example.server.ru {
reverse_proxy http://headscale:4444 {
transport http {
compression off # Поддержка WebSocket
}
}
tls {
issuer acme
}
}
# Домен для панели управления
headplane.server.ru {
reverse_proxy http://headplane:3000 {
transport http {
compression off
}
}
tls {
issuer acme
}
}
Важно: Перед запуском убедитесь, что:
- Вы заменили все доменные имена на свои
- Сгенерировали случайные значения для
COOKIE_SECRET
иROOT_API_KEY
- Настроили DNS-записи для ваших доменов, указав их на IP-адрес сервера
- Объединили все контейнеры в сеть
external_network
На этом можно считать Headscale настроенным, чтобы проверить, что все работает корректно можно зайти в панель управления Headplane по адресу, который вы настроили в Caddy, для демо конфига это будет https://headplane.server.ru/admin
. Там увидим приветственное сообщение и просьбу указать API ключ.

При первом входе потребуется API-ключ, который можно получить командой:
docker exec headscale headscale apikeys create
Установка клиента Tailscale
Установка клиента Tailscale проста и доступна для всех популярных платформ. В большинстве случаев достаточно следовать официальной инструкции. Однако если вы сталкиваетесь с ограничениями доступа к официальным репозиториям Tailscale, пройдите по более сложному пути получения пакетов.
Стандартная установка
Для Linux систем обычно достаточно выполнить несколько команд из официальной документации. После установки подключение к вашему Headscale выполняется командой:
sudo tailscale up --login-server=https://example.server.ru
После выполнения команды откроется ссылка, где нужно будет скопировать ключ авторизации и вставить его в панели управления Headplane.
Установка при ограниченном доступе
Если у вас нет прямого доступа к репозиториям Tailscale, можно использовать HTTP прокси. Вот пошаговая инструкция:
- Настройте HTTP прокси-сервер (например, можно использовать Wireproxy с сервером в доступном регионе или найти в интернете)
- Скачайте скрипт установки через прокси:
curl --proxy http://your-proxy:port https://tailscale.com/install.sh > install.sh
- Модифицируйте скрипт установки:
export http_proxy="http://your-proxy:port"
- Если запросы curl все еще не проходят найдите строку
CURL="curl -fsSL"
и измените её на:
CURL="curl -fsSL --proxy http://your-proxy:port"
- Запустите модифицированный скрипт:
sudo bash install.sh
Подключение на разных платформах
- Linux: Используйте команду с флагом
--login-server
, как показано в разделе со стандартной установкой - Windows/macOS: В графическом интерфейсе откройте настройки и укажите адрес вашего Headscale сервера
- Android/iOS: В настройках приложения найдите опцию "Custom server" и введите адрес вашего сервера
Важно: Всегда используйте полный URL вашего Headscale сервера, включая протокол https://
.
Как видите, даже при наличии ограничений, установка клиента остается относительно простой задачей. После подключения первого устройства вы можете проверить его статус в панели управления Headplane.
В итоге в панели управления можно увидеть все подключенные устройства.

Доступ к подключенным нодам можно получить по IP адресу или по домену, указанному в MagicDNS, например для подключения к ноде s-0
из других нод можно использовать s-0.myts.ru
.
Заключение
За несколько месяцев использования этого решения я ни разу не пожалел о переходе с классического OpenVPN. Сеть работает стабильно, подключение новых устройств занимает считанные минуты, а всё управление доступно через удобный веб-интерфейс. Помню, как раньше каждое изменение в конфигурации сети превращалось в многочасовую битву с настройками — теперь это в прошлом.
Если вы, как и я, устали от сложностей с настройкой VPN и ищете современное решение — попробуйте Tailscale с Headscale. Это действительно тот редкий случай, когда технология работает "как магия", но при этом остается полностью в ваших руках. Больше никаких танцев с бубном вокруг роутера и бесконечных правок конфигурационных файлов.
В этой статье я описал лишь базовую настройку, которая позволит вам запустить и начать пользоваться сетью. Но возможности Tailscale и Headscale гораздо шире. Для тех, кто хочет углубиться в тему, рекомендую официальную документацию:
- Headscale — полное руководство по настройке и администрированию вашего координационного сервера
- Руководство по настройке Headscale — официальный гайд, который я взял за основу главы про настройку
- Документация Tailscale — здесь вы найдете множество полезных советов по использованию клиента
Надеюсь, этот материал поможет вам построить свою собственную, удобную и надежную Mesh-сеть. Удачной настройки!