🌐

eBPF - XDP概要 編

2022/03/14に公開

本記事は、eBPFとも関連するXDPについてまとめています。以下、関連記事をいくつか書いていますので、必要に応じて参照して下さい。

XDPとは

XDP (eXpress Data Path) とは、カーネルに実装されたeBPFベースのネットワークパケット高速処理基盤で、データリンク層(NIC, デバイスドライバ)以上のレベルでパケットのデータを操作する仕組みをeBPF経由でユーザプログラムに提供します。ユーザスペースのアプリケーションまでパケットが到達して処理する場合よりも、パケットバッファのコピーが不要だったり、カーネル・ユーザスペース間のオーバーヘッドを削減出来るなど、パフォーマンスでメリットがあります。


[1]

カーネルコンフィグ

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攻撃対策

好ましくないパケットをとっとと捨ててしまうことで対策するという非常にシンプルな原理です。

https://blog.cloudflare.com/deep-dive-cloudflare-autonomous-edge-ddos-protection/

ロードバランサ

これもまたシンプルな原理で高速なロードバランサとして利用するユースケースです。

https://engineering.fb.com/2018/05/22/open-source/open-sourcing-katran-a-scalable-network-load-balancer/

https://speakerdeck.com/line_devday2019/software-engineering-that-supports-line-original-lbaas

参考文献

パケット処理䛾独自実装や高速化手法䛾比較と実践

https://terassyi.net/posts/2021/10/18/intro-xdp.html

https://blog.bobuhiro11.net/2020/09-17-xdp.html

脚注
  1. https://en.wikipedia.org/wiki/Express_Data_Pathより抜粋 ↩︎

Discussion