
최초의 오픈소스 DDoS 보호 시스템
Gatekeeper는 최초의 오픈 소스 DDoS 보호 시스템입니다. 모든 피크 대역폭으로 확장 가능하도록 설계되어 오늘날과 미래의 DDoS 공격을 견딜 수 있습니다. Gatekeeper는 지리적으로 분산된 아키텍처를 가지고 있지만, 들어오는 트래픽에 적용해야 하는 모든 결정을 설명하는 네트워크 정책은 중앙 집중식입니다. 이 중앙 집중식 정책을 통해 네트워크 운영자는 매우 높은 지연 시간(예: 분산 데이터베이스)에서 사용할 수 없는 분산 알고리즘을 활용하고 여러 개의 다중 벡터 DDoS 공격을 동시에 대응할 수 있습니다.
Gatekeeper의 대상 사용자는 기관, 서비스 및 콘텐츠 제공자, 엔터프라이즈 네트워크 등의 네트워크 운영자입니다. 개별 인터넷 사용자가 사용하도록 설계되지 않았습니다.
자세한 내용은 Gatekeeper 위키를 참조하세요.
DPDK에서는 hugepages 사용이 필요합니다. hugepages 마운트 지침은 요구 사항 문서에서 확인할 수 있습니다. 많은 시스템에서 다음과 같은 hugepages 설정으로 충분합니다.
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pci 활성화NIC를 DPDK/Gatekeeper에 바인딩하려면 Linux 커널 모듈 vfio-pci가 필요합니다. 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" 또는 이와 유사한 변형으로 식별할 수 있습니다. 더 많은 예를 보려면 Google 이미지에서 "BIOS VT-d"를 검색하세요. 일부 BIOS에서는 "Intel (R) Virtualization Technology"(또는 이 문자열의 변형)라는 옵션을 먼저 활성화해야 VT-d를 활성화할 수 있습니다.
BIOS에서 VT-d가 활성화되었는지 확인하려면 Linux 부팅 후 다음 명령을 실행하세요.
$ dmesg | grep -e DMAR
위 명령이 몇 줄을 반환하면 VT-d가 활성화된 것입니다. 그렇지 않으면 BIOS로 돌아가서 활성화해야 합니다. BIOS에서 VT-d가 활성화되었는지 확인하는 방법에 대한 자세한 내용은 이 페이지에서 확인할 수 있습니다.
BIOS에서 VT-d를 활성화한 후에는 커널이 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가 기본적으로 활성화되어 있지 않은 경우 GRUB를 통해 커널 부팅 매개변수 intel_iommu=on을 전달해야 합니다. 부팅 매개변수 intel_iommu=on이 필요한 이유에 대한 자세한 내용은 이 페이지를 참조하세요. 다음 명령으로 실행 중인 커널이 이 매개변수를 수신했는지 확인할 수 있습니다.
$ cat /proc/cmdline | grep intel_iommu=on
실행 중인 커널이 intel_iommu=on 매개변수를 수신하지 않은 경우 GRUB에 추가하고 머신을 재부팅하세요. GRUB에 부팅 매개변수를 추가하는 방법에 대한 정보는 여기에서 확인할 수 있습니다.
BIOS에서 VT-d를 활성화하고 커널이 IOMMU를 지원하면 다음 명령 중 하나로 모든 것이 설정되었는지 확인할 수 있습니다.
$ ls /sys/kernel/iommu_groups
또는
$ dmesg | grep -ie 'IOMMU\s\+enabled'
위 명령의 출력이 비어 있지 않으면 모든 것이 설정된 것입니다.
Gatekeeper Debian 패키지는 프로젝트의 Releases 페이지에서 Ubuntu 24.04 LTS용으로 제공됩니다.
패키지를 다운로드한 후 다음 명령으로 설치할 수 있습니다.
$ 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 변수를 DPDK에 바인딩할 네트워크 어댑터의 PCI 주소로 설정해야 합니다. 이는 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"
같은 파일에서 선택적으로 DPDK_ARGS 변수에 Environmental Abstraction Layer 옵션을, GATEKEEPER_ARGS에 Gatekeeper 특정 옵션을 지정할 수 있습니다.
아래 명령을 실행하여 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를 컴파일하고 실행하는 데 필요하지만, 단순히 gatekeeper를 실행하려면 libmnl0만 필요합니다. libkmod2와 libkmod-dev는 모두 gatekeeper를 컴파일하고 실행하는 데 필요하지만, 단순히 gatekeeper를 실행하려면 libkmod2만 필요합니다. libnuma-dev는 최신 DPDK를 컴파일하고 NUMA 시스템을 지원하는 데 필요합니다. libelf-dev 패키지는 ELF 파일에서 BPF 프로그램을 읽을 수 있도록 DPDK를 컴파일하는 데 필요하지만, 실행에는 libelf1만 필요합니다. libc6-dev-i386 패키지는 bpf/ 폴더의 BPF 프로그램을 컴파일하는 데 필요합니다. , , , , 패키지는 BIRD용입니다. 패키지는 Gatekeeper Debian 패키지를 빌드하는 데 사용됩니다. 및 패키지는 DPDK를 빌드하고 와 같은 Python 스크립트를 실행하는 데 필요합니다. 는 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]는 더블 대시 앞에 지정되며 DPDK의 Environmental Abstraction Layer 매개변수를 나타내고, [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 패키지는 상위 디렉토리에서 사용할 수 있습니다.
autoconfflexbisonlibncurses5-devlibreadline-devdevscriptspython3python3-pyelftoolsdpdk-devbind.pylibcap-devlibcap2mesonninja-buildpkg-config