Gatekeeper 是一个开源 DDoS 保护系统。它旨在扩展到任何峰值带宽,因此它可以抵御今天和明天的 DDoS 攻击。尽管 Gatekeeper 的地理分布式架构,描述必须对传入流量强制执行的所有决策的网络策略是集中的。这种集中式策略使网络运营商能够利用在非常高延迟(例如分布式数据库)下不可行的分布式算法,并同时对抗多个多向量 DDoS 攻击。
Gatekeeper 的目标用户是机构的网络运营商、服务和内容提供商、企业网络等。它不适合个人互联网用户使用。
DPDK需要使用hugepages;需求文档中提供了安装大页面的说明。在许多系统上,以下大页面设置就足够了:
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pci
从 Gatekeeper v1.1 开始,Linux 内核模块vfio-pci
是将 NIC 绑定到 DPDK/Gatekeeper 的首选方式。如果您无法让内核模块在您的机器上运行,您可以选择本页中记录vfio-pci
的替代方案。vfio-pci
[hidecontent type="logged" desc="隐藏内容:登录后可查看"]
为了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 Images上搜索“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,则必须intel_iommu=on
通过 GRUB 传递内核引导参数。有关为什么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 软件包在项目的 发布 页面上可用于 Ubuntu 20.04 LTS。
下载软件包后,可以使用以下命令安装它们:
$ tar -zxvf gatekeeper-ubuntu-20.04-packages.tar.gz
$ cd gatekeeper-ubuntu-20.04-packages
$ sudo dpkg -i dpdk-rte-kni-dkms_*_amd64.deb gatekeeper-bird_*_amd64.deb gatekeeper_*_amd64.deb
该软件包是一个 DKMS(动态内核模块支持)软件包,它在安装和内核升级期间dpdk-rte-kni-dkms
构建内核模块。rte_kni
通过 Debian 软件包安装时,Gatekeeper 配置文件位于/etc/gatekeeper
. 您至少应该编辑该net.lua
文件,并根据您的环境设置 、和front_ports
变量。front_ips
back_ports
back_ips
其他 Lua 文件配置不同的 Gatekeeper 功能块。请参阅项目的wiki 以获取有关是否需要在您的设置中更改这些内容的更多信息。
您还需要编辑该/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 并确保它在重新启动时自动启动。
$ 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 python \
libcap-dev libcap2 meson ninja-build
注意:libmnl0
和libmnl-dev
都需要编译和运行 gatekeeper
,但只libmnl0
需要简单运行gatekeeper
。libkmod2
和都libkmod-dev
需要编译和运行gatekeeper
,但只libkmod2
需要简单运行gatekeeper
。 libnuma-dev
需要编译最新的 DPDK 和支持 NUMA 系统。需要该包libelf-dev
来编译支持从 ELF 文件读取 BPF 程序的 DPDK,但只libelf1
需要运行它。需要该包libc6-dev-i386
来编译文件夹中的 BPF 程序bpf/
。、autoconf
、flex
、bison
和libncurses5-dev
包 libreadline-dev
适用于 BIRD。该devscripts
软件包用于构建 Gatekeeper Debian 软件包。 python
需要能够运行dpdk-devbind.py
脚本。 libcap-dev
需要编译 Gatekeeper,但只libcap2
需要运行 Gatekeeper。 meson
并且ninja-build
需要构建 DPDK。
要使用 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-specific options。
系统的早期配置,包括 DPDK 中的设备和内存配置,将被记录到 stdout。Gatekeeper 启动后,所有信息都会输出到 Gatekeeper 日志中。
可以使用以下命令构建 Gatekeeper Debian 软件包。它们应该从存储库根目录运行,并假定已拉出 git 子模块,并且已安装构建依赖项,如上文所述。Gatekeeper 和子模块将在包构建过程中自动编译。
$ tar --exclude-vcs -Jcvf ../gatekeeper_1.1.0.orig.tar.xz -C .. gatekeeper
$ debuild -uc -us
Gatekeeper 包将在父目录中可用。
[/hidecontent]