
Das erste Open-Source-DDoS-Schutzsystem
Gatekeeper ist das erste Open-Source-DDoS-Schutzsystem. Es ist darauf ausgelegt, auf jede Spitzenbandbreite zu skalieren, sodass es sowohl heutigen als auch zukünftigen DDoS-Angriffen standhalten kann. Trotz der geografisch verteilten Architektur von Gatekeeper ist die Netzwerkrichtlinie, die alle Entscheidungen beschreibt, die für den eingehenden Verkehr durchgesetzt werden müssen, zentralisiert. Diese zentralisierte Richtlinie ermöglicht es Netzwerkbetreibern, verteilte Algorithmen zu nutzen, die unter sehr hoher Latenz (z. B. verteilte Datenbanken) nicht praktikabel wären, und mehrere Multi-Vektor-DDoS-Angriffe gleichzeitig zu bekämpfen.
Die beabsichtigten Benutzer von Gatekeeper sind Netzwerkbetreiber von Institutionen, Dienste- und Inhaltsanbietern, Unternehmensnetzwerken usw. Es ist nicht für die Nutzung durch einzelne Internetnutzer gedacht.
Weitere Informationen finden Sie im Gatekeeper-Wiki.
DPDK erfordert die Verwendung von Hugepages; Anweisungen zum Einbinden von Hugepages finden Sie in der Dokumentation zu den Systemanforderungen. Auf vielen Systemen ist die folgende Hugepages-Einrichtung ausreichend:
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pci aktivierenDas Linux-Kernelmodul vfio-pci wird benötigt, um NICs an DPDK/Gatekeeper zu binden.
Damit vfio-pci funktioniert, müssen sowohl das BIOS als auch der Kernel es unterstützen.
BIOS müssen VT-d aktiviert haben.
BIOS können VT-d als "Intel (R) VT for Directed I/O",
"Intel (R) VT-d Feature", "Intel VT-d", "VT-d" oder ähnliche Varianten bezeichnen;
weitere Beispiele finden Sie unter "BIOS VT-d" auf
Google Images.
Manche BIOS erfordern möglicherweise, dass eine Option namens
"Intel (R) Virtualization Technology" (oder Varianten dieser Zeichenfolge) aktiviert wird,
bevor VT-d aktiviert werden kann.
Um zu überprüfen, ob VT-d im BIOS aktiviert ist, führen Sie nach dem Booten von Linux den folgenden Befehl aus:
$ dmesg | grep -e DMAR
Wenn der obige Befehl einige Zeilen ausgibt, sollte VT-d aktiviert sein. Andernfalls muss man zurück ins BIOS gehen, um es zu aktivieren. Weitere Informationen zur Überprüfung, ob VT-d im BIOS aktiviert ist, finden Sie auf dieser Seite.
Sobald VT-d im BIOS aktiviert ist, muss sichergestellt werden, dass der Kernel IOMMU unterstützt. Beachten Sie, dass eine Kernelversion größer als 3.6 erforderlich ist, um IOMMU zu unterstützen. Man kann überprüfen, ob der laufende Kernel IOMMU standardmäßig aktiviert hat, mit dem folgenden Befehl:
$ grep CONFIG_INTEL_IOMMU_DEFAULT_ON /boot/config-`uname -r`
Höchstwahrscheinlich wird der obige Befehl
# CONFIG_INTEL_IOMMU_DEFAULT_ON is not set ausgeben, d.h.
der laufende Kernel hat IOMMU nicht standardmäßig aktiviert.
Alternative Möglichkeiten zur Überprüfung der Kernel-Build-Optionen
(z. B. CONFIG_INTEL_IOMMU_DEFAULT_ON) finden Sie auf
dieser Seite.
Wenn der Kernel IOMMU nicht standardmäßig aktiviert hat,
muss der Kernel-Boot-Parameter intel_iommu=on über GRUB übergeben werden.
Informationen dazu, warum der Boot-Parameter intel_iommu=on benötigt wird,
finden Sie auf dieser Seite.
Man kann überprüfen, ob der laufende Kernel diesen Parameter erhalten hat, mit
dem folgenden Befehl:
$ cat /proc/cmdline | grep intel_iommu=on
Wenn der laufende Kernel den Parameter intel_iommu=on nicht erhalten hat,
fügen Sie ihn zu GRUB hinzu und starten Sie die Maschine neu.
Informationen zum Hinzufügen eines Boot-Parameters zu GRUB finden Sie
hier.
Sobald VT-d im BIOS aktiviert ist und der Kernel IOMMU unterstützt, kann man mit einem der folgenden Befehle überprüfen, ob alles bereit ist:
$ ls /sys/kernel/iommu_groups
ODER
$ dmesg | grep -ie 'IOMMU\s\+enabled'
Alles ist bereit, wenn die Ausgaben der obigen Befehle nicht leer sind.
Gatekeeper-Debian-Pakete sind für Ubuntu 24.04 LTS auf der Seite Releases des Projekts verfügbar.
Sobald die Pakete heruntergeladen sind, können sie mit den folgenden Befehlen installiert werden:
$ 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
Bei Installation über Debian-Pakete befinden sich die Gatekeeper-Konfigurationsdateien
in /etc/gatekeeper. Sie sollten mindestens die Datei net.lua bearbeiten und die
Variablen front_ports, front_ips, back_ports und back_ips entsprechend Ihrer
Umgebung setzen.
Die anderen Lua-Dateien konfigurieren verschiedene funktionale Blöcke von Gatekeeper. Bitte lesen Sie das Wiki des Projekts für weitere Informationen darüber, ob diese in Ihrer Einrichtung geändert werden müssen.
Sie müssen auch die Datei /etc/gatekeeper/envvars bearbeiten und die
Variable GATEKEEPER_INTERFACES auf die PCI-Adressen der Netzwerkadapter setzen,
die an DPDK gebunden werden sollen. Diese können mit dem Befehl lshw ermittelt werden. Beispiel:
# 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
...
Bei dieser Ausgabe setzen Sie GATEKEEPER_INTERFACES wie folgt:
GATEKEEPER_INTERFACES="08:00.0 08:00.1"
In derselben Datei können Sie optional
Environmental Abstraction Layer-Optionen
in der Variable DPDK_ARGS und
Gatekeeper-spezifische Optionen
in GATEKEEPER_ARGS angeben.
Führen Sie die folgenden Befehle aus, um Gatekeeper zu starten und sicherzustellen, dass es automatisch bei Neustarts gestartet wird.
$ sudo systemctl start gatekeeper
$ sudo systemctl enable gatekeeper
Installieren Sie die folgenden Softwareabhängigkeiten:
$ 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
Hinweis: libmnl0 und libmnl-dev werden benötigt, um gatekeeper zu kompilieren und auszuführen,
aber nur libmnl0 wird zum einfachen Ausführen von gatekeeper benötigt.
libkmod2 und libkmod-dev werden benötigt, um gatekeeper zu kompilieren und auszuführen,
aber nur libkmod2 wird zum einfachen Ausführen von gatekeeper benötigt.
libnuma-dev wird benötigt, um das neueste DPDK zu kompilieren und NUMA-Systeme zu unterstützen.
Das Paket libelf-dev wird benötigt, um DPDK mit Unterstützung zum Lesen von
BPF-Programmen aus ELF-Dateien zu kompilieren, aber nur libelf1 wird zum Ausführen benötigt.
Das Paket libc6-dev-i386 wird benötigt, um die BPF-Programme im Ordner zu kompilieren.
Die Pakete , , , und sind für BIRD.
Das Paket wird verwendet, um Gatekeeper-Debian-Pakete zu erstellen.
Die Pakete und werden benötigt, um DPDK zu erstellen und
Python-Skripte wie auszuführen.
wird benötigt, um Gatekeeper zu kompilieren, aber nur wird zum
Ausführen von Gatekeeper benötigt.
und werden zum Erstellen von DPDK benötigt.
wird zum Kompilieren von Gatekeeper benötigt.
Um DPDK zu verwenden, stellen Sie sicher, dass Sie alle Umgebungsanforderungen erfüllen.
Klonen Sie das Gatekeeper-Repository, einschließlich der Submodule, die die Gatekeeper-Abhängigkeiten enthalten:
$ git clone --recursive http://github.com/AltraMayor/gatekeeper.git
Wenn Sie die --recursive-Clone-Option nicht verwenden, müssen Sie die Submodule,
die die Abhängigkeiten enthalten, aus dem gatekeeper-Verzeichnis beziehen:
$ git submodule init
$ git submodule update
Dieser Abschnitt erklärt, wie man Gatekeeper manuell erstellt. Wenn Sie Debian-Pakete erstellen möchten, lesen Sie den Abschnitt Pakete erstellen.
Führen Sie im gatekeeper-Verzeichnis das Setup-Skript aus:
$ . setup.sh
Dieses Skript kompiliert DPDK, LuaJIT und BIRD und lädt die benötigten Kernelmodule.
Darüber hinaus speichert es die Schnittstellennamen und ihre jeweiligen PCI-Adressen
in der Datei lua/if_map.lua, sodass Schnittstellennamen in den Gatekeeper-Konfigurationsdateien
verwendet werden können.
Sobald DPDK und LuaJIT kompiliert sind, kann gatekeeper kompiliert werden:
$ make
Bevor gatekeeper verwendet werden kann, müssen die Netzwerkadapter an DPDK gebunden werden.
Hierfür können Sie das Skript dependencies/dpdk/usertools/dpdk-devbind.py verwenden.
Beispiel:
$ sudo dependencies/dpdk/usertools/dpdk-devbind.py --bind=vfio-pci enp131s0f0
Dieser Befehl bindet die Schnittstelle enp131s0f0 an den vfio-pci-Treiber,
sodass Frames direkt an DPDK und nicht an den Kernel übergeben werden können. Beachten Sie,
dass diese Bindung nach der Einrichtung von Gatekeeper in den obigen Schritten erfolgen muss,
damit die gebundene Schnittstelle in der Liste der Schnittstellen in lua/if_map.lua erscheint.
Sobald gatekeeper kompiliert und die Umgebung korrekt konfiguriert ist, führen Sie aus:
$ sudo build/gatekeeper [EAL OPTIONS] -- [GATEKEEPER OPTIONS]
Wobei [EAL OPTIONS] vor einem doppelten Bindestrich angegeben werden und die Parameter für
die Environmental Abstraction Layer
von DPDK darstellen, und [GATEKEEPER OPTIONS] nach dem doppelten Bindestrich angegeben werden und
Gatekeeper-spezifische Optionen
darstellen.
Die frühe Konfiguration des Systems, einschließlich der Geräte- und Speicherkonfiguration in DPDK, wird auf stdout protokolliert. Sobald Gatekeeper gestartet ist, werden alle Informationen im Gatekeeper-Protokoll ausgegeben.
Gatekeeper-Debian-Pakete können mit den folgenden Befehlen erstellt werden. Sie sind dazu gedacht, aus dem Repository-Stammverzeichnis ausgeführt zu werden, und setzen voraus, dass die Git-Submodule abgerufen und die Build-Abhängigkeiten wie oben beschrieben installiert wurden. Gatekeeper und die Submodule werden während des Paketerstellungsprozesses automatisch kompiliert.
$ tar --exclude-vcs -Jcvf ../gatekeeper_1.2.0.orig.tar.xz -C .. gatekeeper
$ debuild -uc -us
Das Gatekeeper-Paket wird im übergeordneten Verzeichnis verfügbar sein.
bpf/autoconfflexbisonlibncurses5-devlibreadline-devdevscriptspython3python3-pyelftoolsdpdk-devbind.pylibcap-devlibcap2mesonninja-buildpkg-config