ブログ | CTO オフィス

eBPF: 重要なのは可観測性です


時折、クールなテクノロジーが、実際のビジネスニーズとそのテクノロジーの長所が交差する変曲点に到達します。 これにより、この技術は妥当なものになるだけでなく、実用的なものにもなります。 Berkeley Packet Filter (BPF) は最近、Linux 開発者の間でこの段階に到達しました。 BPF は Linux ホスト上の非常に効率的なインターセプトおよび処理ポイントであり、近い将来Windowsサーバーにも拡張される予定です。 利用可能なデータの範囲は広範であり、サイト信頼性エンジニアリング (SRE) 運用タスクのフルスタック可視性に直接追加されます。 また、セキュリティやトラフィック管理に関連する課題の解決にも自然に一致します。 フックの範囲も同様に広範囲で、可観測性、セキュリティ、およびネットワークの専門家にとって魅力的な BPF アプリケーション用の便利なトリガー ポイントを多数提供します。 BPF は、コストをかけずに可観測性を実現するのに適したテクノロジーです。 そして、すべては可観測性から始まります。

BPF の基本設計により、計算作業の効率がほぼ最大限に高まります (ワットあたりのコスト)。 さらに良いことに、ツールチェーンがバイトコードを生成するので、低レベルのアセンブリ言語タイプのプログラミングではなく、目的の結果に集中できます。 どうやって? 次の 2 つの設計特性により、BPF が優れた性能を発揮します。

命令セット設計

BPF のソフトウェア設計は、新興の最新 CPU アーキテクチャの設計を意図的にモデル化したものです。 実際、プロセッサ用語が使用されるのは、BPF の要素と使用を正確に説明しているためです。 BPF にはレジスタと命令があります。 これらは CPU による直接使用を目的として設計されています。 BPF は、BSD パケット フィルタ設計 (1992) に基づいて、現在のレジスタ ベースの CPU アーキテクチャに適した再設計されたパケット キャプチャ フィルタ マシンです。 この設計は、2014 年に Linuxカーネルv3.18で「Enhanced Berkeley Packet Filter」またはeBPFがリリースされたときに、自然に促進されました。eBPF は、リリース後の初期には Classic Berkeley Packet Filter (cBPF) との重要な違いでした。 現在、サポートされているすべてのカーネル バージョンに 2014 年の機能強化が含まれているため、この区別はそれほど重要ではありません。 注目すべき点は以下のとおりです: レジスタの幅が広くなり (32 ビットから 64 ビットに増えると、キャッシュ ライン/クロック サイクルごとに実行される作業が増えます)、レジスタの数が増え (2 から 10 に増えると、最新の CPU レジスタとカーネル ABI 間の 1 対 1 のマッピングが増えます)、および BPF プログラムをより安全で便利なものにするいくつかの追加の命令セット強化が行われました。

リンク層

BPF は、ネットワーク タップとパケット フィルターで構成されます。 タップは、パケットが特定のネットワーク インターフェイスに送信されるときに、データ リンク層で動作します。 フィルターが照会できるようにパケットをコピーします。 この挿入ポイントにより、Linux ホストのネットワーク パスが完全に可視化されます。 入力トラフィックの場合、これはホスト プロセッサが処理を開始する前を意味し、出力トラフィックの場合、これはホストから出て行くために回線に到達する直前を意味します。 この図は、データ リンク層で入力パケット パスと交差する BPF を示しています。

イングレスパス

利用可能なデータの範囲は広範であり、SRE 運用タスクのフルスタックの可視性に直接追加されます。 この例では、 IPv4 ヘッダーの最もよく使用されるフィールドのいくつかに焦点を当てます。

イングレスパス

このデータを使用して、パケット フィルタリングをカスタマイズするためのポリシーを定義できます。 次のポリシーは、特定の宛先 IP アドレス宛ての TCP パケットをフィルタリングします。

イングレスパス

可観測性のために eBPF を活用すると、BOGO (1 つ買うと 1 つ無料) のメリットが得られます。 観測されたデータは、観測以外の目的にも使用できます。 たとえば、トラフィック ルーティングやセキュリティなどです。

先ほど共有したデータ セットに戻ると、Linux ホストのトラフィックの入力パスを観察するために使用されるデータ セットの一部は、他の用途にも役立ちます。 たとえば、送信元 IP、宛先 IP、宛先ホスト、およびポートは、入力トラフィックのルーティングとアクセスの制限の両方に役立ちます。

用途に関係なく、すべては BPF タップによるパケットのコピーから始まります。 コピーが作成されると、データはメモリに格納され (詳細についてはBPF マップを参照)、テレメトリ ストリームとしてエクスポートされるほか、ポリシーおよびフィルタリング アクションを指定する他の BPF プログラムによって同時に活用されるようになります。 ここで、可観測性からトラフィック管理およびセキュリティへの分岐が起こります。 BPF の極めて高い効率性を最大限に活用するには、必要なデータとそのデータの使用方法を明確に把握することが出発点となります。 このシリーズの次の投稿では、同僚の Muhammad Waseem Sarwar が、Linux ネットワーク スタックのさまざまな場所での BPF プログラミングのオプションについて説明します。