BPF技術の紹介 - 生態と歴史

この記事の写真はすべてインターネット上の公開情報からのものであり、ソースは示されていません。コンテンツは、Network Detection and Response NDR の開発に由来します。

歴史的原因

図 1: Linux カーネルのコード サイズの増加

DPDK、PF_RING、BPF の共通点

ネットワークのデータ プレーンを分離する

  • ネットワーク機能拡張の代償は、パフォーマンスを犠牲にすることです
  • それらは、カーネルの複雑さの限界を打ち破っています-カーネルバイパス
  • カーネルからのデータ プレーンの分離
  • ユーザーモード開発への引き継ぎ - DPDK、PF_RING、BPF
  • NIC 実行へのダウンロード - BPF の XDP

DPDK、PF_RING、BPF の違い: エコロジーの目標が異なる

  • DPDK 独立プラットフォーム
    • 排他的なカーネル ネットワーク スタック
    • 専用 SDK API
    • エコロジカルハードウェア指向
    • アプリケーションの分離とセキュリティ メカニズムの障害
  • PF_RING 独立メーカー
    • 独立したイタリアの会社
    • 高機能版は別料金
    • 独立したエコロジー

  • BPF 統合のエコロジー
    • カーネルに移植
    • 既存のハードウェアおよびソフトウェアに統合
    • エコロジーはソフトウェア指向であり、急速に発展しています

DPDK と BPF 財団

インフラ志向:基盤ハードウェア・上層事業

図 2: 異なる関心を持つ 2 つの財団

DPDK 年間イベントと技術基準

年度事件

  • 2010年、Intel、Xeon 1世代のDPDK
  • 2013 年、6WIND、DPDK.org コミュニティ
  • 2014、OvS、OvS-DPDK 分散型仮想スイッチ
  • 2015年、ARM版
  • 2017年、Linux Foundationに参加
  • 2018 年、VMware、データ センターにおけるソフトウェア デファインド インフラストラクチャ
  • 2019年、金融応用(高頻度取引)

技術基準

  • PCI パススルー、Hyper-V エミュレーションをバイパス、仮想マシンは PCI を通過
  • SR-IOV、Hyper-V スタックをバイパス、単一の NIC を複数のパススルー NIC に仮想化
  • FD.io/VPP、ベクトル アクセラレーション データ IO、I キャッシュ ジッタと読み取りレイテンシの削減
  • vDPA、virtio データ パス アクセラレーション、コントロール プレーン ソフトウェアのシミュレーション、データ プレーン ハードウェアの実装
  • Switchdev、カーネルのスイッチング機能をハードウェアにオフロード
  • コード貢献度 (V21.11)

BPF の急速に発展するエコロジー

テクノロジー・オブ・ザ・イヤー

  • 1992 年の論文、BSD パケット フィルタ
  • 1994 cBPF、tcpdump での libpcap の実装
  • 2014 eBPF、ユニバーサル仮想マシン
  • 2015 BCC、開発ツールおよびライブラリ
  • 2016 XDP、ネットワーク カーネル バイパス モジュール
  • 2017 libbpf、カーネルから独立して開発
  • 2017 ARM/MIPS、マルチプラットフォーム BPF
  • 2018 BTF、クロスカーネル バージョン タイプ フォーマット
  • 2019 テール コールとホット アップデート
  • 2020 LSM および TCP 輻輳制御
  • 2021年eBPF財団

製品エコロジー

  • 2017 Facebook、本番環境でのカトランの負荷分散
  • 2018 Cloudflare、本番環境の DDoS/ファイアウォールなど
  • 2018 Android 9、DHCPClient を含むトラフィック監視
  • 2018 Netronome、Agilio SmartNIC が XDP をサポート
  • 2018 DPDK、BPF をサポート (MAP とテール コールを除く)
  • 2019 Google、KRSI カーネル ランタイム セキュリティ アシスタント (カーネル V5.7)
  • 2019 Sysdig、Falco が k8s セキュリティ財団に寄付
  • 2020 Nvidia、Mellanox Smart NICがXDPに対応 (¥3,000~9,000)
  • 2020 Microsoft、Linux 用 Sysmon、Windows 用 eBPF
  • 2020 バイト、高性能ネットワーク ACL
  • 2020 Alibaba Cloud、Cilium に基づく加速と拡張
  • 2021 Cilium,サービスメッシュ (无Sidecar)

DPDK と BPF のエコロジー

エコロジーと開発者の違い

