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

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

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

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

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

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

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

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

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

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

Модуль ядра

Ubuntu 20.04 LTS включает Wireguard в базовой поставке. Дополнительные действия не нужны.

В Debian 10 требуется установить портированный пакет:

echo deb http://deb.debian.org/debian buster-backports main > /etc/apt/sources.list.d/buster-backports.list
apt update
apt install -y linux-headers-amd64 wireguard-dkms

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

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

echo wireguard >> /etc/modules-load.d/mitigator.conf

Инструменты

Установить утилиту wg:

apt install -y wireguard-tools

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

Все файлы создаются в каталоге /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. Создать файл docker-compose.vpn.yml в точности такого содержания:

    version: "2.2"
    services:
      gateway:
        environment:
          GATEWAY_ADDRESS: "${MITIGATOR_VPN_ADDRESS:-10.8.3.1}/${MITIGATOR_VPN_PREFIX:-24}"
        volumes:
        - ./vpn-public.conf:/srv/public.conf:ro
        - ./vpn-private.conf:/srv/private.conf:ro
    
  6. Добавить docker-compose.vpn.yml в список конфигураций Docker Compose в файле .env:

    COMPOSE_FILE=docker-compose.yml:docker-compose.vpn.yml
    

    Если используется больше файлов, например, docker-compose.override.yml, их все нужно перечислить через двоеточия.

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

    MITIGATOR_VPN_ADDRESS=10.8.3.1
    

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

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

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

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

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

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

docker-compose exec gateway reconfigure