Сеть между экземплярами

Принцип работы

Дальнейшие шаги предполагают, что экземпляр MITIGATOR уже установлен. В противном случае предварительно выполните установку одним из следующих способов.

Взаимодействие между экземплярами устроено через Wireguard. Между экземплярами создается виртуальная сеть (VPN).

Каждый экземпляр имеет ключевую пару: приватный ключ и публичный ключ. Приватный ключ хранится только на своем экземпляре в vpn-private.conf. Публичные ключи всех экземпляров перечислены в vpn-public.conf, который должен быть одинаков на всех экземплярах. В нем же указаны адреса экземпляров и их адреса в VPN.

Адрес экземпляра в VPN также указывается как MITIGATOR_VPN_ADDRESS в .env.

За организацию VPN отвечают подсистемы gateway и gateway-dataplane. Когда кластеризация не применяется, они не настраивают VPN. При кластеризации они настраивают VPN в соответствии с vpn-private.conf, vpn-public.conf и MITIGATOR_VPN_ADDRESS.

Информация

Если нужно поменять настройки gateway, кроме *.conf, нужно полностью перезапустить экземпляр (docker-compose down && docker-compose up -d).

Специальную команду для обновления конфигурации VPN см. ниже.

Обработчик пакетов и подсистема gateway-dataplane работают без изоляции сети. VPN с обработчиками пакетов также не будет изолирована от сети хоста, поэтому нужно выбирать такой MITIGATOR_VPN_ADDRESS, чтобы он не попадал в существующие сети, к которым хосту нужен доступ.

При включении VPN подсистема gateway-dataplane создает на хосте интерфейс VPN wg0. Это имя можно задать через DATA_PLANE_VPN_DEVICE в .env.

VPN с обработчиками пакетов использует порт 4568 (UDP), доступ к которому нужно открыть на всех экземплярах. Этот порт можно задать через DATA_PLANE_VPN_PORT в .env.

Подготовка системы

Установить необходимые пакеты (для Debian/Ubuntu):

apt install -y wireguard
Информация

В версиях Debian старше Bullseye для установки Wireguard необходимо включить backports.

Проверить поддержку можно командной modprobe wireguard. Если ничего не печатается в ответ, модуль доступен. В этом случае достаточно настроить его автоматическую загрузку. Иначе требуется перезагрузка.

Для добавления Wireguard в автоматическую загрузку:

echo wireguard >> /etc/modules-load.d/mitigator.conf
Информация

Новые версии Debian/Ubuntu включают Wireguard в базовой поставке, добавление в автоматическую загрузку не требуется.

Настройка экземпляра

Все файлы создаются в каталоге /srv/mitigator.

Если настраивается не первый экземпляр, файл vpn-public.conf нужно взять с любого из настроенных экземпляров, чтобы дополнять его.

  1. Создать приватный ключ (пример результата: yDPg5doavYH7fdD86nt+cOzSBL4znVZcrcrJwjY/Xmw=):

    wg genkey
  2. Записать ключ в vpn-private.conf:

    [Interface]
    ListenPort = 4567
    PrivateKey = yDPg5doavYH7fdD86nt+cOzSBL4znVZcrcrJwjY/Xmw=

    Указанный порт 4567 должен быть открыт для UDP-трафика.

  3. Получить из приватного ключа публичный (пример результата: acfzxE6ZsiYE4jIqsBicOt7oT8ZuKhxBvuz0+6JxiEc=):

    echo 'yDPg5doavYH7fdD86nt+cOzSBL4znVZcrcrJwjY/Xmw=' | wg pubkey
  4. Добавить в vpn-public.conf секцию с публичным ключом и адресами экземпляра (создать файл, если это первый экземпляр):

    [Peer]
    PublicKey = acfzxE6ZsiYE4jIqsBicOt7oT8ZuKhxBvuz0+6JxiEc=
    AllowedIPs = 10.8.3.1/32
    Endpoint = 192.0.2.1:4567

    10.8.3.1 — адрес экземпляра внутри VPN. Должен быть уникальным среди всех экземпляров. Все адреса должны быть внутри одной сети /24 (по умолчанию).

    192.0.2.1:4567 — внешний адрес экземпляра и настроенный выше порт. На этот адрес и порт другие экземпляры будут отправлять UDP-пакеты.

  5. Добавить в .env адрес экземпляра внутри VPN:

    MITIGATOR_VPN_ADDRESS=10.8.3.1

    Он должен совпадать с настроенным в vpn-public.conf. Также этот адрес должен быть указан в настройках экземпляра в web-интерфейсе MITIGATOR.

  6. Перезапустить MITIGATOR:

    docker-compose down && docker-compose up -d

Настройка кластера после добавления экземпляра

После добавления нового экземпляра в файл vpn-public.conf или при изменении vpn-private.conf нужно внести изменения на всех экземплярах.

На каждом экземпляре нужно обновить конфигурацию VPN без перезапуска:

docker-compose exec gateway reconfigure
docker-compose exec gateway-dataplane reconfigure