profile picture

BPF技术介绍 - 生态和历史

November 17, 2021 - Linux

BPF技术介绍 - 生态和历史

本文图片都源于网上公开资料,未注明来源。内容源于对网络检测与响应NDR的开发。

历史成因

历史成因

图1:Linux内核的代码量增长

DPDK、PF_RING和BPF的共同点

分离出网络的数据平面

DPDK、PF_RING和BPF的差异点:生态目标不同

DPDK DPDK

BPF BPF

DPDK与BPF基金会

面向基础设施:底层硬件 / 上层业务

基金会

图2:两种不同利益的基金会

DPDK年度事件和技术标准

年度事件

技术标准

BPF迅速发展的生态

年度技术

产品生态

DPDK与BPF生态

面向生态和开发者不同

产品分类DPDKBPF
安全Falco/Cilium/L4drop/...
可观测性Hubble/L3AF/Tracee/...
网络DPVS/OVS/FD.IO/VPPKatran
SDKsC++/GOC++/Rust/GO/Python
内核TCP栈 F-Stack/mTCPhelper-API/Maps/Verfier&JIT
市场生态关注硬件能力的虚拟化和共享,硬件厂商推动,是虚拟化技术vt-x/ept等在网络IO上的演进关注内核能力的分离和复用云厂商推动,是云原生技术演进对本地生态的融合

表1:两种不同利益的基金会

BPF技术介绍 性能分析

DPDK与PF_RING技术异同 - 技术相近

PF_RING

图3:PF_RING原理

DPDK

图4:DPDK模块结构

相同

差异

BPF的网络技术特点

BPF模块结构

图5:BPF模块结构

BPF的7种挂载点,覆盖全生命周期流程

  1. uprobe
  2. syscall
  3. sockmap/sockops
  4. kprobe
  5. cgroups
  6. tc
  7. xdp

XDP程序的4种包处理方式

图6:BPF的XDP程序的4种包处理方式

XDP的4种包处理方式

  1. PASS 放行到kernel
  2. DROP 丢弃,不到kernel
  3. REDIRECT 转发其他处理
  4. TX 原路返回(用于阻断和重定向)

XDP的卸载网卡性能

Netronome智能网卡数据

XDP的3种挂载模式的性能

图7:XDP的3种挂载模式的性能

XDP在网络协议栈的位置

图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个千兆电口,每秒事务数1000TPS,最大吞吐量500Mbps,最大并发连接数:1000(条)

BPF技术介绍 - 案例分析

实际案例 cloudflare DDOS Mirai僵尸网络的3次攻击

DDOS时网络承载的流量

图9:DDOS时网络承载的流量

2020.07, 654Gbps, SYN 洪水和UDP 洪水 2021.08 ,1.2Tbps, SYN 洪水和UDP 洪水,最大HTTP请求2500万次/s , 3 秒内被阻止 2021.11, 2Tbps, 1分钟的DNS 放大攻击和 UDP 洪水,1.5 万个僵尸 (下图) 近2Tbps

DDOS缓解流程 生态链:全BPF系列产品集成

缓解DDOS时使用XDP的工具链

图10:缓解DDOS时使用XDP的工具链

缓解DDOS时使用XDP的协议找技术

图11:缓解DDOS时使用XDP的协议找技术

p0f指纹库说明 TCP header特征

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是128,flags的数量和位置,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 option添加自定义ID

负载均衡时XDP在L4层与其他服务间的关系

图12:负载均衡时XDP在L4层与其他服务间的关系

拦截事件点读写server_id

XDP在L4层负载均衡时用到的事件

图13:XDP在L4层负载均衡时用到的事件

可观测性 调试

cilium pwru (packet, where are you?)

跟踪内核中的网络包的API调用

BPF技术介绍 - 技术分析

BPF开发运行机制

BPF生命周期流程

图14:BPF生命周期流程(网络的XDP和TC)

1.编写、编译 2.校验 3.BPF字节码到机器码 4.挂载执行 6.与系统通信 5.XDP的DROP/PASS/TX/REDIRECT

cBPF虚拟机原理

代码在编译器的分解

图15:代码在编译器的分解

BPF转换成DAG

图16:BPF转换成DAG

BPF 基于寄存器虚拟机,程序最终转换成一个DAG,并由内核来执行 过滤器表达式在两种模式下的编译分解,见下图 模型1: 制约性能最大的问题,有重复计算 模型2: 等价于模型1,只需6次布尔运算,遍历完整棵树 模型2 eBPF 模型1 cBPF

cBPF虚拟机执行流程

BPF内部执行流程

图17:BPF内部执行流程

BPF指令码解释

图18:BPF指令码解释

$ tcpdump tcp port 443 -d

BPF现有问题

内核版本和安全