
Il primo sistema di protezione DDoS open-source
Gatekeeper è il primo sistema di protezione DDoS open source. È progettato per scalare a qualsiasi larghezza di banda di picco, in modo da resistere agli attacchi DDoS sia di oggi che di domani. Nonostante l'architettura geograficamente distribuita di Gatekeeper, la politica di rete che descrive tutte le decisioni da applicare al traffico in arrivo è centralizzata. Questa politica centralizzata consente agli operatori di rete di sfruttare algoritmi distribuiti che non sarebbero praticabili con latenze molto elevate (ad esempio database distribuiti) e di contrastare più attacchi DDoS multi-vettore contemporaneamente.
Gli utenti previsti di Gatekeeper sono gli operatori di rete di istituzioni, fornitori di servizi e contenuti, reti aziendali, ecc. Non è destinato all'uso da parte di singoli utenti Internet.
Per maggiori informazioni, consulta la wiki di Gatekeeper.
DPDK richiede l'uso di hugepages; le istruzioni per montare gli hugepages sono disponibili nella documentazione dei requisiti. Su molti sistemi, la seguente configurazione di hugepages è sufficiente:
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pciIl modulo del kernel Linux vfio-pci è necessario per associare le NIC a DPDK/Gatekeeper. Affinché vfio-pci funzioni, sia il BIOS che il kernel devono supportarlo. I BIOS devono avere VT-d abilitato. I BIOS potrebbero identificare VT-d come "Intel (R) VT for Directed I/O", "Intel (R) VT-d Feature", "Intel VT-d", "VT-d" o variazioni simili; per ulteriori esempi, cerca "BIOS VT-d" su Google Immagini. Alcuni BIOS potrebbero richiedere l'abilitazione di un'opzione chiamata "Intel (R) Virtualization Technology" (o varianti di questa stringa) prima che VT-d possa essere abilitato.
Per verificare che VT-d sia abilitato nel BIOS, esegui il seguente comando dopo l'avvio di Linux:
$ dmesg | grep -e DMAR
Se il comando sopra restituisce alcune righe, VT-d dovrebbe essere abilitato. Altrimenti, bisogna tornare al BIOS per abilitarlo. Ulteriori informazioni su come verificare che VT-d sia abilitato nel BIOS sono disponibili su questa pagina.
Una volta che VT-d è abilitato nel BIOS, bisogna assicurarsi che il kernel supporti IOMMU. Nota che è necessaria una versione del kernel maggiore di 3.6 per supportare IOMMU. Si può verificare se il kernel in esecuzione ha IOMMU abilitato per impostazione predefinita con il seguente comando:
$ grep CONFIG_INTEL_IOMMU_DEFAULT_ON /boot/config-`uname -r`
Molto probabilmente, il comando sopra restituirà # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set, ovvero il kernel in esecuzione non ha IOMMU abilitato per impostazione predefinita. Modi alternativi per verificare le opzioni di build del kernel (cioè CONFIG_INTEL_IOMMU_DEFAULT_ON) sono disponibili su questa pagina.
Se il kernel non ha IOMMU abilitato per impostazione predefinita, è necessario passare il parametro di avvio del kernel intel_iommu=on tramite GRUB. Per informazioni sul perché è necessario il parametro di avvio intel_iommu=on, consulta questa pagina. Si può verificare se il kernel in esecuzione ha ricevuto questo parametro con il comando seguente:
$ cat /proc/cmdline | grep intel_iommu=on
Se il kernel in esecuzione non ha ricevuto il parametro intel_iommu=on, aggiungilo a GRUB e riavvia la macchina. Le informazioni su come aggiungere un parametro di avvio a GRUB si trovano qui.
Una volta che VT-d è abilitato nel BIOS e il kernel supporta IOMMU, si può verificare che tutto sia a posto con uno dei seguenti comandi:
$ ls /sys/kernel/iommu_groups
OPPURE
$ dmesg | grep -ie 'IOMMU\s\+enabled'
Tutto è a posto se gli output dei comandi sopra non sono vuoti.
I pacchetti Debian di Gatekeeper sono disponibili per Ubuntu 24.04 LTS nella pagina Releases del progetto.
Una volta scaricati i pacchetti, possono essere installati con i comandi seguenti:
$ 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
Quando installato tramite pacchetti Debian, i file di configurazione di Gatekeeper si trovano in /etc/gatekeeper. Dovresti modificare almeno il file net.lua e impostare le variabili front_ports, front_ips, back_ports e back_ips in base al tuo ambiente.
Gli altri file Lua configurano diversi blocchi funzionali di Gatekeeper. Consulta la wiki del progetto per ulteriori informazioni sulla necessità di modificarli nella tua configurazione.
Devi anche modificare il file /etc/gatekeeper/envvars e impostare la variabile GATEKEEPER_INTERFACES sugli indirizzi PCI degli adattatori di rete da associare a DPDK. Questi possono essere trovati usando il comando lshw. Ad esempio:
# 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
...
Dato questo output, imposta GATEKEEPER_INTERFACES come segue:
GATEKEEPER_INTERFACES="08:00.0 08:00.1"
Nello stesso file, puoi opzionalmente specificare le opzioni del livello di astrazione ambientale nella variabile DPDK_ARGS e le opzioni specifiche di Gatekeeper in GATEKEEPER_ARGS.
Esegui i comandi seguenti per avviare Gatekeeper e assicurarti che si avvii automaticamente ai riavvii.
$ sudo systemctl start gatekeeper
$ sudo systemctl enable gatekeeper
Installa le seguenti dipendenze software:
$ 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
Nota: Sia libmnl0 che libmnl-dev sono necessari per compilare ed eseguire gatekeeper, ma solo libmnl0 è necessario per la semplice esecuzione di gatekeeper. Sia libkmod2 che libkmod-dev sono necessari per compilare ed eseguire gatekeeper, ma solo libkmod2 è necessario per la semplice esecuzione di gatekeeper. libnuma-dev è necessario per compilare l'ultima versione di DPDK e per supportare sistemi NUMA. Il pacchetto libelf-dev è necessario per compilare DPDK con il supporto alla lettura di programmi BPF da file ELF, ma solo libelf1 è necessario per eseguirlo. Il pacchetto libc6-dev-i386 è necessario per compilare i programmi BPF nella cartella . I pacchetti , , , e sono per BIRD. Il pacchetto è usato per creare i pacchetti Debian di Gatekeeper. I pacchetti e sono necessari per compilare DPDK e per eseguire script Python come . è necessario per compilare Gatekeeper, ma solo è necessario per eseguire Gatekeeper. e sono necessari per compilare DPDK. è necessario per compilare Gatekeeper.
Per usare DPDK, assicurati di avere tutti i requisiti ambientali.
Clona il repository di Gatekeeper, inclusi i sottomoduli che contengono le dipendenze di Gatekeeper:
$ git clone --recursive http://github.com/AltraMayor/gatekeeper.git
Se non usi l'opzione --recursive durante la clonazione, devi ottenere i sottomoduli che contengono le dipendenze dalla directory gatekeeper:
$ git submodule init
$ git submodule update
Questa sezione spiega come compilare Gatekeeper manualmente. Se desideri creare pacchetti Debian, consulta la sezione Come creare i pacchetti.
Mentre ti trovi nella directory gatekeeper, esegui lo script di configurazione:
$ . setup.sh
Questo script compila DPDK, LuaJIT e BIRD, e carica i moduli del kernel necessari. Inoltre, salva i nomi delle interfacce e i rispettivi indirizzi PCI nel file lua/if_map.lua in modo che i nomi delle interfacce possano essere usati nei file di configurazione di Gatekeeper.
Una volta che DPDK e LuaJIT sono compilati, gatekeeper può essere compilato:
$ make
Prima di poter usare gatekeeper, le schede di rete devono essere associate a DPDK. Per questo, puoi usare lo script dependencies/dpdk/usertools/dpdk-devbind.py. Ad esempio:
$ sudo dependencies/dpdk/usertools/dpdk-devbind.py --bind=vfio-pci enp131s0f0
Questo comando associa l'interfaccia enp131s0f0 al driver vfio-pci in modo che i frame possano essere passati direttamente a DPDK invece che al kernel. Nota che questa associazione deve avvenire dopo la configurazione di Gatekeeper nei passaggi precedenti, in modo che l'interfaccia associata appaia nell'elenco delle interfacce in lua/if_map.lua.
Una volta che gatekeeper è compilato e l'ambiente è configurato correttamente, esegui:
$ sudo build/gatekeeper [EAL OPTIONS] -- [GATEKEEPER OPTIONS]
Dove [EAL OPTIONS] sono specificati prima di un doppio trattino e rappresentano i parametri per il livello di astrazione ambientale di DPDK, e [GATEKEEPER OPTIONS] sono specificati dopo il doppio trattino e rappresentano le opzioni specifiche di Gatekeeper.
La configurazione iniziale del sistema, inclusa la configurazione dei dispositivi e della memoria in DPDK, verrà registrata su stdout. Una volta che Gatekeeper è avviato, tutte le informazioni vengono inviate al log di Gatekeeper.
I pacchetti Debian di Gatekeeper possono essere creati con i comandi seguenti. Sono pensati per essere eseguiti dalla radice del repository e presuppongono che i sottomoduli git siano stati scaricati e che le dipendenze di compilazione siano state installate, come indicato sopra. Gatekeeper e i sottomoduli verranno compilati automaticamente durante il processo di creazione del pacchetto.
$ tar --exclude-vcs -Jcvf ../gatekeeper_1.2.0.orig.tar.xz -C .. gatekeeper
$ debuild -uc -us
Il pacchetto Gatekeeper sarà disponibile nella directory padre.
bpf/autoconfflexbisonlibncurses5-devlibreadline-devdevscriptspython3python3-pyelftoolsdpdk-devbind.pylibcap-devlibcap2mesonninja-buildpkg-config