Быстрый старт Настройка Обновлено 7 Linux

Mesh-сеть на WireGuard между несколькими серверами

Полное руководство по созданию mesh-сети на WireGuard: архитектура, адресация, настройка каждого узла, маршрутизация и диагностика.

WireGuardmeshVPNсерверынастройкамаршрутизация
Содержание
КороткоMesh-сеть на WireGuard соединяет все серверы напрямую друг с другом без единой точки отказа. На каждом узле прописываются все пиры, используются приватные подсети /24 для туннельных адресов, а маршрутизация настраивается через AllowedIPs. Статья даёт полный пример конфигурации для трёх узлов и объясняет, как проверить связность.

Что такое mesh-сеть на базе WireGuard и зачем она нужна

Обычный WireGuard-конфиг часто строят по схеме «звезда»: один центральный сервер и несколько клиентов, которые ходят через него. В mesh-сети каждый сервер устанавливает прямые туннели со всеми остальными. Это даёт два преимущества: нет единой точки отказа (если один узел падает, остальные продолжают общаться) и трафик между узлами идёт напрямую, без лишнего хопа.

Такой подход особенно полезен, когда у вас несколько серверов в разных дата-центрах, и им нужно обмениваться данными без задержек, например для баз данных, репликации или оркестрации Kubernetes.

Архитектура и адресация для mesh-сети

Для mesh-сети WireGuard нужно заранее выделить приватную подсеть, которая не пересекается с реальными сетями серверов. Обычно используют диапазон 10.0.0.0/24 или 10.10.0.0/24. Каждому узлу назначается свой адрес, например 10.10.0.1, 10.10.0.2, 10.10.0.3 и так далее.

Помимо адресации, нужно решить, как узлы будут находить друг друга. Если у всех серверов есть публичные IP, всё просто: в конфиге каждого пира указывается реальный endpoint (IP:порт). Если за NAT — потребуется статический публичный IP для хотя бы одного узла или использование протокола NAT traversal, но для простоты в этой статье предполагаем, что у каждого сервера есть публичный IP.

Пошаговая настройка mesh-сети на WireGuard

Рассмотрим настройку на примере трёх серверов: server1, server2, server3. Будем использовать подсеть 10.10.0.0/24, порт 51820 UDP.

На каждом сервере нужно установить WireGuard и сгенерировать ключи:

sudo apt update && sudo apt install wireguard
wg genkey | tee privatekey | wg pubkey > publickey

Полученные публичные ключи нужно сохранить для всех узлов. Ниже приведены конфигурации для каждого сервера.

Конфигурация server1 (10.10.0.1)

