
O primeiro sistema de proteção DDoS de código aberto
Gatekeeper é o primeiro sistema de proteção contra DDoS de código aberto. Ele é projetado para escalar para qualquer pico de largura de banda, de modo que pode suportar ataques DDoS tanto de hoje quanto de amanhã. Apesar da arquitetura geograficamente distribuída do Gatekeeper, a política de rede que descreve todas as decisões que devem ser aplicadas no tráfego de entrada é centralizada. Esta política centralizada permite que os operadores de rede aproveitem algoritmos distribuídos que não seriam viáveis sob latência muito alta (por exemplo, bases de dados distribuídas) e combatam múltiplos ataques DDoS multi‑vetor ao mesmo tempo.
Os usuários pretendidos do Gatekeeper são operadores de rede de instituições, provedores de serviços e conteúdo, redes empresariais, etc. Não se destina a ser usado por usuários individuais da Internet.
Para mais informações, consulte o wiki do Gatekeeper.
DPDK requiere o uso de hugepages; instruções para montar hugepages estão disponíveis na documentação de requisitos. Em muitos sistemas, a seguinte configuração de hugepages é suficiente:
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pciO módulo do kernel Linux vfio-pci é necessário para vincular NICs ao DPDK/Gatekeeper. Para que vfio-pci funcione, tanto a BIOS quanto o kernel devem suportá-lo. As BIOS devem ter VT-d ativado. As BIOS podem identificar VT-d como "Intel (R) VT for Directed I/O", "Intel (R) VT-d Feature", "Intel VT-d", "VT-d" ou variações semelhantes; para mais exemplos, pesquise "BIOS VT-d" no Google Images. Algumas BIOS podem exigir que uma opção chamada "Intel (R) Virtualization Technology" (ou variações desta string) seja ativada antes que o VT-d possa ser ativado.
Para verificar se o VT-d está ativado na BIOS, execute o seguinte comando após o Linux inicializar:
$ dmesg | grep -e DMAR
Se o comando acima retornar algumas linhas, o VT-d deve estar ativado. Caso contrário, é necessário voltar à BIOS para ativá-lo. Mais informações sobre como verificar se o VT-d está ativado na BIOS estão disponíveis nesta página.
Uma vez que o VT-d está ativado na BIOS, deve-se garantir que o kernel suporta IOMMU. Observe que é necessária uma versão do kernel superior a 3.6 para suportar IOMMU. Pode-se verificar se o kernel em execução tem IOMMU ativado por padrão com o seguinte comando:
$ grep CONFIG_INTEL_IOMMU_DEFAULT_ON /boot/config-`uname -r`
Muito provavelmente, o comando acima produzirá # CONFIG_INTEL_IOMMU_DEFAULT_ON is not set, ou seja, o kernel em execução não possui IOMMU ativado por padrão. Maneiras alternativas de verificar as opções de compilação do kernel (ou seja, CONFIG_INTEL_IOMMU_DEFAULT_ON) estão disponíveis nesta página.
Se o kernel não tiver IOMMU ativado por padrão, é necessário passar o parâmetro de inicialização do kernel intel_iommu=on via GRUB. Para informações sobre por que o parâmetro de inicialização intel_iommu=on é necessário, veja esta página. Pode-se verificar se o kernel em execução recebeu este parâmetro com o comando abaixo:
$ cat /proc/cmdline | grep intel_iommu=on
Se o kernel em execução não recebeu o parâmetro intel_iommu=on, adicione-o ao GRUB e reinicie a máquina. Informações sobre como adicionar um parâmetro de inicialização ao GRUB são encontradas aqui.
Uma vez que o VT-d está ativado na BIOS e o kernel suporta IOMMU, pode-se verificar que tudo está configurado com um dos seguintes comandos:
$ ls /sys/kernel/iommu_groups
OU
$ dmesg | grep -ie 'IOMMU\s\+enabled'
Tudo está configurado se as saídas dos comandos acima não estiverem vazias.
Os pacotes Debian do Gatekeeper estão disponíveis para Ubuntu 24.04 LTS na página de Releases do projeto.
Depois que os pacotes são baixados, eles podem ser instalados com os comandos abaixo:
$ 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 instalado via pacotes Debian, os arquivos de configuração do Gatekeeper estão localizados em /etc/gatekeeper. Você deve editar pelo menos o arquivo net.lua e definir as variáveis front_ports, front_ips, back_ports e back_ips de acordo com seu ambiente.
Os outros arquivos Lua configuram diferentes blocos funcionais do Gatekeeper. Consulte o wiki do projeto para mais informações sobre se estes precisam ser alterados na sua configuração.
Você também precisa editar o arquivo /etc/gatekeeper/envvars e definir a variável GATEKEEPER_INTERFACES para os endereços PCI dos adaptadores de rede a serem vinculados ao DPDK. Estes podem ser encontrados usando o comando lshw. Por exemplo:
# 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
...
Dada esta saída, defina GATEKEEPER_INTERFACES como abaixo:
GATEKEEPER_INTERFACES="08:00.0 08:00.1"
No mesmo arquivo, você pode opcionalmente especificar opções da Camada de Abstração Ambiental na variável DPDK_ARGS e opções específicas do Gatekeeper em GATEKEEPER_ARGS.
Execute os comandos abaixo para iniciar o Gatekeeper e garantir que ele seja iniciado automaticamente nas reinicializações.
$ sudo systemctl start gatekeeper
$ sudo systemctl enable gatekeeper
Instale as seguintes dependências de 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: Tanto libmnl0 quanto libmnl-dev são necessários para compilar e executar gatekeeper, mas apenas libmnl0 é necessário apenas para executar gatekeeper. Tanto libkmod2 quanto libkmod-dev são necessários para compilar e executar gatekeeper, mas apenas libkmod2 é necessário apenas para executar gatekeeper. libnuma-dev é necessário para compilar o DPDK mais recente e suportar sistemas NUMA. O pacote libelf-dev é necessário para compilar o DPDK com suporte à leitura de programas BPF de arquivos ELF, mas apenas libelf1 é necessário para executá-lo. O pacote libc6-dev-i386 é necessário para compilar os programas BPF na pasta . Os pacotes , , , e são para o BIRD. O pacote é usado para construir os pacotes Debian do Gatekeeper. Os pacotes e são necessários para compilar o DPDK e executar scripts Python como . é necessário para compilar o Gatekeeper, mas apenas é necessário para executar o Gatekeeper. e são necessários para compilar o DPDK. é necessário para compilar o Gatekeeper.
Para usar o DPDK, certifique-se de ter todos os requisitos ambientais.
Clone o repositório do Gatekeeper, incluindo os submódulos que contêm as dependências do Gatekeeper:
$ git clone --recursive http://github.com/AltraMayor/gatekeeper.git
Se você não usar a opção --recursive do clone, você precisa obter os submódulos que contêm as dependências a partir do diretório gatekeeper:
$ git submodule init
$ git submodule update
Esta seção explica como compilar o Gatekeeper manualmente. Se você quiser compilar pacotes Debian, consulte a seção Como construir pacotes.
Enquanto estiver no diretório gatekeeper, execute o script de configuração:
$ . setup.sh
Este script compila DPDK, LuaJIT e BIRD, e carrega os módulos do kernel necessários. Além disso, salva os nomes das interfaces e seus respectivos endereços PCI no arquivo lua/if_map.lua para que os nomes das interfaces possam ser usados nos arquivos de configuração do Gatekeeper.
Uma vez que DPDK e LuaJIT estão compilados, gatekeeper pode ser compilado:
$ make
Antes que gatekeeper possa ser usado, os adaptadores de rede devem ser vinculados ao DPDK. Para isso, você pode usar o script dependencies/dpdk/usertools/dpdk-devbind.py. Por exemplo:
$ sudo dependencies/dpdk/usertools/dpdk-devbind.py --bind=vfio-pci enp131s0f0
Este comando vincula a interface enp131s0f0 ao driver vfio-pci para que os quadros possam ser passados diretamente ao DPDK em vez do kernel. Note que esta vinculação deve ocorrer após a configuração do Gatekeeper nas etapas acima para que a interface vinculada apareça na lista de interfaces em lua/if_map.lua.
Uma vez que gatekeeper está compilado e o ambiente configurado corretamente, execute:
$ sudo build/gatekeeper [EAL OPTIONS] -- [GATEKEEPER OPTIONS]
Onde [OPÇÕES EAL] são especificadas antes de dois traços e representam os parâmetros para a Camada de Abstração Ambiental do DPDK e [OPÇÕES DO GATEKEEPER] são especificadas após os dois traços e representam opções específicas do Gatekeeper.
A configuração inicial do sistema, incluindo configuração de dispositivos e memória no DPDK, será registrada na saída padrão. Uma vez que o Gatekeeper é inicializado, todas as informações são enviadas para o log do Gatekeeper.
Os pacotes Debian do Gatekeeper podem ser construídos com os comandos abaixo. Eles devem ser executados a partir da raiz do repositório e assumem que os submódulos git foram obtidos e que as dependências de construção foram instaladas, conforme instruído acima. O Gatekeeper e os submódulos serão automaticamente compilados durante o processo de construção do pacote.
$ tar --exclude-vcs -Jcvf ../gatekeeper_1.2.0.orig.tar.xz -C .. gatekeeper
$ debuild -uc -us
O pacote do Gatekeeper estará disponível no diretório pai.
bpf/autoconfflexbisonlibncurses5-devlibreadline-devdevscriptspython3python3-pyelftoolsdpdk-devbind.pylibcap-devlibcap2mesonninja-buildpkg-config