bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

NetBird на своём сервере: mesh-VPN как Tailscale без облака

calendar_month Sep 13, 2026 schedule 21 мин. чтения visibility 11 просмотров
NetBird на своём сервере: mesh-VPN как Tailscale без облака
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

NetBird на своём сервере: mesh-VPN как Tailscale без облака

TL;DR

NetBird позволяет развернуть собственную mesh-VPN-сеть на VPS: устройства получают защищённые WireGuard-туннели, видят друг друга по приватным IP-адресам и управляются через единый сервер без зависимости от публичного SaaS-аккаунта.

  • Для небольшой команды достаточно VPS с 2 vCPU, 4 ГБ RAM, 40 ГБ SSD и публичным IPv4.
  • NetBird использует WireGuard для передачи трафика, а management-сервер координирует участников, группы, маршруты и политики доступа.
  • Самый практичный способ self-hosted установки в 2026 году — официальный Docker Compose-стек с PostgreSQL, coturn, Signal и веб-панелью.
  • Для работы через NAT важно открыть UDP-порты WireGuard и TURN, а для панели управления нужен HTTPS-сертификат.
  • Бэкапировать необходимо PostgreSQL, файл окружения, Docker Compose-конфигурацию и ключи/секреты identity provider.
  • После установки можно подключить Linux, macOS, Windows, Android, iOS и настроить private DNS, exit node, site-to-site routing и ACL-политики.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

NetBird — это self-hosted платформа для построения mesh-VPN. По назначению она близка к Tailscale, ZeroTier и Headscale: вы устанавливаете агент на серверы, ноутбуки и другие устройства, авторизуете их в одной сети и получаете защищённую связность между участниками.

В основе передачи данных лежит WireGuard. Это означает, что пользовательский трафик по возможности идёт напрямую между двумя узлами. Центральный сервер NetBird не обязан проксировать каждый пакет: он хранит состояние сети, выдаёт конфигурации peer-узлам, применяет ACL-политики, помогает с обнаружением участников и предоставляет административную панель.

Если прямое соединение невозможно из-за CGNAT, симметричного NAT или корпоративного firewall, NetBird может передать трафик через TURN-релей. В self-hosted схеме таким релеем обычно выступает coturn, запущенный на том же VPS. Это не отменяет шифрование WireGuard: TURN видит транспортный поток, но не расшифровывает VPN-трафик.

Что получится после выполнения инструкции

В результате вы получите домен вида netbird.example.com с HTTPS-панелью управления. В панели можно приглашать пользователей, создавать setup keys для серверов без интерактивного входа, объединять peers в группы, добавлять маршруты в локальные подсети и ограничивать доступ правилами.

Каждое подключённое устройство получит адрес из внутренней сети NetBird, например 100.64.0.0/10 или выбранного вами диапазона. Вы сможете подключаться к приватным сервисам по SSH, открывать внутренние базы данных, связывать несколько VPS, давать разработчикам доступ только к staging-инфраструктуре или публиковать домашнюю сеть без проброса портов на каждом устройстве.

Почему не просто WireGuard

Обычный WireGuard отлично подходит для схемы «клиент — сервер», но начинает требовать ручного администрирования при десятках узлов. Нужно создавать ключи, добавлять peer-блоки в конфиг всех машин, согласовывать AllowedIPs, обновлять файлы при отзыве устройства и решать проблемы NAT.

NetBird автоматизирует эту работу. Администратор управляет логическими объектами: пользователями, группами, маршрутами и политиками. Агент сам получает актуальную конфигурацию. При удалении ноутбука из сети его ключ перестаёт получать рабочую конфигурацию, а при добавлении нового сервера не нужно вручную редактировать конфиг на всех старых узлах.

Cloud-managed и self-hosted: что выбрать

Критерий Облачный сервис NetBird на своём VPS
Старт Быстрее: регистрация и установка агента Нужны домен, VPS, TLS и обслуживание
Контроль метаданных Часть control plane находится у поставщика База, логи и identity provider находятся у вас
Гибкость Ограничена тарифом и настройками платформы Можно менять домены, бэкапы, SSO и сетевую схему
Эксплуатация Обновления и отказоустойчивость ведёт сервис Ответственность за обновления и резервные копии на владельце
Стоимость Может расти вместе с числом пользователей Предсказуемая стоимость сервера и хранилища бэкапов

