找回密码
 立即注册
查看: 583|回复: 0

[linux] Linux之bpfjit使用分析和mini-tcpdump实现

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-7-6 15:08:58 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 2024-7-6 16:08 编辑

1. 概述

BPF(Berkeley Packet Filter)是一种用于网络数据包过滤的技术,广泛应用于网络监控和数据包分析中。BPF JIT(Just-In-Time)编译器进一步提升了BPF的性能。本文将介绍BPF JIT的使用,并实现一个简易版本的tcpdump,即mini-tcpdump。

1.1 BPF简介

BPF是一种高效的数据包过滤机制,通过定义过滤规则,可以在内核中直接对数据包进行处理,从而减少不必要的数据传输和处理。BPF JIT编译器将BPF指令转换为机器码,提高了执行效率。

1.1.1 BPF JIT编译器的作用

BPF JIT编译器的主要作用是将BPF字节码转换为本地机器码,从而加快过滤规则的执行速度。通过启用BPF JIT,网络数据包过滤的性能可以得到显著提升。

2. 启用BPF JIT编译器

linux系统中,BPF JIT编译器通常默认启用,但可以通过配置文件进行检查和启用。

2.1 检查BPF JIT状态

可以通过以下命令检查BPF JIT编译器是否启用:

  1. cat /proc/sys/net/core/bpf_jit_enable
复制代码


如果输出为1,则表示BPF JIT编译器已启用。如果输出为0,则需要手动启用。

2.2 启用BPF JIT编译器

通过以下命令启用BPF JIT编译器:

  1. echo 1 > /proc/sys/net/core/bpf_jit_enable
复制代码


3. mini-tcpdump实现

mini-tcpdump是一个简化版本的tcpdump,用于捕获和显示网络数据包。我们将使用BPF来实现数据包过滤,并通过Python脚本来捕获和显示数据包。

3.1 安装依赖

首先,安装必要的Python库:

  1. pip install scapy
复制代码


3.2 编写mini-tcpdump脚本

以下是mini-tcpdump的Python脚本:

  1. import os
  2. from scapy.all import *

  3. # 定义BPF过滤规则
  4. bpf_filter = 'tcp port 80'

  5. # 检查并启用BPF JIT
  6. with open('/proc/sys/net/core/bpf_jit_enable', 'r') as f:
  7.     jit_status = f.read().strip()
  8. if jit_status != '1':
  9.     with open('/proc/sys/net/core/bpf_jit_enable', 'w') as f:
  10.         f.write('1')

  11. # 捕获并显示数据包
  12. def packet_callback(packet):
  13.     print(packet.show())

  14. print("Starting mini-tcpdump...")
  15. sniff(filter=bpf_filter, prn=packet_callback, store=0)
复制代码


3.3 运行脚本

保存脚本为mini_tcpdump.py,然后通过以下命令运行脚本:

  1. python mini_tcpdump.py
复制代码


4. 结果分析

运行脚本后,程序将开始捕获并显示所有TCP端口为80的数据包。这是一个简化版本的tcpdump,主要用于演示BPF和BPF JIT的使用。

4.1 输出示例

每当捕获到符合过滤规则的数据包时,程序将输出数据包的详细信息:

  1. ###[ Ethernet ]###
  2.   dst       = 00:0c:29:3e:4f:60
  3.   src       = 00:0c:29:6d:2e:58
  4.   type      = IPv4
  5. ###[ IP ]###
  6.   version   = 4
  7.   ihl       = 5
  8.   tos       = 0x0
  9.   len       = 52
  10.   id        = 1
  11.   flags     =
  12.   frag      = 0
  13.   ttl       = 64
  14.   proto     = tcp
  15.   chksum    = 0x3d4c
  16.   src       = 192.168.1.2
  17.   dst       = 192.168.1.1
  18. ###[ TCP ]###
  19.   sport     = 12345
  20.   dport     = http
  21.   seq       = 0
  22.   ack       = 0
  23.   dataofs   = 5
  24.   reserved  = 0
  25.   flags     = S
  26.   window    = 8192
  27.   chksum    = 0x1b2d
  28.   urgptr    = 0
复制代码

5. 总结

本文介绍了BPF JIT编译器的基本概念和启用方法,并通过Python脚本实现了一个简易版本的tcpdump。通过mini-tcpdump,我们可以捕获并显示特定的数据包,从而更好地理解和应用BPF技术。希望本教程能够帮助你更好地掌握BPF JIT的使用,并应用于实际的网络数据包分析中。






------------------------------------------------------------------------------------------------------------------------------------------

========  御 坂 主 机  ========

>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<

>> 推广/合作/找我玩  TG号 : @Misaka_Offical <<

-------------------------------------------------------------------------------------------------------------------------------------------


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 08:15 , Processed in 0.083015 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表