[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_SERVER1

[Peer]
# server2
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_SERVER2
AllowedIPs = 10.10.0.2/32
Endpoint = PUBLIC_IP_SERVER2:51820

[Peer]
# server3
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_SERVER3
AllowedIPs = 10.10.0.3/32
Endpoint = PUBLIC_IP_SERVER3:51820

Конфигурация server2 (10.10.0.2)

[Interface]
Address = 10.10.0.2/24
ListenPort = 51820
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_SERVER2

[Peer]
# server1
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_SERVER1
AllowedIPs = 10.10.0.1/32
Endpoint = PUBLIC_IP_SERVER1:51820

[Peer]
# server3
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_SERVER3
AllowedIPs = 10.10.0.3/32
Endpoint = PUBLIC_IP_SERVER3:51820

Конфигурация server3 (10.10.0.3)

[Interface]
Address = 10.10.0.3/24
ListenPort = 51820
PrivateKey = ПРИВАТНЫЙ_КЛЮЧ_SERVER3

[Peer]
# server1
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_SERVER1
AllowedIPs = 10.10.0.1/32
Endpoint = PUBLIC_IP_SERVER1:51820

[Peer]
# server2
PublicKey = ПУБЛИЧНЫЙ_КЛЮЧ_SERVER2
AllowedIPs = 10.10.0.2/32
Endpoint = PUBLIC_IP_SERVER2:51820

Замените заглушки на фактические значения ключей и IP. После создания файла /etc/wireguard/wg0.conf запустите интерфейс:

sudo wg-quick up wg0

Повторите на каждом сервере. Теперь все три узла должны видеть друг друга по адресам 10.10.0.x.

Маршрутизация и коммуникация между пирами

В простейшем mesh-конфиге каждый пир указывает только адрес конкретного узла. Если вам нужно, чтобы узлы могли ходить в другие подсети (например, за server1 есть локальная сеть 192.168.1.0/24), вы должны добавить соответствующие подсети в AllowedIPs на других пирах и включить IP-форвардинг на маршрутизаторе. Но в данной статье мы соединяем только сами серверы, поэтому AllowedIPs содержит лишь /32 адреса пиров.

Если планируется добавлять новые узлы, достаточно будет добавить блок [Peer] в конфигурации всех существующих серверов и перезапустить WireGuard. Это главное отличие mesh от звезды: нет централизованного управления, конфиг меняется на каждом узле.

Для проверки связности используйте ping 10.10.0.2 с server1 и наоборот. Также можно посмотреть статистику через sudo wg show.

Проверка работоспособности и поиск неисправностей

Если связь не устанавливается, действуйте по порядку:

  1. Проверьте запущен ли WireGuard: sudo wg show — интерфейс должен быть active, и для каждого пира должен быть виден последний handshake.
  2. Проверьте файрвол: разрешите входящие UDP-пакеты на порт 51820. Например, для ufw: sudo ufw allow 51820/udp.
  3. Проверьте маршруты: ip route show — должна быть маршрут к подсети 10.10.0.0/24 через wg0.
  4. Сверьте ключи: убедитесь, что публичные ключи в конфигах совпадают с ключами соответствующих серверов. Команда sudo wg показывает текущие ключи.

Если handshake не происходит, часто виновата неверная настройка Endpoint или закрытый порт. Используйте tcpdump -i wg0 для диагностики.

Мини-чеклист

  • Назначьте уникальный IP из приватной подсети каждому серверу (например, 10.10.0.1, ...).
  • Сгенерируйте пары ключей на всех узлах и скопируйте публичные ключи друг друга.
  • Создайте конфиг wg0.conf на каждом узле, добавив все остальные серверы как пиры с соответствующими AllowedIPs и Endpoint.
  • Проверьте файрвол: откройте UDP-порт, который использует WireGuard (по умолчанию 51820).

Частые ошибки

  • Забывают указать ListenPort в [Interface] — тогда порт выбирается случайно, и другие узлы не смогут подключиться.
  • Используют одинаковые AllowedIPs у разных пиров, что вызывает конфликт маршрутизации.
  • Не обновляют конфигурацию на всех узлах при добавлении нового сервера — mesh перестаёт быть полносвязным.
  • Проверяют ping с самого сервера, но не с внешней машины, из-за чего не замечают проблем с маршрутизацией.

Источники и документация

FAQ

Сколько узлов можно соединить в mesh-сети на WireGuard?

Формального лимита нет, но количество пиров в конфиге каждого узла растёт линейно, как и количество рукопожатий. При десятках узлов производительность может снизиться, но для 3–10 серверов это работает стабильно.

Что делать, если один из серверов находится за NAT?

Если у узла нет публичного IP, WireGuard может использовать PersistentKeepalive, чтобы поддерживать туннель. Однако для mesh-сети желательно, чтобы у каждого сервера был публичный IP, иначе потребуется центральный ретранслятор.

Можно ли использовать mesh-сеть для Kubernetes?

Да, WireGuard mesh часто применяют для связи control-plane и worker-нод, но обычно используют готовые решения (например, Calico с WireGuard backend). Вручную конфигурация подходит для небольших кластеров.

Хотите перейти сразу к рабочему доступу?

Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.

Получить доступ

Дальше по теме

Связанные статьи