
Первая система защиты от DDoS с открытым исходным кодом
Gatekeeper — это первая система с открытым исходным кодом для защиты от DDoS-атак. Она спроектирована так, чтобы масштабироваться до любой пиковой пропускной способности, и может выдерживать DDoS-атаки как сегодняшние, так и будущие. Несмотря на географически распределенную архитектуру Gatekeeper, сетевая политика, описывающая все решения, которые должны применяться к входящему трафику, является централизованной. Эта централизованная политика позволяет сетевым операторам использовать распределенные алгоритмы, которые были бы нежизнеспособны при очень высокой задержке (например, распределенные базы данных), и одновременно бороться с множественными многовекторными DDoS-атаками.
Предполагаемые пользователи Gatekeeper — это сетевые операторы учреждений, поставщиков услуг и контента, корпоративных сетей и т.д. Он не предназначен для использования отдельными пользователями Интернета.
Для получения дополнительной информации см. вики Gatekeeper.
DPDK требует использования огромных страниц; инструкции по монтированию огромных страниц доступны в документации по требованиям. На многих системах достаточно следующей настройки огромных страниц:
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pciМодуль ядра Linux vfio-pci необходим для привязки сетевых интерфейсов к DPDK/Gatekeeper.
Чтобы vfio-pci работал, его должны поддерживать как BIOS, так и ядро.
В BIOS должна быть включена технология VT-d.
BIOS может обозначать VT-d как "Intel (R) VT for Directed I/O",
"Intel (R) VT-d Feature", "Intel VT-d", "VT-d" или аналогичными вариациями;
дополнительные примеры можно найти, выполнив поиск "BIOS VT-d" в
Google Images.
В некоторых BIOS может потребоваться включить опцию
"Intel (R) Virtualization Technology" (или её вариации) до того, как VT-d станет доступна.
Чтобы проверить, включена ли VT-d в BIOS, выполните следующую команду после загрузки Linux:
$ dmesg | grep -e DMAR
Если указанная выше команда выводит какие-либо строки, VT-d должна быть включена. В противном случае необходимо вернуться в BIOS и включить её. Дополнительная информация о проверке включения VT-d в BIOS доступна на этой странице.
После включения VT-d в BIOS необходимо убедиться, что ядро поддерживает IOMMU. Обратите внимание, что для поддержки IOMMU требуется версия ядра выше 3.6. Проверить, включен ли IOMMU в текущем ядре по умолчанию, можно с помощью следующей команды:
$ grep CONFIG_INTEL_IOMMU_DEFAULT_ON /boot/config-`uname -r`
Скорее всего, указанная выше команда выведет
# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set, то есть
текущее ядро не имеет IOMMU, включенного по умолчанию.
Альтернативные способы проверки параметров сборки ядра
(например, CONFIG_INTEL_IOMMU_DEFAULT_ON) доступны на
этой странице.
Если ядро не имеет IOMMU, включенного по умолчанию,
необходимо передать параметр загрузки ядра intel_iommu=on через GRUB.
Информацию о том, зачем нужен параметр загрузки intel_iommu=on,
см. на этой странице.
Проверить, получил ли текущее ядро этот параметр, можно с помощью
следующей команды:
$ cat /proc/cmdline | grep intel_iommu=on
Если текущее ядро не получило параметр intel_iommu=on,
добавьте его в GRUB и перезагрузите машину.
Информация о том, как добавить параметр загрузки в GRUB, находится
здесь.
После включения VT-d в BIOS и поддержки IOMMU ядром, можно проверить, что всё настроено, с помощью одной из следующих команд:
$ ls /sys/kernel/iommu_groups
ИЛИ
$ dmesg | grep -ie 'IOMMU\s\+enabled'
Всё настроено, если выводы указанных выше команд не пусты.
Пакеты Gatekeeper Debian доступны для Ubuntu 24.04 LTS на странице Releases проекта.
После загрузки пакетов их можно установить следующими командами:
$ tar -zxvf gatekeeper-ubuntu-24.04-packages.tar.gz
$ cd gatekeeper-ubuntu-24.04-packages
$ sudo dpkg -i gatekeeper-bird_*_amd64.deb gatekeeper_*_amd64.deb
При установке через пакеты Debian файлы конфигурации Gatekeeper находятся
в /etc/gatekeeper. Вам следует отредактировать как минимум файл net.lua и задать
переменные front_ports, front_ips, back_ports и back_ips в соответствии с
вашим окружением.
Остальные файлы Lua настраивают различные функциональные блоки Gatekeeper. Пожалуйста, обратитесь к вики проекта за дополнительной информацией о том, нужно ли их изменять в вашей конфигурации.
Вам также необходимо отредактировать файл /etc/gatekeeper/envvars и задать
переменную GATEKEEPER_INTERFACES, указав адреса PCI сетевых адаптеров,
которые будут привязаны к DPDK. Их можно найти с помощью команды lshw. Например:
# lshw -c network -businfo
Bus info Device Class Description
=======================================================
pci@0000:08:00.0 eth0 network I350 Gigabit Network Connection
pci@0000:08:00.1 eth1 network I350 Gigabit Network Connection
...
Учитывая этот вывод, задайте GATEKEEPER_INTERFACES следующим образом:
GATEKEEPER_INTERFACES="08:00.0 08:00.1"
В этом же файле можно дополнительно указать
параметры Environmental Abstraction Layer
в переменной DPDK_ARGS и
специфичные для Gatekeeper параметры
в GATEKEEPER_ARGS.
Выполните следующие команды, чтобы запустить Gatekeeper и обеспечить его автоматический запуск при перезагрузках.
$ sudo systemctl start gatekeeper
$ sudo systemctl enable gatekeeper
Установите следующие зависимости программного обеспечения:
$ sudo apt-get update
$ sudo apt-get -y -q install git clang devscripts doxygen libhugetlbfs-bin \
build-essential gcc-multilib linux-headers-`uname -r` libmnl0 libmnl-dev \
libkmod2 libkmod-dev libnuma-dev libelf1 libelf-dev libc6-dev-i386 \
autoconf flex bison libncurses5-dev libreadline-dev python3 \
python3-pyelftools libcap-dev libcap2 meson ninja-build pkg-config
Примечание: Оба пакета libmnl0 и libmnl-dev необходимы для компиляции и запуска
gatekeeper, но только libmnl0 необходим для простого запуска gatekeeper.
Оба пакета libkmod2 и libkmod-dev необходимы для компиляции и запуска gatekeeper,
но только libkmod2 необходим для простого запуска gatekeeper.
libnuma-dev необходим для компиляции последней версии DPDK и поддержки систем NUMA.
Пакет libelf-dev необходим для компиляции DPDK с поддержкой чтения
программ BPF из ELF-файлов, но для запуска достаточно только libelf1.
Пакет libc6-dev-i386 необходим для компиляции программ BPF в
папке .
Пакеты , , , и
предназначены для BIRD. Пакет используется для
сборки пакетов Gatekeeper Debian.
Пакеты и необходимы для сборки DPDK и
запуска скриптов Python, таких как .
необходим для компиляции Gatekeeper, но для запуска Gatekeeper
достаточно только .
и необходимы для сборки DPDK.
необходим для компиляции Gatekeeper.
Для использования DPDK убедитесь, что выполнены все требования к окружению.
Клонируйте репозиторий Gatekeeper, включая подмодули, которые содержат зависимости Gatekeeper:
$ git clone --recursive http://github.com/AltraMayor/gatekeeper.git
Если вы не использовали опцию --recursive при клонировании, вам необходимо получить
подмодули, содержащие зависимости, из каталога gatekeeper:
$ git submodule init
$ git submodule update
В этом разделе объясняется, как собрать Gatekeeper вручную. Если вы хотите собрать пакеты Debian, обратитесь к разделу Как собрать пакеты.
Находясь в каталоге gatekeeper, выполните сценарий настройки:
$ . setup.sh
Этот сценарий компилирует DPDK, LuaJIT и BIRD, а также загружает необходимые
модули ядра. Кроме того, он сохраняет имена интерфейсов и их
соответствующие адреса PCI в файле lua/if_map.lua, чтобы имена
интерфейсов можно было использовать в файлах конфигурации Gatekeeper.
После компиляции DPDK и LuaJIT можно скомпилировать gatekeeper:
$ make
Перед использованием gatekeeper сетевые адаптеры должны быть привязаны к DPDK.
Для этого можно использовать скрипт dependencies/dpdk/usertools/dpdk-devbind.py.
Например:
$ sudo dependencies/dpdk/usertools/dpdk-devbind.py --bind=vfio-pci enp131s0f0
Эта команда привязывает интерфейс enp131s0f0 к драйверу vfio-pci,
чтобы кадры могли передаваться напрямую DPDK, минуя ядро. Обратите внимание,
что эта привязка должна выполняться после настройки Gatekeeper на шагах
выше, чтобы связанный интерфейс появился в списке интерфейсов в
lua/if_map.lua.
После компиляции gatekeeper и правильной настройки окружения выполните:
$ sudo build/gatekeeper [EAL OPTIONS] -- [GATEKEEPER OPTIONS]
Где [EAL OPTIONS] указываются перед двойным тире и представляют собой
параметры Environmental Abstraction Layer DPDK,
а [GATEKEEPER OPTIONS] указываются после двойного тире и представляют
специфичные для Gatekeeper параметры.
Начальная конфигурация системы, включая конфигурацию устройств и памяти в DPDK, будет выведена в stdout. После загрузки Gatekeeper вся информация будет выводиться в журнал Gatekeeper.
Пакеты Gatekeeper Debian можно собрать с помощью следующих команд. Они предназначены для выполнения из корня репозитория и предполагают, что подмодули git были получены, а зависимости сборки установлены, как указано выше. Gatekeeper и подмодули будут автоматически скомпилированы в процессе сборки пакета.
$ tar --exclude-vcs -Jcvf ../gatekeeper_1.2.0.orig.tar.xz -C .. gatekeeper
$ debuild -uc -us
Пакет Gatekeeper будет доступен в родительском каталоге.
bpf/autoconfflexbisonlibncurses5-devlibreadline-devdevscriptspython3python3-pyelftoolsdpdk-devbind.pylibcap-devlibcap2mesonninja-buildpkg-config