XDPの必要性
Linuxサーバにとって、高性能なネットワーク・データパスは常に必要な機能です。しかし、そのデータパスのプログラマビリティは、開発者がそれを使って何か使えるものを作れるようなものであるべきです。XDPの学習経路はかなり険しいものですが、最近では多くのツールやフレームワークが開発されており、XDPのコードを書くことはかなり身近なものになっています。
XDPの大きな利点は、そのスピードにあります。XDPの主な機能は、開発者がカーネルそのものを変更することなく、パッケージをフィルタリングするための新しい機能を構築できることです。 あるパッケージがパケットをフォワードするかドロップするかを決定するために、ネットワークスタック全体を通過する必要がないシナリオがあります。これは、いくつかのフィルタを配置することによって、ネットワーキングスタックの最初のレイヤーで行われるべきです。これらのフィルターは、悪意のあるパケットを簡単に認識し、スタックの最初の部分でドロップできるようにプログラムされている必要があります。これによって、処理能力と時間を大幅に節約することができます。 XDPを使えば、このようなフィルタリングがネットワーク・スタックの先頭で可能になります。 XDPを使えば、開発者はハッカーがDDoS攻撃を行うために送信する可能性のあるあらゆるパケットをフィルタリングすることができるようになりました。これにより、通常のカーネル・ネットワーク・スタックのオーバーヘッドを大幅に削減することができます。この機能は、Cloudflareが最近行ったDDoS防御のデモで実証されています。 XDPの特徴的な機能は以下の通りです。 XDPの特筆すべき機能は以下の通りです。-
- 特殊なハードウェアを必要としない。XDPはどんなハードウェアでも動かすことができます。XDPはどんなハードウェアでも動作します。最適化されたデバイスやドライバがない場合、速度が低下することがありますが、テスト目的であれば、特別なハードウェアは必要ありません。
-
- カーネル・バイパスを必要としない。XDPは、パケットがカーネル・ネットワーク・スタックに到達する前に実行されます。パケットを受信するとコールバック関数が起動し、XDPはそれを可能な限り高速に処理します。
-
- XDPはTCP/IPスタックを置き換えるものではありません。XDPはネットワークスタックの最下層に存在します。XDPがパケットを受け取ると、そのパケットはTCP/IPスタックを含む通常のカーネル・ネットワーク・スタックに入る。
- XDPはTCP/IPと連動し、BPF(Berkeley Packet Filter)の全機能を使用します。XDPは何も置き換えるものではありません。XDPは何も置き換えません。パケットを処理するためにeBPFを使用し、 開発者がコードを書きやすいようにすることさえします。
なぜXDPは高速なのか
XDP は Linux カーネルに搭載された eBPF ベースのプログラマブルで高性能なネットワークデータパスです。XDPの性能向上は、ソフトウェアスタックの最下層でベアメタルパケット処理を行うことに起因します。つまり、ネットワークから送られてきたデータ・パケットは、カーネルの他のどのプロセスよりも先に、まずXDPに到達します。
そのため、エンジニアはXDPをプログラムして、さまざまなユースケースに最適化することができます。DDoS対策からロードバランサーまで。 XDPはネットワーク・スタックに直接ロードされます。ネットワーキング・スタックがパケットを受信すると、コールバックを取得し、可能な限り高速にパケットを処理します。XDPはコモディティハードウェアで1コアあたり毎秒2600万パケットをドロップすることができます。 XDPが高速である最大の理由は、ユーザがネットワークパケットデータを直接読んだり、変更したり、パケットをどのように扱うかを早い段階で決定することができるからです。このため、プロセスのオーバーヘッドが非常に少なく、結果的に速度が向上します。XDP でネットワークスタックに接続する
XDPでネットワークに接続する方法はいろいろありますが、ここでは一般的な方法をいくつか紹介します。
- 一般的なXDP: このプロセスでは、XDPはカーネルにロードされますが、性能上の利点はほとんどありません。ハードウェアからのサポートなしにXDPプログラムを実行する簡単な方法です。
-
- Native XDP: Native XDP**: ネットワーク・ドライバ自身がロードします。ネットワークカードドライバからのサポートが必要です。
XDPが実行する操作の種類
ネットワークインターフェースがパケットを受信すると、XDPは次のような操作を行 います。
- XDP_DROP: パケットをドロップし、処理を行わない。eBPF プログラムを使用してトラフィックパターンを分析し、リアルタイムでパケットをドロップすることができます。
-
- XDP_PASS: パケットをネットワーキングスタックに転送し、さらに処理する。パケットの内容を事前に修正することができる。
- XDPP_ABORTED: ネットワークデータパケットをドロップし、トレースポイント例外を残します。
-
- XDP_TX: パケットを受信したのと同じネットワークインターフェースに転送します。パケットはmodified on unmodifiedにすることができる。
-
- xdp_redirect: パケットを別のNIC(ネットワークインターフェースコントローラー)にリダイレクトします。
XDP と eBPF
eBPFはBerkeley Packet Filterの拡張版です。Linux カーネル内で動作する抽象化された仮想マシンのようなもので、Linux カーネル内のサンドボックス環境でユーザ定義プログラムを動作させるために使用されます。一般的には、Linuxサーバでネットワークや監視ツールを動作させ、最適な性能を確保するために使用されます。
XDPは、BPFアプリケーションで非常に高速なパケット処理を記述するために使用されるフレームワークです。さらに高速にするために、XDPはパケットがネットワーキングスタックに受信された直後にBPFを実行します。 XDPは非常に急な学習曲線を持っています。そのため、開発者はeBPFを使ったプログラミングを容易にするためのツールやフレームワークを作っています。XDPとeBPFを使って、非常に高い頻度でネットワーク処理を行うためのコードを非常に簡単に書くことができるようになります。XDPの核となる利点は、カーネルを変更する必要がないことで、これはエンジニアにとって大きな頭痛の種だったのです。 しかし、人は言うように、大きな力には大きな責任が伴います。XDPは、カーネルがパケットを解析する前のできるだけ早い段階でeBPFを実行するので、eBPFプログラムはすべての解析を自分自身で行わなければならず、カーネルに頼ることはできないのです。 プログラマとして、あなたはほとんどの時間、端末で作業しています。これは、ターミナルプロンプトを装飾するためのガイドです。ぜひご覧ください。XDPとeBPFの一般的な使用例
- XDPとeBPFの一般的な使用例 1.DDoS攻撃。XDPの主な使用例は、DDoS(分散型サービス拒否)保護です。DDoS攻撃では、攻撃者はエンドユーザーのためのプロセスを一切残さず、サーバーのリソースを可能な限り多く使用しようとします。ネットワークスタックの非常に高速なレイヤーであるXDPを使用することで、ネットワークデータパケットをドロップするための処理コストが発生しない。XDPによるフィルタリングの後、パケットはLinuxカーネルが提供する他のすべてのフィルタリング方式を通過します。
- ロードバランサ。XDPは、サーバへの膨大なトラフィックを処理するためのロードバランサとしても利用されています。Facebookをはじめ、多くの巨大テック企業がこの技術を利用しています。以前は、エンジニアが専用サーバーをロードバランサーとして使っていました。何百万人もの顧客にサービスを提供するためには、専用サーバーの管理は非常に困難で、性能も非常に高くなければなりません。しかし、XDPレイヤーをロードバランサーとして使用し、中央のサーバーがなく、その結果、単一障害点がないことを想像してみてください。
-
- ファイアウォール: XDPとeBPFの組み合わせにより、最小限のオーバーヘッドでシステムを保護するための様々なファイアウォールルールを記述することができます。
よくある質問
BCCはeBPFとは何ですか?
BCC は eBPF をベースに構築されています。これはカーネルトレースと操作プログラムのためのツールキットまたはフレームワークで、非常に便利なコマンドラインインターフェイスが付属しています。また、LLVM のラッパーも含まれています。
libBPF とは何ですか?
LibBPFはBPFアプリケーションを作るための代替ツールセットです。C言語で書かれています。