Mesh-сеть на WireGuard между несколькими серверами
Полное руководство по созданию mesh-сети на WireGuard: архитектура, адресация, настройка каждого узла, маршрутизация и диагностика.
Содержание
Что такое 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.
Проверка работоспособности и поиск неисправностей
Если связь не устанавливается, действуйте по порядку:
- Проверьте запущен ли WireGuard:
sudo wg show— интерфейс должен быть active, и для каждого пира должен быть виден последний handshake. - Проверьте файрвол: разрешите входящие UDP-пакеты на порт 51820. Например, для ufw:
sudo ufw allow 51820/udp. - Проверьте маршруты:
ip route show— должна быть маршрут к подсети 10.10.0.0/24 через wg0. - Сверьте ключи: убедитесь, что публичные ключи в конфигах совпадают с ключами соответствующих серверов. Команда
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). Вручную конфигурация подходит для небольших кластеров.
Хотите перейти сразу к рабочему доступу?
Если сценарий уже ясен и не хочется проходить все шаги вручную, оформите доступ и проверьте подключение на своем устройстве.
Получить доступ