
Gatekeeper は、初のオープンソース DDoS 防御システムです。あらゆるピーク帯域幅にスケールするように設計されており、現在および将来の DDoS 攻撃に耐えることができます。Gatekeeper の地理的に分散したアーキテクチャにもかかわらず、着信トラフィックに適用すべきすべての決定を記述するネットワークポリシーは集中化されています。この集中化されたポリシーにより、ネットワーク事業者は、非常に高いレイテンシでは実行不可能な分散アルゴリズム(例:分散データベース)を活用し、複数のマルチベクター DDoS 攻撃に同時に対処できます。
Gatekeeper の想定ユーザーは、機関、サービスおよびコンテンツプロバイダー、エンタープライズネットワークなどのネットワーク事業者です。個人のインターネットユーザーによる使用を意図していません。
詳細については、Gatekeeper wiki を参照してください。
DPDK は hugepages の使用を必要とします。hugepages のマウント手順は要件ドキュメント に記載されています。多くのシステムでは、以下の hugepages 設定で十分です。
$ echo 256 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
vfio-pci の有効化Linux カーネルモジュール vfio-pci は、NIC を 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 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 をサポートしていることを確認する必要があります。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
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 のさまざまな機能ブロックを設定します。これらの設定を変更する必要があるかどうかについては、プロジェクトの 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"
同じファイルで、オプションとして Environmental Abstraction Layer オプション を DPDK_ARGS 変数に、Gatekeeper 固有のオプション を 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 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