Поддерживается как физические, так и виртуальные машины (KVM, VMWare).
Образ подходит для VirtualBox, VMWare ESXi 6.5 и выше.
Скачать OVA-файл.
Импортировать OVA:
Выбрать сети:
После первого запуска и при обновлении (учетная запись: root:mitigator
):
Только при обновлении:
cd /srv/mitigator
wget https://docs.mitigator.ru/dist/docker-compose.yml
wget https://docs.mitigator.ru/dist/env -O /srv/mitigator/.env
docker login docker.mitigator.ru
systemctl restart mitigator
Подробней о назначении файлов можно почитать в инструкции по ручной установке.
После установки и запуска настроить систему для её стабильной и безопасной работы.
Playbook работает для Debian 9+, Ubuntu 16.04+, CentOS 7.2+. Необходим доступ от целевой машины к репозитариям дистрибутива.
1. Установить Ansible (пример для Debian/Ubuntu):
sudo apt-get --yes install ansible tar wget
2. Установить Docker и Docker-Compose:
Следуя официальной документации по установке для вашей ОС:
Если в системе отсутствует /etc/docker/daemon.json
, будет установлен следующий:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "50m",
"max-file": "2"
}
}
Существующий файл изменен не будет, в этом случае следует совместить конфигурации вручную.
3. Скачать и распаковать необходимые файлы:
wget https://docs.mitigator.ru/ansible/mitigator.tar -O- | tar -x
wget https://docs.mitigator.ru/ansible/config.yml -O mitigator/config.yml
4. Отредактировать mitigator/config.yml
(параметры по умолчанию
годятся для минимальной конфигурации):
---
mitigator_arch: "nehalem"
mitigator_nic_driver: vfio-pci
mitigator_nics:
- 0b:00.0
- 13:00.0
mitigator_nr_addrs: 131072
mitigator_hugepage_size: "2M"
mitigator_hugepage_nr: 1536
mitigator_nr_policies: 100
#mitigator_version: latest
mitigator_registry_user: guest
mitigator_registry_pass: mitigator
mitigator_pull_images: y
#mitigator_http_proxy: ""
#mitigator_https_proxy: ""
#mitigator_no_proxy: ""
mitigator_arch
: микроархитектура процессора, для которой будет загружена
оптимизированная версия обработчика пакетов: nehalem
, sandybridge
или haswell
(указания по выбору).
mitigator_nic_driver
: драйвер сетевой карты для DPDK
(подробнее о выборе).
Настройки обработчика пакетов:
mitigator_nics
: сетевые порты с указанием PCI-адресов и ядер
процессора. Подразумевается, что они перечислены в порядке ext0,
int0, ext1, int1 и т.д. Портов может быть нечетное количество.mitigator_hugepage_size
: размер страницы (2M
или 1G
);mitigator_hugepage_nr
: количество страниц.mitigator_nr_policies
: максимальное количество политик защиты.
Можно указать версию Mitigator´а
(latest
по умолчанию).
При первом запуске и при mitigator_pull_images: y
будет выполнена загрузка
образов Mitigator´а, для чего нужно задать логин и пароль:
mitigator_registry_user
и mitigator_registry_pass
.
Можно настроить прокси для Docker´а и компонент Mitigator´а.
5. Развернуть Mitigator на целевую машину mitigator.local
,
куда есть доступ по SSH:
ansible-playbook --become --ask-become-pass \
-i mitigator.local, mitigator/mitigator.yml
Запятая после имени хоста — не опечатка. Если имя пользователя SSH
отличается от локального, например, login
, добавляется параметр -u login
.
--become
и --ask-become-pass
используются для повышения привилегий, когда
подключение осуществляется не напрямую через пользователя root
(необходимо для выполнения части задач в процессе инсталяции).
В конце установки машина перезагрузится.
Playbook безопасно исполнять повторно в случае проблем.
1. Задания в роли ансибла разделены на 4 «тега»: checks, system, hugepages, mitigator.
Задания под тегом, соответственно, предназначены для проверки конфигурации, настройки системы, настройки hugepages и настройки непосредственно Mitigator´а. При необходимости перезапустить роль и перенастроить установку только частично, можно запустить playbook с необходимым набором тегов, например:
ansible-playbook --become --ask-become-pass \
--tags "system,hugepages" \
-i mitigator.local, mitigator/mitigator.yml
2. Конфигурацию GRUB2 под UEFI на RHEL/CentOS необходимо дополнительно перегенерировать вручную:
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
Для CentOS redhat
заменить на centos
После установки и запуска настроить систему для её стабильной и безопасной работы.
В режиме кластера несколько экземпляров системы Mitigator пользуются едиными базами данных и управляются централизованно. За счет добавления дополнительных экземпляров система допускает неограниченное масштабирование. Режим кластера позволяет обрабатывать трафик независимо на каждом экземпляре, но управлять ими из единого интерфейса. При плановом или аварийном отключении любого экземпляра сохраняется возможность управления остальными.
Между экземплярами настраивается виртуальная сеть (VPN) Для ее работы нужна сетевая связность между экземплярами. Подробные сведения по настройке и необходимым доступам описаны по ссылке.
Существует несколько принципиальных схем внедрения.
Общее нерезервированное хранилище:
+ простота настройки;
− при выключении главного экземпляра теряется управление и мониторинг;
− при отказе диска главного экземпляра теряются данные.
Внутреннее отказоустойчивое хранилище:
+ отказоустойчивость за счет репликации БД;
+ нет потребности в дополнительном сервере для хранилища;
− ресурсы экземпляров Mitigator´а расходуются на нужды хранилища;
− повышенные требования к квалификации администратора;
− отсутствие гибкости настройки.
Внешнее отказоустойчивое хранилище:
+ полный контроль и гибкость (отказоустойчивость, тонкая настройка);
+ снимается нагрузка с экземпляров Mitigator´а;
− требуется квалификация администратора;
− нужен дополнительный сервер для хранилища;
− необходимо запускать миграцию вручную при обновлении.
Основным изменением в интерфейсе Mitigator´а при переходе на режим кластера стало разделение некоторых настроек на относящиеся к системе в целом и для конкретных экземпляров.
На вкладке «Экземпляры» пользователю доступен список всех экземпляров системы. Для каждого из них отображается текущий статус активности. Переключателями централизованно изменяется состояние экземпляра. Нажатие на название экземпляра переводит пользователя на страницу настройки экземпляра. Если в системе создан только один экземпляр, то при нажатии на пункт меню «Экземпляры» пользователь сразу попадет на страницу настройки экземпляра.
В настройках экземпляра могут быть изменены его название, признак лидера, статус защиты и адрес обработчика пакетов для данного экземпляра.
Разделы «Интеграция в сеть» и «GRE-туннель со сторонним сервисом» теперь также находятся на вкладке «Экземпляры», так как для корректной работы системы следует задать параметры внедрения в сеть для каждого экземпляра.
Mitigator позволяет использовать агрегацию каналов (LAG) между устройствами во внешней и внутренней сети. Настройки интеграции в сеть влияют на то, какие варианты агрегации каналов могут использоваться:
Mitigator позволяет балансировать нагрузку между несколькими экземплярами системы по ECMP за счет анонсирования по BGP каждым экземпляром одинаковых префиксов. Когда один из экземпляров отключается, анонс снимается и трафик автоматически распределяется между оставшимися экземплярами.
Карточка «Лицензия» разделена на две. В настройках системы задается значение лицензионного ключа, а в настройках экземпляра находятся элементы управления лицензированной полосой и сервисная информация.
В верхней панели интерфейса находится выпадающий список, позволяющий выбрать экземпляр, для которого в системе будут показываться графики. Также возможно отображение суммарно для всех экземпляров, если выбрано значение «Все экземпляры».
Взаимодействие между экземплярами устроено через 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
).Ubuntu 20.04 LTS включает Wireguard в базовой поставке. Дополнительные действия не нужны.
В Debian 10 (Buster) требуется установить портированный пакет:
echo deb http://deb.debian.org/debian buster-backports main > /etc/apt/sources.list.d/buster-backports.list
apt-get update
apt-get install linux-headers-amd64 wireguard-dkms
Проверить поддержку можно командной modprobe wireguard
. Если ничего
не печатается в ответ, модуль доступен. В этом случае достаточно настроить
его автоматическую загрузку. Иначе требуется перезагрузка.
Установить утилиту wg
:
apt-get install wireguard-tools
Все файлы создаются в каталоге /srv/mitigator
.
Если настраивается не первый экземпляр, файл vpn-public.conf
нужно взять
с любого из настроенных экземпляров, чтобы дополнять его.
Создать приватный ключ
(пример результата: yDPg5doavYH7fdD86nt+cOzSBL4znVZcrcrJwjY/Xmw=
):
wg genkey
Записать ключ в vpn-private.conf
:
[Interface]
ListenPort = 4567
PrivateKey = yDPg5doavYH7fdD86nt+cOzSBL4znVZcrcrJwjY/Xmw=
Указанный порт 4567 должен быть открыт для UDP-трафика.
Получить из приватного ключа публичный
(пример результата: acfzxE6ZsiYE4jIqsBicOt7oT8ZuKhxBvuz0+6JxiEc=
):
echo 'yDPg5doavYH7fdD86nt+cOzSBL4znVZcrcrJwjY/Xmw=' | wg pubkey
Добавить в 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-пакеты.
Создать файл 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
Добавить этот файл в список конфигураций Docker Compose в .env
:
COMPOSE_FILE=docker-compose.yml:docker-compose.vpn.yml
Если используется больше файлов, например, docker-compose.override.yml
,
их все нужно перечислить через двоеточия.
Добавить в .env
адрес экземпляра внутри VPN:
MITIGATOR_VPN_ADDRESS=10.8.3.1
Он должен совпадать с настроенным в vpn-public.conf
.
Также этот адрес должен быть указан в настройках экземпляра в
web-интерфейсе Mitigator´а.
Перезапустить Mitigator:
docker-compose down && docker-compose up -d
После добавления нового экземпляра в файл vpn-public.conf
нужно
внести изменения на всех экземплярах.
На каждом экземпляре нужно обновить конфигурацию VPN без перезапуска:
docker-compose exec gateway reconfigure
Перед настройкой кластера необходимо настроить виртуальную сеть (VPN). Для ее работы нужна сетевая связность между экземплярами. Подробные сведения по настройке и необходимым доступам описаны по ссылке.
Общие базы данных для всех экземпляров Mitigator´а физически хранятся на сервере одного из них. К базовому экземпляру должны быть разрешены подключения с остальных экземпляров по следующим портам TCP: 8888, 2003, 3080, 5432.
Если кластер собирается из Mitigator´ов, которые ранее уже работали независимо, то в ходе интеграции могут возникнуть конфликты. Поэтому на всех экземплярах кроме будущего лидера необходимо выполнить команду:
docker-compose down -v
Установка базового экземпляра выполняется по шагам, описанным в разделе «Установка».
Остальные экземпляры Mitigator´а должны обращаться к БД базового экземпляра и поэтому сначала для них необходимо также выполнить стандартную установку. После установки, но перед запуском, необходимо:
Скачать docker-compose.worker.yml
:
wget https://docs.mitigator.ru/dist/multi/docker-compose.worker.yml \
-O docker-compose.worker.yml
В файле .env
задать переменную COMPOSE_FILE
так:
COMPOSE_FILE=docker-compose.yml:docker-compose.worker.yml
Если требуются дополнительные настройки, например, при использовании карт
Mellanox, поместить их в docker-compose.override.yml
и добавить его
в список:
COMPOSE_FILE=docker-compose.yml:docker-compose.override.yml:docker-compose.worker.yml
В файле .env
задать переменную MITIGATOR_STORAGE_HOST=192.0.2.1
.
Здесь 192.0.2.1
– адрес базового экземпляра.
В файле .env
задать переменную MITIGATOR_OWN_NAME=mitigator-1
.
Здесь mitigator-1
– имя экземпляра. Имя каждого экземпляра должно быть уникально.
В файле .env
задать переменную MITIGATOR_HOST_ADDRESS=192.0.2.1
.
Здесь 192.0.2.1
– адрес хоста для данного экземпляра.
Перед настройкой кластера необходимо настроить виртуальную сеть (VPN). Для ее работы нужна сетевая связность между экземплярами. Подробные сведения по настройке и необходимым доступам описаны по ссылке.
В целях отказоустойчивости синхронизированные копии БД должны физически храниться на разных серверах (реплицироваться). При данной схеме реплики БД хранятся на тех же серверах, где работают экземпляры Mitigator´а. Это позволяет сэкономить ресурсы и не требует знаний по настройке PostgreSQL.
Если кластер собирается из Mitigator´ов, которые ранее уже работали независимо, то в ходе интеграции могут возникнуть конфликты. Поэтому на всех экземплярах кроме будущего лидера необходимо выполнить команду:
docker-compose down -v
Экземпляры PostgreSQL работают в схеме потоковой репликации active — hot standby. Вместо подключения к PostgreSQL напрямую каждый Mitigator подключается к локальной работающий программе pgfailover, которая перенаправляет подключения к PostgreSQL-лидеру репликации.
Если лидер недоступен, pgfailover
делает лидером одну из ведомых реплик
в заданной очередности.
Mitigator-лидер кластера и PostgreSQL-лидер репликации не обязаны совпадать.
Предполагается, что между узлами надежная связь. Если группа экземпляров окажется отрезана от лидера репликации, среди них будет выбран новый лидер (split-brain). После восстановления связи придется вручную удалить данные на отрезанной части экземпляров и заново ввести их в кластер.
Метрики для графиков пишутся Mitigator´ом-лидером на все экземпляры
для сохранности. Это задается списком серверов FWSTATS_GRAPHITE_ADDRESS
.
Процесс настройки описан для двух экземпляров и одинаков на всех экземплярах,
кроме конкретных значений MITIGATOR_OWN_INDEX
. Для большего количества
экземпляров нужно расширить по аналогии списки серверов pgfailover
и FWSTATS_GRAPHITE_ADDRESS
.
В файле .env
задать переменную MITIGATOR_HOST_ADDRESS=192.0.2.1
.
Здесь 192.0.2.1
– адрес хоста для данного экземпляра.
В файле .env
задать переменную MITIGATOR_OWN_INDEX=0
.
Здесь 0
– идентификатор очередности данного экземпляра
стать Active-сервером PostgreSQL.
Должен быть уникальным и последовательно возрастающим на каждом экземпляре.
В файле .env
задать переменные SERVER1=10.8.3.1
и SERVER2=10.8.3.2
.
Здесь 10.8.3.1
и 10.8.3.2
– адреса серверов внутри VPN, на которых запущены
экземпляры. Также эти адреса должны быть указаны в настройках экземпляров в
web-интерфейсе Mitigator´а.
указывать реальные адреса экземпляров.
Создать docker-compose.failover.yml
на базе шаблона:
wget https://docs.mitigator.ru/dist/multi/docker-compose.failover.yml
Редактирование нужно, если используется больше двух экземпляров. Расширение делается по аналогии с двумя имеющимися в шаблоне.
В файле .env
задать переменную COMPOSE_FILE
так:
COMPOSE_FILE=docker-compose.yml:docker-compose.failover.yml
Стенд с Active базой запускается как обычно:
docker-compose up -d
Стенд с Standby инициализируется репликой:
docker-compose run -e PGPORT=15432 postgres standby
после чего запускается как обычно:
docker-compose up -d
Если произойдет разрыв соединения с экземпляром-лидером (базы в режиме Active), экземпляр с базами в режиме Standby занимает его место и становится лидером. Механизма переключения баз бывшего лидера в режим Standby не предусмотрено штатной репликацией PostgreSQL. Для схемы из двух баз данных это означает прекращение репликации на другой сервер до ручной перенастройки схемы.
Для переключения бывшего Active и возвращения его в схему репликации необходимо остановить сервис PostgreSQL, а также удалить локальные данные базы.
Остановка сервиса PostgreSQL:
docker-compose rm -fsv postgres
Удаление локальных данных базы:
docker volume rm mitigator_postgres
Инициализация Standby аналогично первой инициализации:
docker-compose run -e PGPORT=15432 postgres standby
после чего запускается как обычно:
docker-compose up -d
В случае split brain в каждой изолированной части кластера будет выбран свой лидер репликации, то есть кластер распадется на несколько меньших (возможно, из единственной машины).
После восстановления связности pgfailover
всех меньших кластеров обнаружат,
что есть несколько серверов PostgreSQL, работающих как лидеры репликации.
В каждом из кластеров сработает оповещение об этой ситуации,
будет создано событие журнала «Возник конфликт лидерства экземпляров».
В логах каждого бэкенда-лидера (docker-compose logs backend
)
будет сообщение такого вида:
time="2021-03-03T19:32:47+03:00" level=error msg=multi-conflict data="{\"primary\":0,\"rivals\":[1],\"sender\":0}" hook=on-multi-conflict
В поле data
:
sender
— индекс экземпляра, который оповещает о произошедшем
(MITIGATOR_OWN_INDEX
, -index
у pgfailover
).primary
— индекс того экземпляра,
который sender
читает корректным лидером репликации.rivals
— список индексов экземпляров, на которых PostgreSQL работает
как лидер репликации, помимо primary
.Необходимо проанализировать такие записи в логах всех экземпляров, выбрать, какой будет лидером, а остальные сделать standby.
Перед настройкой кластера необходимо настроить виртуальную сеть (VPN). Для ее работы нужна сетевая связность между экземплярами. Подробные сведения по настройке и необходимым доступам описаны по ссылке.
Данная схема внедрения подразумевает физическое хранение общих для всех экземпляров Mitigator´а баз данных на внешнем сервере. Работоспособность и отказоустойчивость всех СУБД обеспечивается силами администратора внешнего сервера под конкретные требования.
Все экземпляры разворачиваются как worker´ы (см. выше).
Если кластер собирается из Mitigator´ов, которые ранее уже работали независимо, то в ходе интеграции могут возникнуть конфликты. Поэтому на всех экземплярах кроме будущего лидера необходимо выполнить команду:
docker-compose down -v
Схема взаимодействия:
В качестве инструмента для миграции схемы и дальнейшего управления используется утилита SHMIG.
Миграции необходимо брать прямо из контейнера используемой версии:
Развернуть полноценный стенд
(временно закомментировать строку #COMPOSE_FILE=
в файле .env
).
Выполнить команду:
docker-compose create postgres
Скопировать скрипты миграции:
docker cp mitigator_postgres_1:/schema schema
Выполнить команду:
docker-compose rm -sf postgres
Восстановить состояние файла .env
, раскомментировав строку
#COMPOSE_FILE=
.
На уровне Postgres необходимо создать базу mitigator
. Скрипты миграций
создадут пользователя backend
и назначат ему необходимые права. После чего
на уровне СУБД нужно разрешить подключение для этого пользователя.
Экземпляры Mitigator´а подключаются к порту 5432/tcp. Строку подключения можно явно переопределить, по умолчанию используется:
services:
backend:
environment:
BACKEND_DATABASE_URI: "postgres://backend@${MITIGATOR_STORAGE_HOST}/mitigator?sslmode=disable"
Mitigator отправляет метрики в формате Graphite plaintext
protocol по
адресу: ${MITIGATOR_STORAGE_HOST}:2003
(TCP). Если нужно отправлять их
в несколько баз, адреса можно указать явно через запятую:
services:
fwstats:
environment:
FWSTATS_GRAPHITE_ADDRESS: "${MITIGATOR_STORAGE_HOST}:2003,another-host:2003"
Mitigator обращается к Graphite API по URL:
http://${MITIGATOR_STORAGE_HOST}:3080/render/
.
Только если ClickHouse используется в качестве бэкенда Graphite.
Развернуть полноценный стенд
(закомментировать строку #COMPOSE_FILE=
в файле .env
).
Выполнить команду:
docker-compose create clickhouse
Выполнить команды:
docker cp mitigator_clickhouse_1:/etc/clickhouse-server/config.d clickhouse-config
docker cp mitigator_clickhouse_1:/etc/clickhouse-server/users.d clickhouse-users
docker cp mitigator_clickhouse_1:/docker-entrypoint-initdb.d clickhouse
Выполнить команду:
docker-compose rm -sf clickhouse
Восстановить состояние файла .env
, раскомментировав строку
#COMPOSE_FILE=
.
В файле .env
задать переменную MITIGATOR_OWN_NAME=mitigator-1
.
Здесь mitigator-1
– имя экземпляра. Имя каждого экземпляра должно быть уникально.
В файле .env
задать переменную MITIGATOR_HOST_ADDRESS=192.0.2.1
.
Здесь 192.0.2.1
– адрес хоста для данного экземпляра.
Полученные настройки являются рекомендованными, но могут быть при необходимости изменены, например, см. раздел «Настройка времени хранения метрик в Graphite».
Для опытных администраторов, нестандартных случаев и желающих разобраться.
Нужно обеспечить:
Рекомендуется включить hyper-threading в BIOS.
При включенном HT следующая команда показывает 2
:
lscpu | grep 'Thread(s) per core:'
Многопроцессорные платформы рекомендуется использовать в NUMA-режиме с одним процессором на NUMA-ноду. Поддерживаются платформы с одной и двумя NUMA-нодами.
Для оптимальной производительности рекомендуется разносить сетевые карты по разным NUMA-нодам, чтобы каждый процессор работал только с портами на своей ноде.
Узнать NUMA-ноду устройства по его PCI-адресу:
$ cat /sys/bus/pci/devices/0000:04:00.0/numa_node
0
Для сетевых карт Intel и некоторых других в системе должен быть загружен модуль ядра, позволяющий DPDK работать с ними. Для карт Mellanox загрузка модулей ядра не требуется.
Необходимо:
Подобрать драйвер для установленных сетевых устройств (документация DPDK):
vfio-pci
: стандартный, рекомендуется по умолчанию;uio_pci_generic
: стандартный, используется вместо vfio-pci
для платформ
без VMX/SVM (см. ниже);virtio-pci
: нужен для виртуальных адаптеров QEMU/KVM;igb_uio
: нестандартный, нужен только если остальные драйвера
не работают (см. ниже).Настроить загрузку драйвера при запуске системы.
Привязка устройств к нужному драйверу производится через скрипт dpdk-devbind
(документация DPDK).
Его можно скачать по ссылке:
wget https://docs.mitigator.ru/dist/dpdk-devbind \
-O /usr/local/bin/dpdk-devbind
chmod +x /usr/local/bin/dpdk-devbind
Для просмотра состояния сетевых устройств и доступных драйверов:
dpdk-devbind --status-dev=net
В списке Network devices using DPDK-compatible driver
перечислены устройства,
привязанные к совместимому с DPDK драйверу. В списке Network devices using kernel driver
—
устройства со стандартными драйверами ядра. Доступные драйвера указываются для каждого
устройства в поле unused=
, например unused=i40e
. Отображаются только драйвера,
загруженные в системе.
Для загрузки драйвера vfio-pci
:
modprobe vfio-pci
Сопоставить имя устройства (например, eth0
или enp3s0f0
) и его PCI-адрес
можно через поле if=
в выводе dpdk-devbind
.
Рекомендуется привязывать все устройства одной командной dpdk-devbind
.
Для работы с vfio-pci
все порты одной карты должны быть привязаны к одному драйверу.
Для привязки устройств 0000:06:00.0
и 000:06:00.1
к драйверу vfio-pci
:
dpdk-devbind --bind vfio-pci 0000:06:00.0 0000:06:00.1
Если команда привязки выполнилась без сообщений об ошибках, драйвер можно
использовать. Устройство, привязанное к специальному драйверу, пропадает из системы
(вывод ip link
и т.п.). Привязка работает до перезагрузки, автоматическую привязку
можно будет настроить при установке Mitigator´а.
Внимание. Устройства, отмеченные в списке **Active**
, имеют IP-адрес. Обычно
это порт, через которой идет доступ к машине по SSH, поэтому скрипт не позволяет менять
драйвер таким устройствам.
Если нужный модуль ядра не загружается по умолчанию при старте системы, его загрузку можно включить так:
echo vfio-pci >> /etc/modules
Модуль vfio-pci
входит в состав ядра Linux. Необходим для работы DPDK с сетевыми
картами Intel. Требует поддержки процессором виртуализации ввода-вывода (например,
Intel VT-d). Настраивается в BIOS и в параметрах ядра через опцию iommu=on
.
Проверить поддержку:
grep 'vmx\|svm' /proc/cpuinfo >/dev/null && echo supported || echo not supported
Модуль igb_uio
устанавливается отдельно:
apt-get -y install linux-headers-amd64 dpdk-igb-uio-dkms
Для работы Mitigator´а необходимы настроенные hugepages (большие страницы памяти). Платформой могут поддерживаться hugepages разных размеров (2 МБ, 1 ГБ), рекомендуется настраивать страницы большего размера.
Необходимое количество hugepages зависит желаемого количества политик защиты. Рекомендуется отводить на hugepages 50-75% от общего объема памяти.
Рекомендуется использовать hugepages размером 1 ГБ, если поддерживаются платформой. Их можно выделить только при загрузке системы.
Проверить поддержку:
grep -m1 pdpe1gb /proc/cpuinfo
Настраивается опциями в параметрах ядра. Пример для выделения 64-х 1 ГБ страниц:
default_hugepagesz=1G hugepagesz=1G hugepages=64
Hugepages размером 2 МБ можно настраивать без перезагрузки системы.
Пример для выделения 2048-х 2 МБ страниц:
sysctl -w vm.nr_hugepages=2048
Пример для выделения при загрузке системы:
echo 'vm.nr_hugepages = 2048' > /etc/sysctl.d/hugepages.conf
Установка Docker Compose (подробная инструкция по установке)
`apt install docker-compose` — Debian, Ubuntu \
`yum install docker-compose` — CentOS
Если доступ к https://docker.mitigator.ru ведется через прокси, нужно настроить Docker.
Предполагается размещать все файлы в рабочем каталоге /srv/mitigator
:
mkdir -p /srv/mitigator
cd /srv/mitigator
Поместить базовую конфигурацию Docker Compose в рабочий каталог:
wget https://docs.mitigator.ru/dist/docker-compose.yml
Скачать базовый файл переменных и сохранить его под именем
.env
:
wget https://docs.mitigator.ru/dist/env -O /srv/mitigator/.env
В файле .env
задать:
VERSION
).ARCH
).DATA_PLANE_NR_POLICIES
).MITIGATOR_OWN_NAME
, обязательно).MITIGATOR_HOST_ADDRESS
, обязательно).TZ
).TOKEN
).Подробно эти настройки описаны внутри файла-примера.
Для максимальной производительности Mitigator´а нужно использовать сборку, оптимизированную под архитектуру и набор инструкций процессора целевой машины.
В файле .env
должна быть строка вида:
ARCH=haswell
Доступные варианты:
nehalem
- для SSE4.2,sandybridge
- для AVX,haswell
- для AVX2 и новее.Свой процессор можно найти в каталоге Intel, микроархитектура указана в
строке Code Name. Для большинства современных процессоров подойдет haswell
.
Необходимо создать файл data-plane.conf
, описывающий параметры запуска обработчика
пакетов:
touch data-plane.conf
Файл настроек по умолчанию пустой. Править его требуется только если нужно указать настройки, отличные от выбранных автоматически. Описание настроек.
Порты в приложении называются ext0
, int0
, ext1
, int1
и т.д. ext
— порты
внешней сети, int
— порты внутренней (защищаемой) сети. Объединяются в ext-int пары по
индексу в названии. ext-int пары портов используются для маршрутизации трафика в схеме
включения «в разрыв». В схеме включения «on-a-stick» ext-int пары не используются и могут
быть любыми.
Если порты не заданы в настройках, используются все порты в системе, доступные DPDK. В таком случае, порты перечисляются в порядке возрастания их PCI-адресов. ext-int пары портов формируются только для портов с общей NUMA-ноды.
Если порядок перечисления портов по умолчанию не совпадает с физическим подключением линков, либо требуется ограничить список используемых портов, порты можно настроить явно:
ext0: 04:00.1
int0: 04:00.0
ext1: 84:00.1
int1: 84:00.0
Перед запуском Mitigator´а отведенные ему сетевые порты должны быть под управлением драйвера, выбранного при подготовке системы.
Для систем под управлением systemd предлагается выполнять привязку перед запуском службы Mitigator´а (см. следующий пункт).
Загрузить скрипт привязки и сделать его исполняемым:
wget https://docs.mitigator.ru/dist/dpdk-devbind \
-O /usr/local/bin/dpdk-devbind
chmod +x /usr/local/bin/dpdk-devbind
Создать каталог /etc/systemd/system/mitigator.service.d
:
mkdir -p /etc/systemd/system/mitigator.service.d
В нем разместить файл nics.conf
такого вида:
[Service]
ExecStartPre=/usr/local/bin/dpdk-devbind -b vfio-pci 04:00.0 04:00.1 84:00.0 84:00.1
Драйвер и PCI-адреса заменить на необходимые.
Mitigator запускается командой docker-compose up -d
.
Для систем под управлением systemd предлагается настроить готовую службу:
Разместить файл службы Mitigator´а:
wget https://docs.mitigator.ru/dist/mitigator.service \
-O /etc/systemd/system/mitigator.service
Настроить автозапуск Mitigator´а:
systemctl enable mitigator
При первом запуске или обновлении нужно совершить вход в хранилище образов со своими учетными данными:
docker login docker.mitigator.ru
Запустить Mitigator:
systemctl start mitigator
При первом запуске понадобится некоторое время для загрузки
образов. Процесс можно наблюдать в выводе docker-compose logs -f
или, для systemd:
journalctl -u mitigator -f
Спустя некоторое время, web-интерфейс Mitigator´а будет доступен по адресу интерфейса управления.
После установки и запуска настроить систему для её стабильной и безопасной работы.
Если доступ к https://docker.mitigator.ru ведется через прокси, необходимо настроить Docker.
В системах под управлением systemd предлагается:
Создать drop-in к службе Docker´а с указанием прокси в окружении (детали подключения к прокси заменить на актуальные):
mkdir -p /etc/systemd/system/docker.service.d
cat >/etc/systemd/system/docker.service.d/proxy.conf <<END
[Service]
Environment=HTTP_PROXY=http://user:password@proxy.local:1234
Environment=HTTPS_PROXY=http://user:password@proxy.local:1234
Environment=NO_PROXY=docker.local
END
Добавить сертификат прокси в доверенные для Docker´а
(/path/to/proxy.crt
заменить на путь к сертификату прокси):
mkdir -p /etc/docker/certs.d/docker.mitigator.ru
cp /path/to/proxy.crt /etc/docker/certs.d/docker.mitigator.ru/ca.crt
Обновить описание службы Docker и перезапустить её:
systemctl daemon-reload
systemctl restart docker
Если Mitigator будет сообщаться с сервером лицензий (ls.mitigator.ru),
почтовым сервером и службой «Весточка» через прокси, нужно указать переменные
окружения. Для этого нужно создать файл docker-compose.override.yml
с таким содержимым:
version: "2.2"
services:
backend:
environment:
HTTP_PROXY: "http://user:password@proxy.local:3128"
HTTPS_PROXY: "http://user:password@proxy.local:3128"
При необходимости задать также NO_PROXY
(адреса, к которым нужно
обращаться без прокси), требуется включать в нее .mitigator
и localhost
:
NO_PROXY: "<новые серверы>,.mitigator,localhost"
После этого нужно перезапустить службу бэкенда:
docker-compose up -d backend
Для замены самоподписанного сертификата cert.crt
с ключом cert.key
на собственный, необходимо смонтировать сертификат и ключ через
/srv/mitigator/docker-compose.override.yml
:
version: "2.2"
services:
nginx:
volumes:
- example.com.crt:/etc/nginx/cert.crt:ro
- example.com.key:/etc/nginx/cert.key:ro
После этого нужно перезапустить службу Nginx:
docker-compose up -d nginx
Симптомы:
при загрузке модуля:
modprobe: FATAL: Module igb_uio not found in directory /lib/modules/4.9.0-6-amd64
при установке пакета:
Module build for kernel 4.9.0-6-amd64 was skipped since the
kernel headers for this kernel does not seem to be installed.
Необходимо установить пакет linux-headers-amd64
(Debian) и убедиться,
что загружена версия ядра, соответствующая версии этого пакета, после
чего выполнить:
dkms autoinstall
По умолчанию эти команды работают только для пользователей группы
docker
и для root
. Это стандартная мера безопасности Docker.
Решение:
sudo usermod -aG docker $USER
newgrp docker
Такое сообщение появляется в web-интерфейсе, если обработчик пакетов не
запустился или остановился. Диагностика (из /srv/mitigator
):
docker-compose logs data-plane
Ниже приводятся некоторые типовые проблемы и характерные сообщения.
EAL: Cannot get hugepage information.
Сообщение:
EAL: No free hugepages reported in hugepages-2048kB
EAL: No free hugepages reported in hugepages-1048576kB
EAL: FATAL: Cannot get hugepage information.
EAL: Cannot get hugepage information.
EAL: Error exiting with code: 1
Cause: DPDK init error: 1
Причина: не выделены или полностью заняты hugepages.
Нужно проверить наличие свободных hugepages и убедиться, что значения
HugePages_Total
и Hugepagesize
совпадают с настроенными,
а HugePages_Free
равно HugePages_Total
(или отличается не более,
чем на несколько страниц):
grep Huge /proc/meminfo
no port found with PCI address BB:DD.F
Сообщение:
/data-plane/config.click:12: no port found with pci address '04:00.0'
Нужно убедиться, что адрес устройства 04:00.0 соответствует действительности, и что устройство привязано к драйверу для DPDK точно так же, как при подготовке системы.
При просмотре логов docker-compose logs data-plane
сообщение:
Segmentation fault (core dumped)
Чтобы незамедлительно восстановить работу, можно дать команду:
docker-compose up -d data-plane
Далее рекомендуется связаться с разработчиками с целью точной диагностики и исправления и направить им:
Описание ситуации, в которой произошла проблема (действий с Mitigator´ом, входящего трафика).
Описание аппаратной конфигурации сервера:
Файл /srv/mitigator/data-plane.conf
.
Файл сlick.stacktrace, который по умолчанию сохраняется
в /var/lib/docker/volumes/mitigator_coredumps/_data/click.stacktrace
.
Core dump (слепок памяти процесса), который по умолчанию сохраняется
в /var/lib/docker/volumes/mitigator_coredumps/_data/core
. Его
размер — гигабайты, но он обычно хорошо сжимается.
В некоторых дистрибутивах (например, Ubuntu) файл core
не появляется,
потому что обработка сбоев настроена иначе.
Проверить настройку можно так:
cat /proc/sys/kernel/core_pattern
По умолчанию в Linux значение core
. Если оно другое:
Запомнить исходное значение:
cat /proc/sys/kernel/core_pattern > /tmp/old_core_pattern
Заменить его на core
:
echo core | sudo tee /proc/sys/kernel/core_pattern
Воспроизвести проблему, получить файл core
по указанному выше пути.
Восстановить оригинальное значение:
cat /tmp/old_core_pattern | sudo tee /proc/sys/kernel/core_pattern