eBPF - XDP概要 編
本記事は、eBPFとも関連するXDP
についてまとめています。以下、関連記事をいくつか書いていますので、必要に応じて参照して下さい。
- eBPF - 入門概要 編
- eBPF - 仮想マシン 編
- eBPF - BCCチュートリアル 編
- eBPF - bpftraceチュートリアル 編
- eBPF - XDP概要 編(本記事)
XDPとは
XDP (eXpress Data Path) とは、カーネルに実装されたeBPF
ベースのネットワークパケット高速処理基盤で、データリンク層(NIC, デバイスドライバ)以上のレベルでパケットのデータを操作する仕組みをeBPF
経由でユーザプログラムに提供します。ユーザスペースのアプリケーションまでパケットが到達して処理する場合よりも、パケットバッファのコピーが不要だったり、カーネル・ユーザスペース間のオーバーヘッドを削減出来るなど、パフォーマンスでメリットがあります。
カーネルコンフィグ
eBPFのカーネルコンフィグ設定とは別に以下を有効にする必要があります。
CONFIG_XDP_SOCKETS=y
デバイスドライバのサポート
基本的には、カーネルのサポートとは別に対応するNICデバイスドライバがXDPをサポートしている必要があります。
Generic XDP
といいつつ、Linuxカーネルv4.12からGeneric XDP
というものがサポートされ、NICデバイスドライバがXDP非サポートでもXDPを利用出来る様子です(パフォーマンス的には劣る)。
XDPで出来ること
基本的な処理の流れはeBPFと同様で、観測対象のイベントに処理関数をアタッチし、その関数の中で必要に応じて処理を行い(パケットデータ自体への操作も可能。例えば、パケットのポート番号を123から124に変更など)、戻り値をカーネルに返します。戻り値は、XDP_PASS
, XDP_DROP
, XDP_TX
, XDP_ABORTED
の4種類がサポートされています。
XDP_PASS
対象のパケットを許可します(次の処理に通す)。また、eBPFで行ったsk_buff
に対する変更操作もそのまま反映されます。
XDP_DROP
対象パケットを破棄します。
XDP_TX
対象パケットを同じNICから送信します。
XDP_REDIRECT
対象パケットを別のNICから送信します。
ユースケース
XDPのユースケースの一例です。
DDos攻撃対策
好ましくないパケットをとっとと捨ててしまうことで対策するという非常にシンプルな原理です。
ロードバランサ
これもまたシンプルな原理で高速なロードバランサとして利用するユースケースです。
参考文献
Discussion