Self-hosted NetBird имеет смысл, когда важны независимость от внешней учётной записи, контроль над метаданными сети, собственная политика хранения данных или интеграция с корпоративным SSO. Для команды из нескольких человек это также хороший способ изучить современную mesh-VPN-архитектуру без ручного сопровождения десятков WireGuard-конфигов.

NetBird не делает VPS невидимым для интернета автоматически. Публичные сервисы всё равно нужно защищать firewall, обновлениями, сильными паролями и отдельными ACL. Mesh-VPN следует рассматривать как слой защищённой связности, а не как замену базовой безопасности сервера.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Нагрузка NetBird зависит не столько от числа зарегистрированных peers, сколько от количества активных релейных соединений через TURN. Если устройства соединяются напрямую, VPS в основном обслуживает веб-панель, API, PostgreSQL и сигнализацию. Если многие клиенты постоянно работают за сложным NAT, coturn может потреблять заметный трафик и CPU.

Сценарий CPU RAM Диск Сеть
Тестовая сеть до 10 устройств 1 vCPU 2 ГБ 25 ГБ SSD 100 Мбит/с, публичный IPv4
Команда 10–50 устройств 2 vCPU 4 ГБ 40–60 ГБ NVMe/SSD 1 Гбит/с, IPv4, 2–5 ТБ трафика
50–200 устройств или активный TURN 4 vCPU 8 ГБ 80 ГБ NVMe 1 Гбит/с, высокий либо безлимитный трафик
Несколько сотен устройств, много relay-трафика 8 vCPU 16 ГБ 160 ГБ NVMe 1–10 Гбит/с, отдельный TURN-сервер

Для большинства личных инфраструктур и небольших команд практичный стартовый вариант — 2 vCPU, 4 ГБ RAM, 50 ГБ NVMe, выделенный IPv4 и порт 1 Гбит/с. Например, можно взять VPS с указанными характеристиками, установить Ubuntu Server 24.04 LTS и оставить запас памяти для PostgreSQL, Docker и будущего мониторинга.

Почему нужен публичный IPv4

Публичный IPv4 упрощает работу TURN и доступ к management-панели. IPv6 полезен, но не заменяет IPv4: часть мобильных и домашних провайдеров всё ещё работает через IPv4 NAT, а некоторые клиенты могут не иметь полноценной IPv6-связности. В идеале сервер должен иметь оба адреса.

Проверьте, разрешает ли провайдер входящий UDP-трафик. Для работы NetBird обычно нужны UDP-порты WireGuard и TURN. Если UDP фильтруется на уровне площадки, часть клиентов будет подключаться нестабильно или вообще не сможет использовать relay.

Когда нужен dedicated, а не VPS

Dedicated-сервер оправдан не из-за самого control plane, а из-за сетевой нагрузки и требований к изоляции. Он полезен, если TURN регулярно передаёт сотни мегабит в секунду, сеть используется как шлюз для большого числа сотрудников, требуется гарантированная производительность CPU или политика безопасности запрещает shared-virtualization.

Для 5–100 peers dedicated обычно не нужен. Гораздо эффективнее начать с VPS, включить мониторинг нагрузки и отдельно вынести coturn на второй VPS, если relay-трафик стал узким местом. Такое разделение легче масштабировать и обслуживать, чем преждевременная миграция на крупный сервер.

Как выбрать локацию

Локация влияет прежде всего на задержку до control plane и TURN-релея. Прямые WireGuard-соединения между peers не обязаны проходить через VPS, поэтому два клиента из одного города будут обмениваться данными с низкой задержкой независимо от страны control plane. Однако при relay-соединении весь трафик пойдёт через TURN.

Размещайте VPS ближе к большинству пользователей или к критичным сетям. Если команда распределена между Европой и Азией, выберите нейтральную точку для панели и при необходимости добавьте второй TURN-релей в другом регионе. Для доступа к домашнему серверу выбирайте локацию с хорошим маршрутом до домашнего ISP, а не только минимальной ценой.

Подготовка сервера

Схема: Подготовка сервера
Схема: Подготовка сервера

Инструкция рассчитана на чистый сервер с Ubuntu Server 24.04 LTS x86_64. Эта версия имеет длительный срок поддержки, современное ядро и стабильные пакеты Docker. Перед началом создайте DNS-запись типа A: netbird.example.com должна указывать на публичный IPv4 VPS. Если используется IPv6, добавьте также AAAA-запись.

