Gatekeeper 是首个开源 DDoS 防护系统。它旨在扩展到任何峰值带宽,因此能够抵御现在和未来的 DDoS 攻击。尽管 Gatekeeper 采用地理分布式架构,但描述所有必须对入站流量执行的决策的网络策略是集中式的。这种集中式策略使网络运营商能够利用在极高延迟下不可行的分布式算法(例如分布式数据库),并同时抵御多个多向量 DDoS 攻击。
Gatekeeper 的目标用户是机构、服务提供商和内容提供商、企业网络等的网络运营商。它不旨在被个人互联网用户使用。
更多信息,请参阅 Gatekeeper 维基。
DPDK 需要使用大页;挂载大页的说明可在 需求文档 中找到。在许多系统上,以下大页设置就足够了:
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pciLinux 内核模块 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" 或类似变体;更多示例,请在 Google 图片 上搜索 "BIOS VT-d"。某些 BIOS 可能要求在启用 VT-d 之前先启用名为 "Intel (R) Virtualization Technology"(或该字符串的变体)的选项。
要检查 BIOS 中是否启用了 VT-d,请在 Linux 启动后运行以下命令:
$ dmesg | grep -e DMAR
如果上述命令返回一些行,则 VT-d 应已启用。否则,必须返回 BIOS 启用它。有关如何检查 BIOS 中是否启用 VT-d 的更多信息,请参阅 此页面。
在 BIOS 启用 VT-d 后,必须确保内核支持 IOMMU。注意,需要内核版本高于 3.6 才能支持 IOMMU。可以通过以下命令验证正在运行的内核是否默认启用了 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
OR
$ 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 变量设置为要绑定到 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 变量中指定 环境抽象层选项,并在 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
注意:编译和运行 gatekeeper 都需要 libmnl0 和 libmnl-dev,但仅运行 gatekeeper 时只需要 libmnl0。编译和运行 gatekeeper 都需要 libkmod2 和 libkmod-dev,但仅运行 gatekeeper 时只需要 libkmod2。libnuma-dev 用于编译最新的 DPDK 和支持 NUMA 系统。libelf-dev 包用于编译支持从 ELF 文件读取 BPF 程序的 DPDK,但运行时只需要 libelf1。libc6-dev-i386 包用于编译 bpf/ 文件夹中的 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] 在双破折号之前指定,代表 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 软件包将在父目录中可用。
autoconfflexbisonlibncurses5-devlibreadline-devdevscriptspython3python3-pyelftoolsdpdk-devbind.pylibcap-devlibcap2mesonninja-buildpkg-config