tcpdump_BPF

为什么要发明 BPF?(一句话历史)

早年抓包工具(比如 tcpdump 前身)用的是:

  • 所有包全部拷贝到用户态
  • 再在用户态慢慢过滤

缺点:

  • 极慢
  • 占 CPU
  • 高流量下直接卡死

Berkeley 这群人就想:能不能在内核里提前过滤,只把符合条件的包传给用户?

于是设计了:

  1. 在内核里跑一个极简虚拟机
  2. 执行一小段过滤指令
  3. 只把符合条件的包拷贝到用户态

这就是 BPF 的诞生。

tcpdump 用户态代码 → el0_svc(内核入口)→ __arm64_sys_setsockopt → ├─ packet_setsockopt(packet 套接字设置)→ packet_set_ring → 内存分配(__get_free_pages/clear_page) └─ sock_setsockopt → sk_attach_filter(BPF 过滤规则)→ bpf_prog_alloc → 虚拟内存分配(__vmalloc/alloc_vmap_area)

以太网帧头(14字节) ├─ 目的MAC(6字节) ├─ 源MAC(6字节) └─ 以太网类型(2字节,第12-13字节)→ 对应指令0的 12 IP头(至少20字节) ├─ 版本+头长度(1字节,第20字节)→ 对应指令4的 20 ├─ 服务类型(1字节) ├─ 总长度(2字节) ├─ 标识(2字节) ├─ 标志+片偏移(2字节) ├─ 生存时间(1字节) ├─ 协议类型(1字节,第23字节)→ 对应指令2的 23 ├─ 校验和(2字节) ├─ 源IP(4字节) ├─ 目的IP(4字节) └─ 可选字段(0-40字节) TCP头(至少20字节) ├─ 源端口(2字节) ├─ 目的端口(2字节)→ 对应指令7的 x + 2 └─ ...(其他字段)

root@NYX:/# tcpdump tcp dst port 80 -d

(000) ldh 12 // 读取以太网帧头部的类型字段(偏移12)

(001) jeq #0x86dd // 判断是否是 IPv6 (0x86dd),是则跳2,否则跳6

(002) ldb 20 // IPv6:读取下一层协议字段(偏移20)

(003) jeq #0x6 // 判断是否是 TCP (0x6),是则跳4,否则跳15

(004) ldh 56 // IPv6:读取目的端口(偏移56)

(005) jeq #0x50 // 判断是否是 80 端口(0x50),是则跳14,否则跳15

(006) jeq #0x800 // 判断是否是 IPv4 (0x800),是则跳7,否则跳15

(007) ldb 23 // IPv4:读取协议字段(偏移23)

(008) jeq #0x6 // 判断是否是 TCP (0x6),是则跳9,否则跳15

(009) ldh 20 // IPv4:读取IP头部长度(偏移20)

(010) jset #0x1fff // 校验IP头部长度合法性,非法则跳15

(011) ldxb 4*(14&0xf)// 计算TCP头部偏移

(012) ldh x + 16 // 读取TCP目的端口

(013) jeq #0x50 // 判断是否是 80 端口,是则跳14,否则跳15

(014) ret #262144 // 匹配成功:返回最大抓包长度(抓取该包)

(015) ret #0 // 匹配失败:返回0(丢弃该包)

相关推荐
xexpertS1 小时前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
带娃的IT创业者2 小时前
突破内存瓶颈:利用 Nvidia GPU 显存作为 Linux Swap 空间的深度实践
linux·运维·服务器·nvidia·swap·gpu显存
zy happy2 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker
LCG元2 小时前
嵌入式开发踩坑排查实战:从 STM32 外设初始化到 Linux SPI 驱动的 15 类硬件疑难故障深度复盘
linux·stm32·单片机
测试老哥2 小时前
接口自动化测试分层设计与实践总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
代码AC不AC2 小时前
【Linux】Socket编程TCP
linux·tcp·socket编程
扛枪的书生2 小时前
SeaweedFS 学习总结
linux
minglie13 小时前
香橙派zero3配个iic屏显示ip
linux·学习
edwarddamon3 小时前
SSH 指定端口建立隧道:打通内网访问完整教程
linux·命令行
ShirleyWang0123 小时前
Day02 K3s NGF(Nginx Gateway Fabric)单 Worker 环境网关更新与故障处置 SOP
linux·服务器·python·k8s·k3s