Не устанавливайте NetBird от имени root напрямую. Создайте отдельного администратора, добавьте SSH-ключ и только после проверки отключайте парольный вход. Оставьте текущую root-сессию открытой до того момента, когда убедитесь, что вход новым пользователем работает.

Обновление операционной системы

Подключитесь к серверу через SSH и установите актуальные обновления. Команда обновляет индекс пакетов, применяет патчи безопасности и перезагружает сервер только при необходимости.

sudo apt update && sudo apt full-upgrade -y
sudo reboot

После перезагрузки подключитесь снова и проверьте версию системы.

cat /etc/os-release
uname -r

Создание пользователя и настройка SSH

Замените vpnadmin на собственное имя пользователя. На рабочем компьютере предварительно создайте ключ командой ssh-keygen -t ed25519, если его ещё нет.

sudo adduser vpnadmin
sudo usermod -aG sudo vpnadmin
sudo install -d -m 700 -o vpnadmin -g vpnadmin /home/vpnadmin/.ssh

Скопируйте публичный ключ в файл authorized_keys. Вставьте одну строку, начинающуюся с ssh-ed25519, вместо примера.

sudo nano /home/vpnadmin/.ssh/authorized_keys
sudo chown vpnadmin:vpnadmin /home/vpnadmin/.ssh/authorized_keys
sudo chmod 600 /home/vpnadmin/.ssh/authorized_keys

Откройте второе окно терминала и проверьте вход: ssh vpnadmin@SERVER_IP. Только после успешной проверки изменяйте настройки SSH-демона.

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

Добавьте или измените следующие параметры. Если вы меняете порт SSH, не забудьте открыть его в firewall до перезапуска сервиса.

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
AllowUsers vpnadmin
sudo sshd -t
sudo systemctl restart ssh

Базовые утилиты, firewall и fail2ban

Установите инструменты диагностики, firewall и защиту от перебора SSH-паролей. Даже при отключённой парольной аутентификации fail2ban полезен для снижения шума в логах и блокировки подозрительных источников.

sudo apt install -y ca-certificates curl gnupg git jq vim \
  ufw fail2ban unattended-upgrades dnsutils htop

Откройте только необходимые порты. В этом примере SSH работает на стандартном TCP 22, веб-панель использует 80 и 443, WireGuard NetBird использует UDP 51820, а coturn — UDP/TCP 3478 и диапазон relay-портов UDP 49152–49200. Узкий диапазон упрощает firewall, но ограничивает число одновременных relay-сессий; для небольшой команды он достаточен.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP ACME'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw allow 51820/udp comment 'NetBird WireGuard'
sudo ufw allow 3478/tcp comment 'TURN TCP'
sudo ufw allow 3478/udp comment 'TURN UDP'
sudo ufw allow 49152:49200/udp comment 'TURN relay range'
sudo ufw enable
sudo ufw status verbose

Создайте минимальную конфигурацию fail2ban. Значение bantime равно одному часу, а после пяти неудачных попыток адрес будет временно заблокирован.