製品カテゴリ DPDK BPF
安全性 ファルコン/シリウス/L4drop/...
可観測性 ハッブル/L3AF/トレーシー/...
通信網 DPVS/OVS/FD.IO/VPP タール
SDK C++/GO C++/Rust/GO/Python
カーネル TCPスタックF-Stack/mTCP ヘルパー API/Maps/Verfier&JIT
市場生態学 ハードウェア メーカーによって推進されている仮想化とハードウェア機能の共有に焦点を当てることは、ネットワーク IO の vt-x/ept などの仮想化テクノロジの進化です。 コア機能の分離とクラウド ネイティブ テクノロジーの進化とローカル エコロジーの統合である多重化されたクラウド ベンダーの促進に焦点を当てる

表 1: 関心の異なる 2 つの財団

BPF 技術紹介 性能分析

DPDK テクノロジーと PF_RING テクノロジーの類似点と相違点 - 類似のテクノロジー

図 3: PF_RING の原理

 

図 4: DPDK モジュール構造

同じ

  • UIO+PMD アクティブ ポーリングにより、割り込みと CPU コンテキストの切り替えが削減されます
  • UIO+mmapでゼロコピーを実現
  • HugePages は TLB ミスを減らします

違い

  • PF_RINGは通常版とZC(ゼロコピー)高機能版に分かれています
  • ZC ライセンス料、DPDK 無料
  • ZCとDPDKの性能は基本的に同じ
  • ZC アプリケーション層 API は使いやすく、開発の難易度は DPDK よりはるかに少ない
  • ZC はイタリアの ntop 社の製品で、小さなエコロジー

BPF のネットワーク技術特性

図 5: BPF モジュール構造

ライフサイクルプロセス全体をカバーするBPFの7種類のマウントポイント

  1. 調査
  2. システムコール
  3. sockmap/sockops
  4. kプローブ
  5. cgroup
  6. tc
  7. xdp

図 6: BPF の XDP プログラムの 4 つのパケット処理方法

XDPの4つのパケット処理方法

  1. カーネルへの PASS リリース
  2. DROP 破棄、カーネル未満
  3. REDIRECT 他の処理を転送する
  4. TX バックトラッキング (ブロッキングとリダイレクト用)

XDP のオフロード NIC パフォーマンス

ネトロノーム SmartNIC データ

  • XDP 3 フック ポイント (ネットワーク カード オフロード/カーネル前のネイティブ/カーネル内のジェネリック)
  • オフロード 1 コアは、ネイティブ 8 コアよりも約 1/3 倍高速です
  • ネイティブは DPDK よりわずかに遅いですが、パフォーマンスは似ています Stackoverflow Redhat

図 7: XDP の 3 つのマウント モードのパフォーマンス

 図 8: ネットワーク プロトコル スタックにおける XDP の位置付け

NAC耐圧試験記録

3種類のスループット、NAC WSL2仮想マシン

XDP_DROP 直接ドロップ

❯ tcpreplay -t -i lo t.pcap
Actual: 56320 packets (46419288 bytes) sent in 1.10 seconds
Rated: 42062496.6 Bps, 336.49 Mbps, 51033.95 pps
Flows: 1091 flows, 988.60 fps, 56290 flow packets, 30 non-flow

XDP_TX ブロッキング、リダイレクト

Actual: 56320 packets (46419288 bytes) sent in 1.30 seconds
Rated: 35446666.1 Bps, 283.57 Mbps, 43007.04 pps
Flows: 1091 flows, 833.10 fps, 56290 flow packets, 30 non-flow

XDP_TX + map_perf ブロックとアプリケーションへのレポート

Actual: 56320 packets (46419288 bytes) sent in 1.49 seconds
Rated: 31016641.1 Bps, 248.13 Mbps, 37632.14 pps
Flows: 1091 flows, 728.98 fps, 56290 flow packets, 30 non-flow

競合製品は10ギガビットの電気ポートを備え、1秒あたりのトランザクション数は1000TPS、最大スループットは500Mbps、最大同時接続数は1000(個)

BPF テクノロジーの紹介 - ケーススタディ

実際のケース cloudflare DDOS Mirai ボットネット 3 攻撃

図 9: DDOS 中にネットワークによって伝送されるトラフィック

2020.07、654Gbps、SYNフラッドとUDPフラッド 2021.08、1.2Tbps、SYNフラッドとUDPフラッド、最大HTTPリクエスト2500万回/秒、3秒以内にブロック 2021.11、2Tbps、1分間 DNS増幅攻撃とUDPフラッド、15,000ゾンビ(下) ほぼ 2Tbps

