この記事の写真はすべてインターネット上の公開情報からのものであり、ソースは示されていません。コンテンツは、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種類のマウントポイント
- 調査
- システムコール
- sockmap/sockops
- kプローブ
- cgroup
- tc
- xdp
図 6: BPF の XDP プログラムの 4 つのパケット処理方法
XDPの4つのパケット処理方法
- カーネルへの PASS リリース
- DROP 破棄、カーネル未満
- REDIRECT 他の処理を転送する
- 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: 検証中に境界トラッキングを登録する
- コンテナ エスケープ: ルートキットの書き込み、ユーザー スペースの変更、ネットワーク データのフック