sudo tee /etc/fail2ban/jail.d/sshd.local > /dev/null <<'EOF'
[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
EOF

sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Также включите автоматические security-обновления Ubuntu. Docker-образы автоматически обновлять не следует: их лучше обновлять вручную в запланированное окно, после резервного копирования и проверки release notes.

sudo dpkg-reconfigure --priority=low unattended-upgrades
sudo systemctl status unattended-upgrades --no-pager

Установка ПО — пошагово

Схема: Установка ПО — пошагово
Схема: Установка ПО — пошагово

В 2026 году удобнее всего развернуть self-hosted NetBird через официальный Docker Compose-пакет. Он устанавливает согласованный набор контейнеров: management, signal, dashboard, PostgreSQL, coturn и identity provider. Не собирайте образы из случайных сторонних репозиториев: control plane содержит ключи, токены и данные о вашей внутренней сети.

Перед запуском проверьте актуальную стабильную версию в официальном GitHub release NetBird. В командах ниже используется официальный установочный скрипт getting-started.sh, который скачивает актуальный релизный стек. Это безопаснее, чем фиксировать номер версии, который мог устареть к моменту чтения статьи.

Установка Docker Engine

Сначала удалите старые конфликтующие пакеты Docker, если они были установлены из репозитория Ubuntu. Команда не удаляет ваши данные Docker в /var/lib/docker, но на новом сервере их обычно нет.

sudo apt remove -y docker.io docker-compose docker-compose-v2 \
  docker-doc podman-docker containerd runc 2>/dev/null || true

Добавьте официальный GPG-ключ и репозиторий Docker для Ubuntu 24.04.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
  sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Установите Docker Engine и Compose plugin. На начало 2026 года используйте актуальную стабильную ветку Docker Engine из официального репозитория; проверка ниже покажет фактически установленную версию.

sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
  docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
docker version
docker compose version

Разрешите пользователю vpnadmin запускать Docker без sudo. После добавления в группу выйдите из SSH-сеанса и войдите снова, иначе группа не применится.

sudo usermod -aG docker vpnadmin
exit

После повторного входа выполните тест. Контейнер должен вывести строку приветствия и завершиться без ошибки прав доступа.

docker run --rm hello-world

Получение официального self-hosted пакета

Создайте каталог для инфраструктурных файлов. Не используйте /tmp: он может очищаться системой. Каталог /opt/netbird удобен для сервисов, но владельцем сделаем администратора, чтобы не работать от root.

sudo install -d -m 750 -o vpnadmin -g vpnadmin /opt/netbird
cd /opt/netbird

Задайте полное доменное имя. Оно должно уже резолвиться в IP-адрес VPS, иначе автоматическое получение TLS-сертификата через Let's Encrypt не сработает.

export NETBIRD_DOMAIN="netbird.example.com"
getent ahostsv4 "$NETBIRD_DOMAIN"

Скачайте официальный installer из latest release и сначала просмотрите первые строки скрипта. Проверка перед запуском особенно важна для скриптов, которые получают права на запуск Docker-контейнеров.

curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh \
  -o getting-started.sh
less getting-started.sh
chmod 700 getting-started.sh

Запустите скрипт с переменной домена. Официальный bootstrap создаёт Compose-конфигурацию, файл окружения и стартовые настройки self-hosted NetBird. Если upstream installer запросит параметры identity provider или email для ACME, укажите рабочий адрес и сохраните все выданные секреты в защищённом password manager.

NETBIRD_DOMAIN="$NETBIRD_DOMAIN" ./getting-started.sh

После завершения установки проверьте, какие файлы были созданы. Названия могут немного отличаться между версиями NetBird, поэтому ориентируйтесь на фактический вывод скрипта, а не создавайте второй Compose-стек вручную.

cd /opt/netbird
find . -maxdepth 2 -type f | sort
docker compose ps

Проверка контейнеров и журналов

Все критичные контейнеры должны быть в состоянии running или healthy. Первое получение TLS-сертификата может занять одну-две минуты. Если контейнеры перезапускаются, сразу смотрите логи, а не пытайтесь многократно выполнять установку поверх существующей конфигурации.

docker compose ps
docker compose logs --tail=100
docker compose logs --tail=100 management
docker compose logs --tail=100 coturn

Проверьте доступность HTTPS. Флаг -I запрашивает только HTTP-заголовки. Ответ 200, 302 или 307 обычно означает, что reverse proxy и dashboard доступны.

curl -I https://netbird.example.com
curl -fsS https://netbird.example.com/ > /dev/null && echo "HTTPS OK"

Конфигурация

Схема: Конфигурация
Схема: Конфигурация

После bootstrap не спешите подключать все серверы. Сначала зафиксируйте конфигурацию, убедитесь в наличии TLS и создайте отдельную административную учётную запись. В зависимости от версии self-hosted пакета NetBird экран входа может использовать встроенный Zitadel либо внешний OpenID Connect provider. Логика одинакова: identity provider отвечает за аутентификацию, а NetBird management отвечает за peers и политики сети.

Работа с файлом окружения

Официальный installer обычно создаёт файл вида setup.env, .env или аналогичный. В нём находятся домен, URL сервисов, пароли PostgreSQL, секреты OIDC и TURN credentials. Ограничьте доступ к этому файлу: права 600 обязательны, потому что утечка переменных позволяет захватить control plane.

cd /opt/netbird
ls -la
find . -maxdepth 2 -type f \( -name ".env" -o -name "setup.env" \) -print
chmod 600 .env 2>/dev/null || true
chmod 600 setup.env 2>/dev/null || true

Ниже показан типовой фрагмент, а не файл для слепой замены. Названия переменных могут отличаться в конкретном релизе. Не публикуйте реальные значения, не сохраняйте их в Git и не отправляйте в чат-боты или тикеты.

NETBIRD_DOMAIN=netbird.example.com
NETBIRD_MGMT_API_ENDPOINT=https://netbird.example.com:443
NETBIRD_MGMT_GRPC_API_ENDPOINT=https://netbird.example.com:443
NETBIRD_AUTH_AUDIENCE=netbird
POSTGRES_DB=netbird
POSTGRES_USER=netbird
POSTGRES_PASSWORD=CHANGE_TO_A_LONG_RANDOM_SECRET
TURN_MIN_PORT=49152
TURN_MAX_PORT=49200

Сгенерировать безопасный секрет можно локально на сервере. Не используйте короткие пароли или повторяющиеся значения для PostgreSQL, Zitadel и TURN.

openssl rand -base64 48

TLS/HTTPS и Caddy

Официальный quickstart NetBird обычно включает reverse proxy и автоматический TLS. Во многих релизах для этого применяется Caddy, который слушает порты 80 и 443 и получает сертификат Let's Encrypt. Если installer уже поднял Caddy, не ставьте второй Caddy или Nginx на хост: два процесса не смогут одновременно занять TCP-порты 80 и 443.

Проверьте, какой контейнер публикует веб-порты. В выводе должен быть сервис с привязкой 0.0.0.0:80->80 и 0.0.0.0:443->443.

docker compose ps
sudo ss -lntup | grep -E ':(80|443|3478|51820)\b'

Если вы сознательно управляете reverse proxy самостоятельно, пример минимального Caddyfile для dashboard и management API выглядит так. Реальные внутренние имена контейнеров и порты возьмите из поставляемого NetBird Compose-файла. Не копируйте пример, пока не сверите их через docker compose config.

netbird.example.com {
    encode zstd gzip

    handle /api/ {
        reverse_proxy management:33073
    }

    handle /ws-proxy/ {
        reverse_proxy signal:10000
    }

    handle {
        reverse_proxy dashboard:80
    }
}

Проверьте дату сертификата и имя в Subject Alternative Name. Ошибка сертификата почти всегда означает неверную DNS-запись, закрытый TCP 80/443, наличие другого proxy или попытку запросить сертификат для домена, который ещё не распространился в DNS.

echo | openssl s_client -connect netbird.example.com:443 \
  -servername netbird.example.com 2>/dev/null | \
  openssl x509 -noout -subject -issuer -dates

Создание первого администратора

Откройте в браузере https://netbird.example.com. Создайте первого пользователя через встроенный identity provider или через настроенный OIDC. После входа проверьте, что ваш пользователь имеет роль администратора в NetBird dashboard. Сразу включите MFA в identity provider, особенно если панель доступна из публичного интернета.

Для серверов удобнее не использовать личный интерактивный вход. В панели NetBird создайте Setup Key, ограничьте его числом использований и сроком действия. Например, для одного production-сервера создайте ключ на одно использование и удалите его после регистрации узла.

Подключение Linux-peer

На сервере, который вы хотите включить в mesh-VPN, установите официальный NetBird client. Перед запуском сверяйте пакетный репозиторий и команду с документацией вашего релиза. Для Ubuntu/Debian типовой вариант использует install-скрипт NetBird, который добавляет официальный репозиторий.

curl -fsSL https://pkgs.netbird.io/install.sh | sudo bash
sudo apt update
sudo apt install -y netbird
netbird version

Замените SETUP_KEY на одноразовый или ограниченный setup key из панели. Параметр --management-url указывает вашему агенту использовать собственный control plane, а не облачный endpoint.

sudo netbird up \
  --management-url https://netbird.example.com \
  --setup-key SETUP_KEY

Проверьте состояние агента. В исправной конфигурации команда показывает статус Connected, присвоенный NetBird IP и количество peers. На некоторых версиях команда может выводить дополнительную информацию о signal server и relay.

sudo netbird status
ip addr show wt0 2>/dev/null || ip addr | grep -A2 -B2 netbird

Группы, политики и минимальный ACL

Не оставляйте сеть в режиме «все видят всех», если в ней есть production-серверы. Создайте группы admins, developers, prod-servers и staging. Добавляйте peers в группы по назначению, а не по имени сотрудника: так проще поддерживать правила при смене устройств и ролей.

Минимальная политика может разрешать администраторам доступ ко всем серверам по SSH, разработчикам — только к staging, а production-серверам — исходящие соединения друг с другом только на нужные порты. Политики создаются в Dashboard в разделе Access Control. Для начала используйте правило уровня сети, затем постепенно сужайте его до групп и портов.

Источник Назначение Протокол/порт Назначение правила
admins prod-servers TCP 22 Администрирование по SSH
developers staging TCP 22, 80, 443 Разработка и тестирование
prod-servers prod-servers Только нужные порты Связь сервисов без полного доступа
all all Any Не использовать в production без необходимости

Проверка mesh-соединения

Подключите минимум два peer-устройства. В dashboard найдите NetBird IP второго устройства, затем выполните ping и SSH через туннель. Если ping запрещён политикой, проверяйте нужный прикладной порт с помощью nc или curl.

ping -c 4 100.64.0.10
nc -vz 100.64.0.10 22
ssh [email protected]

Для проверки, что доступ идёт именно по VPN, подключитесь к сервису, который firewall разрешает только через интерфейс NetBird. На целевой машине можно посмотреть входящие соединения и интерфейс маршрута.

ip route get 100.64.0.10
sudo ss -tnp | grep ':22'

Маршрут в локальную подсеть и exit node

NetBird умеет публиковать маршруты в сети за одним peer. Например, сервер в офисе с доступом к 192.168.50.0/24 может стать routing peer. Для этого на нём включают IP forwarding, а маршрут добавляют в Dashboard и назначают группе-получателю.

sudo tee /etc/sysctl.d/99-netbird-forwarding.conf > /dev/null <<'EOF'
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
EOF

sudo sysctl --system

После включения forwarding настройте firewall/NAT в соответствии с вашей схемой. Не публикуйте домашнюю подсеть целиком без ACL: сначала разрешите доступ только группе администраторов. Exit node, через который клиент отправляет весь интернет-трафик, требует особенно аккуратной настройки NAT, мониторинга трафика и понимания юридических последствий использования публичного IP.

Бэкапы и обслуживание

Схема: Бэкапы и обслуживание
Схема: Бэкапы и обслуживание

Контейнеры NetBird можно пересоздать, но данные control plane без резервной копии восстановить сложно. Главный актив — PostgreSQL: в ней находятся пользователи, peers, политики, маршруты, настройки и связанные данные identity provider. Отдельно сохраняйте Compose-файлы, файлы окружения, Caddy-данные и все ключи OIDC/TURN.

Что нужно бэкапить

  • Дамп PostgreSQL в логическом формате pg_dump.
  • Каталог /opt/netbird без временных файлов и без Docker image layers.
  • Docker volumes, если в них хранятся данные PostgreSQL, Zitadel и Caddy.
  • Файлы .env, setup.env, Compose YAML и Caddyfile.
  • Секреты identity provider, recovery codes MFA и документацию по DNS-записям.
  • Список setup keys и административных пользователей, но не активные ключи в открытом виде.

Перед настройкой автоматизации выясните имена контейнера PostgreSQL и volume. Это важно: имя может быть не просто postgres. Команда ниже покажет сервисы и подключённые volumes.

cd /opt/netbird
docker compose ps
docker compose config --services
docker volume ls

Установка restic и подготовка хранилища

Хранить единственную копию на том же VPS бессмысленно: при удалении сервера, сбое диска или компрометации root-доступа она может быть потеряна вместе с данными. Используйте S3-совместимое объектное хранилище, отдельный backup-VPS по SFTP или другой независимый сервер.

Ниже используется restic с S3. Замените значения на реквизиты своего хранилища. Пароль репозитория restic должен храниться вне самого VPS, например в password manager. После инициализации удалите экспортированные переменные из интерактивной shell history либо используйте защищённый root-only файл.

sudo apt install -y restic
sudo install -d -m 700 /root/.config/restic
sudo nano /root/.config/restic/netbird.env
sudo chmod 600 /root/.config/restic/netbird.env
export RESTIC_REPOSITORY="s3:https://s3.example.com/netbird-backups"
export RESTIC_PASSWORD="REPLACE_WITH_LONG_UNIQUE_RESTIC_PASSWORD"
export AWS_ACCESS_KEY_ID="REPLACE_WITH_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="REPLACE_WITH_SECRET_KEY"

Инициализируйте репозиторий один раз. Команда создаст зашифрованную структуру backup-репозитория.

sudo bash -c 'source /root/.config/restic/netbird.env && restic init'

Скрипт автоматического бэкапа

Создайте скрипт. Он делает дамп PostgreSQL во временный каталог, сохраняет конфигурацию, отправляет данные в restic и очищает локальные дампы старше семи дней. Замените postgres и netbird на реальные имя сервиса и имя базы из вашего Compose-файла.

sudo tee /usr/local/sbin/backup-netbird.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

source /root/.config/restic/netbird.env

STACK_DIR="/opt/netbird"
BACKUP_DIR="/var/backups/netbird"
DATE="$(date +%F_%H-%M-%S)"
PG_SERVICE="postgres"
PG_DATABASE="netbird"
PG_USER="netbird"

mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"

cd "$STACK_DIR"

docker compose exec -T "$PG_SERVICE" \
  pg_dump -U "$PG_USER" -Fc "$PG_DATABASE" \
  > "$BACKUP_DIR/postgres_${DATE}.dump"

restic backup \
  "$BACKUP_DIR" \
  "$STACK_DIR/.env" \
  "$STACK_DIR/setup.env" \
  "$STACK_DIR/docker-compose.yml" \
  --tag netbird --tag postgres

restic forget --tag netbird \
  --keep-daily 7 --keep-weekly 4 --keep-monthly 6 --prune

find "$BACKUP_DIR" -type f -name '.dump' -mtime +7 -delete
EOF

sudo chmod 700 /usr/local/sbin/backup-netbird.sh

Запустите скрипт вручную до добавления в cron. Затем проверьте список snapshot-ов. Если команда вернула ошибку о несуществующем сервисе, посмотрите docker compose config --services и исправьте PG_SERVICE.

sudo /usr/local/sbin/backup-netbird.sh
sudo bash -c 'source /root/.config/restic/netbird.env && restic snapshots'

Добавьте ежедневный запуск в 03:25. Время выбирайте с учётом часового пояса сервера и периода наименьшей нагрузки.

sudo tee /etc/cron.d/netbird-backup > /dev/null <<'EOF'
25 3    root /usr/local/sbin/backup-netbird.sh >> /var/log/netbird-backup.log 2>&1
EOF

Проверка восстановления

Бэкап, который не проверяли восстановлением, нельзя считать рабочим. Раз в квартал поднимайте временную VM, скачивайте snapshot, восстанавливайте конфиги и пробуйте импортировать PostgreSQL в тестовый контейнер. Не тестируйте восстановление на production-базе.

sudo bash -c 'source /root/.config/restic/netbird.env && restic check'
sudo bash -c 'source /root/.config/restic/netbird.env && restic restore latest --target /tmp/netbird-restore'

Обновления NetBird

Для небольшой сети используйте maintenance window: предупредите пользователей, сделайте бэкап, прочитайте release notes, обновите контейнеры и проверьте подключение двух peers. Rolling update имеет смысл только при нескольких экземплярах control plane и спланированной внешней базе данных; на одном VPS краткий перерыв обычно безопаснее и проще.

cd /opt/netbird
sudo /usr/local/sbin/backup-netbird.sh
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100

Не запускайте бездумно docker system prune -a на production-сервере: команда может удалить образы, нужные для быстрого rollback. Сохраняйте предыдущие версии образов до завершения проверки. После обновления проверьте login в dashboard, регистрацию тестового peer, status существующего клиента и TURN-связность из сети с NAT.

Troubleshooting + FAQ

Почему браузер показывает ошибку TLS-сертификата или сайт не открывается?

Сначала проверьте DNS: команда dig +short netbird.example.com A должна вернуть IP вашего VPS. Затем убедитесь, что TCP 80 и 443 открыты и не заняты другим Nginx, Apache или Caddy: sudo ss -lntp. Посмотрите логи reverse proxy через docker compose logs. Для Let's Encrypt домен должен быть публично доступен во время HTTP-01 challenge. Если используется проксирование DNS/CDN, временно отключите его либо настройте DNS challenge.

Peer зарегистрирован, но статус остаётся Disconnected. Что проверить?

На клиенте выполните sudo netbird status и убедитесь, что management URL указывает на ваш домен. Проверьте разрешение DNS и доступность HTTPS: curl -I https://netbird.example.com. На сервере откройте логи management и signal-контейнеров. Частая причина — неверный внешний URL в файле окружения, просроченный setup key или policy/firewall, блокирующие исходящий HTTPS у клиента. После исправления выполните sudo netbird down и снова sudo netbird up.

Устройства видят друг друга в панели, но ping и SSH не работают. Почему?

Проверьте ACL-политику в Dashboard: наличие peer в сети не означает автоматическое разрешение любого трафика. Затем проверьте локальный firewall целевого сервера: UFW может разрешать SSH только с публичного интерфейса или только с конкретной подсети. Посмотрите NetBird IP обоих peers и маршрут командой ip route get PEER_IP. Для диагностики временно создайте узкое правило, разрешающее TCP 22 между двумя тестовыми группами, а не глобальное правило all-to-all.

Почему соединение работает медленно или идёт через relay?

Это обычно означает, что peers не смогли установить прямой UDP-путь и используют TURN. Проверьте доступность UDP 3478, UDP 51820 и relay-диапазона UDP 49152–49200 на VPS, включая внешний firewall провайдера. На домашних и корпоративных сетях причиной может быть симметричный NAT или запрет UDP. Посмотрите статус клиента и логи coturn. Relay — нормальный fallback, но его скорость зависит от канала VPS и расстояния до пользователей.

Какой VPS-конфиг минимально подойдёт?

Для личной сети из 3–10 устройств подойдёт 1 vCPU, 2 ГБ RAM, 25 ГБ SSD и публичный IPv4. Для стабильной эксплуатации с PostgreSQL, dashboard, coturn и запасом на обновления лучше выбирать 2 vCPU, 4 ГБ RAM и 40–50 ГБ NVMe. Если ожидается много клиентов за NAT, важнее не размер диска, а пропускная способность и включённый UDP-трафик. Следите за RAM, CPU и исходящим трафиком после запуска.

Что выбрать — VPS или dedicated для этой задачи?

Для большинства self-hosted NetBird-сетей достаточно VPS. Control plane потребляет мало ресурсов, а десятки peers редко требуют выделенного железа. Dedicated нужен при высоком постоянном TURN-трафике, требованиях к аппаратной изоляции, нескольких сотнях активных пользователей или необходимости гарантированной полосы. Практичный путь — начать с VPS на 2–4 vCPU и вынести TURN на отдельную машину, если метрики покажут, что relay стал ограничением.

Как добавить маршрут в домашнюю или офисную подсеть?

Выберите peer, который одновременно подключён к NetBird и к локальной сети, например 192.168.50.0/24. На нём включите net.ipv4.ip_forward=1, затем добавьте маршрут в Dashboard и назначьте группы, которым он доступен. Убедитесь, что обратный маршрут существует: либо локальный роутер знает путь к NetBird-подсети, либо routing peer выполняет NAT. Начинайте с одного хоста или небольшой подсети и проверяйте доступ ACL-правилами.

Можно ли удалить peer, если ноутбук потерян?

Да. Откройте Dashboard, найдите устройство в списке Peers и удалите либо disable его. Management server перестанет выдавать ему актуальную конфигурацию и доступ к сетевым ресурсам будет отозван согласно политике. Дополнительно отключите сессии пользователя в identity provider, смените setup keys, если они могли быть сохранены на устройстве, и проверьте audit events. Не используйте бессрочные setup keys с неограниченным числом регистраций.

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Теперь у вас есть self-hosted NetBird control plane с HTTPS, WireGuard mesh-VPN, TURN fallback, базовым firewall и резервным копированием PostgreSQL. Такая схема позволяет объединить VPS, домашние серверы и устройства команды в одну приватную сеть без постоянной зависимости от внешнего облачного control plane.

  1. Создайте группы по ролям и замените широкие правила доступа на минимально необходимые ACL.
  2. Подключите мониторинг Docker, диска, TLS-сертификатов и объёма TURN-трафика.
  3. При росте нагрузки вынесите coturn на отдельный сервер, добавьте второй relay-регион и регулярно тестируйте восстановление из бэкапа.

Был ли этот гайд полезен?

Ваш отзыв помогает нам улучшать гайды.

Поделиться записью:

Отправьте гайд тому, кому он может пригодиться.

Telegram VKVK WhatsApp Facebook LinkedIn XX

netbird на своём сервере: mesh-vpn как tailscale без облака
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.