DDOS 緩和プロセスのエコロジカル チェーン: 完全な BPF シリーズ製品の統合

図 10: DDOS を緩和する際に XDP を使用するツールチェーン

  • サンプルを受信して​​攻撃を分析する際に、緩和戦略を自動的にプッシュします
  • 次に、各サーバーでローカル緩和戦略を実行します。
  • DDo 用の L4Drop (XDP)
  • LBのウニモグ(XDP)
  • ファイアウォール用マジック ファイアウォール (BPF xt_btf)
  • 配布と監視
  • UDP レート制限 (BPF SO_ATTACH_BPF)
  • 指標をレポートするための ebpf_exporter

図 11: DDOS を緩和する際に XDP を使用するプロトコル検出テクノロジ

p0f フィンガープリント ライブラリは、TCP ヘッダーの特性を記述します。

DDOS トラフィックのフィンガープリンティング

指紋の種類

Windows XP: 4:120+8:0:1452:65535,0   :mss,nop,nop,sok   :df,id+:0
Windows 7:  4:128:0:*     :8192,8    :mss,nop,ws,nop,sok:df,id+:0
Windows 11: 4:128+0:0:1460:mss*44,8  :mss,nop,ws,nop,sok:df,id+:0
ubuntu 14:  4:64   :0     :*:mss*10,6:mss,sok,ts,nop,ws :df,id+:0

TCP フィンガープリントの判定基準は、Linux の TTL が 64、Win の TTL が 128 です。Linux と Win では、フラグの数と位置が異なります。

4: IP version 
  64: TTL   
     0: IP options length
       *: MSS maximum segment size
         mss*10,6: TCP window size and scale
                  mss,sok,ts,nop,ws: TCP Options(sok:selective ACK permitted)
                                 df,id+: quirks(df: don't fragment)
                                        0 TCP Payload Length

負荷分散におけるトラフィック識別

Facebook katran TCP オプションでカスタム ID を追加

図 12: 負荷分散中の L4 レイヤーの XDP と他のサービスとの関係

  • server_id を TCP ヘッダーに追加してステートレス ルーティング メカニズムを実現する
  • TCP ヘッダーの処理のオーバーヘッド (CPU/メモリ) は非常に小さい
  • Maglev Hashバリアントを使用してserver_idに基づいてバックエンドを選択
  • ファイアウォールのないイントラネットにのみ適用

インターセプト イベント ポイントの読み取りと書き込み server_id

図 13: L4 レイヤーの負荷分散で XDP が使用するイベント

オブザーバビリティのデバッグ

cilium pwru (パケット、どこにいますか?)

カーネルでネットワーク パケットをトレースするための API 呼び出し

BPF テクノロジーの紹介 - テクニカル分析

BPFの開発と運用の仕組み

図 14: BPF ライフサイクル プロセス (ネットワークの XDP と TC)

1. 書き込みとコンパイル 2. 検証 3. BPF バイトコードからマシン コードへ 4. マウントと実行 6. システムとの通信 5. XDP の DROP/PASS/TX/REDIRECT

cBPF 仮想マシンの原理

 図 15: コンパイラでのコードの分解

図 16: DAG に変換された BPF

BPF はレジスタ仮想マシンに基づいており、プログラムは最終的に DAG に変換され、カーネルは下図に示すように 2 つのモードでフィルター式のコンパイルと分解を実行します. モデル 1: パフォーマンスを制限する問題ほとんどの場合、計算が繰り返される モデル 2: など モデル 1 と同様、ツリー全体をトラバースするのに必要なブール演算は 6 回だけです モデル 2 eBPF モデル 1 cBPF

cBPF 仮想マシンの実行プロセス

図 17: BPF 内部実行プロセス

図 18: BPF 命令コードの説明

$ tcpdump tcp ポート 443 -d

BPF の既存の問題

カーネルのバージョンとセキュリティ

  • カーネルバージョンは Linux > V4.18 をサポート
  • XDP とその MAP サポート
  • BTF はさまざまなバージョンのカーネルで実行されます
  • セキュリティ権限昇格の脆弱性 Linux V5.7~V5.8
  • CVE-2020-27194: 検証中の範囲外の読み取りと書き込み
  • CVE-2020-8835: 検証時の定数変数値の範囲の論理エラー
  • CVE-2020-27194: 検証中に境界トラッキングを登録する
  • コンテナ エスケープ: ルートキットの書き込み、ユーザー スペースの変更、ネットワーク データのフック

おすすめ

転載: blog.csdn.net/zmule/article/details/126549626