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

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
  1. При запуске Tailscale на сервере происходит регистрация устройства в сети через серверы Tailscale Inc
  2. Компьютер пользователя получает от серверов Tailscale Inc метаданные о зарегистрированных устройствах
  3. На основе этих данных устанавливается прямое защищенное соединение между компьютером и сервером

Ключевой момент здесь в том, что серверы 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. Давайте начнем с создания основных конфигурационных файлов.

  1. Создайте файл 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
  1. Создайте конфигурационный файл для 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.

В итоге в панели управления можно увидеть все подключенные устройства.

Список узлов в headplane

Доступ к подключенным нодам можно получить по IP адресу или по домену, указанному в MagicDNS, например для подключения к ноде s-0 из других нод можно использовать s-0.myts.ru.

Заключение

За несколько месяцев использования этого решения я ни разу не пожалел о переходе с классического OpenVPN. Сеть работает стабильно, подключение новых устройств занимает считанные минуты, а всё управление доступно через удобный веб-интерфейс. Помню, как раньше каждое изменение в конфигурации сети превращалось в многочасовую битву с настройками — теперь это в прошлом.

Если вы, как и я, устали от сложностей с настройкой VPN и ищете современное решение — попробуйте Tailscale с Headscale. Это действительно тот редкий случай, когда технология работает "как магия", но при этом остается полностью в ваших руках. Больше никаких танцев с бубном вокруг роутера и бесконечных правок конфигурационных файлов.

В этой статье я описал лишь базовую настройку, которая позволит вам запустить и начать пользоваться сетью. Но возможности Tailscale и Headscale гораздо шире. Для тех, кто хочет углубиться в тему, рекомендую официальную документацию:

  • Headscale — полное руководство по настройке и администрированию вашего координационного сервера
  • Руководство по настройке Headscale — официальный гайд, который я взял за основу главы про настройку
  • Документация Tailscale — здесь вы найдете множество полезных советов по использованию клиента

Надеюсь, этот материал поможет вам построить свою собственную, удобную и надежную Mesh-сеть. Удачной настройки!

Egor Fadeev

Egor Fadeev

Обычно код пишу и в свободное время изучаю темы, связанные с программированием: от DevOps до умного дома
Russia