linux平台下面已经有了抓包工具tcpdump, 非常经典,使用起来也非常方便。但是因为某些系统架构上或者其它方面的原因,有时候tcpdump并不能满足产品实际需要,公司的产品是电信运营商相关的软硬件集成产品,平常在使用的时候经常需要抓包来分析、定位问题,之前的抓包功能是基于tcpdump的基础上的,但是因为系统架构方面的原因,抓包功能始终无法抓到所有进出报文,每次只能抓到特定一部分报文,此外因为抓包之后生成的文件是临时存储在flash中,抓包文件大小就会受到系统存储空间制约,每次抓包只能抓去少量报文。对于电信级通信产品,吞吐量巨大,稍稍抓下包生成的文件大小就会超出限制。有了上述种种不便之处,决定开发一个新的抓包功能,基本功能要求有下面几点:

1. 能够抓到所有报文

2. 能够设置过滤条件进行抓包,包括端口、ip地址和协议类型(TCP、UDP、ARP和ICMP)

3. 具备远程抓包功能。

远程抓包功能就是存在一台抓包服务器,产品抓到的报文能够送到服务器上存储,这样能够使得抓包文件大小不受限制,只要远程服务器存储空间够大。想象这样一个场景:产品在机房运行,运维人员需要抓包分析问题的时候,只需要使用任意一台连接到机房产品的PC,开启远端抓包功能后,产品能够将报文发送到指定的PC机上,这时PC机就相当于抓包服务器,抓包文件大小只受PC存储空间限制。

这样的功能需要实现两个方面,一个是抓包服务器的实现,另一个就是抓包功能的实现。本篇博客以及接下来的博客就详细介绍相关功能的原理、实现以及所遇到的问题。

首先来看一下抓包功能的实现。在linux平台下面,内核抓包功能实现大致有两种(可能还有其它方式,有知道的同学还请告诉我),一种是借助netfilter框架,另一种是使用dev_add_pack注册协议处理函数。对了,这里讲的都是内核抓包,用户层也是可以抓的,使用lipcap就可以很方便的抓取,这个先不提,等讲到抓包服务器实现的时候再来将libpcap的使用。

我们使用的抓包方式是前一种,即netfilter框架,至于后面那一个 dev_add_pack方式,还有一些问题尚未解决,咱先讨论netfilter。

先简介一下netfilter框架,如下图:

netfilter在网络层(IP层)设置了五个hook点,如图中红色方框显示,

1.      NF_IP_PRE_ROUTING : (刚刚进入网络层的数据包通过此点)

2.      NF_IP_LOCAL_IN : (经路由查找后,送往本机的通过此检查点)

3.      NF_IP_FORWARD : (要转发的包通过此检测点)

4.      NF_IP_LOCAL_OUT : (本机进程发出的包通过此检测点)

5.      NF_IP_POST_ROUTING : (通过网络设备出去的包通过此检测点)

因为我们要抓进出的报文,所以分别在报文进出的入口(PRE_ROUTING)和出口(POST_ROUTING)添加了两个钩子函数,如上图绿色方框显示。有了这两个函数,偶就可以对进出的报文做处理了。怎么处理呢,对符合条件的报文该怎么抓呢,抓到之后又该怎么处理?先看下图:

这个图就回答了上面那几个问题,首先抓到报文后,要抓取其L2层以上数据,也就是MAC层之上,其次抓到之后,需要把它送出去,送到服务器上,这时候需要添加新的UDP、IP首部,用来设置远端服务器的地址信息等。UDP的数据部分就是抓到的报文。等到封装好之后,我们就可以把它发送出去,这时候远端服务器收到报文之后就可以读取了。就像下面这样:设置远端服务器地址192.168.11.12:1112,当抓到报文后就将报文复制一份发送到这个地址。下面数据部分可以看到以太网层、IP层首都被封装成UDP数据部分,这样当服务器端收到这样报文后,读取其数据部分,封装成wireshark格式就可以直接读取了。

今天先讲到这,下一篇博客将讨论netfilter的实现部分。

ps:创建了一个linux内核、应用程序开发讨论交流群,欢迎感兴趣的同学加入,群号:745510310,热烈欢迎哈

linux 内核抓包功能实现基础(一)设计思路相关推荐

  1. Linux 内核抓包功能实现基础(三) 抓包服务器的实现

    上回博客我们讲到了内核抓包内核端的实现,通过上篇博客的例子我们就能够开始抓包了,整个抓包的拓扑图如下: 当开始抓包后,抓包机器将抓到的报文送到服务器上,假设服务器地址是192.168.199.123: ...

  2. Linux 内核抓包功能实现基础(四) 手动查找邻居缓存填充MAC地址

    之前写了三篇关于内核抓包功能的实现,包括抓包原理.实现以及抓包服务器的实现.基本的功能都已经有了,但是还有些小问题有待解决.今天有空就解决一下. 开发版本基于内核3.4.39. 先介绍一下问题背景,抓 ...

  3. linux 内核抓包功能实现基础(二) netfilter处理

    上篇博客主要介绍了内核抓包设计思路与效果,并没有给出详细的设计实现,看起来就像一个花架子,华而不实.本篇博客就结合具体的代码介绍一下抓包的实现过程.先大致概括一下代码的思路,抓包模块启动后,就去net ...

  4. Linux 内核抓包功能实现基础(五) 常见问题解析

    之前在部门产品上开发了内核抓包模块,基于openwrt平台,通过netfilter框架实现相关功能.核心功能就是在netfilter 的PRE_ROUTING 和 POST_ROUTING链上增加两个 ...

  5. Linux tcpdump抓包

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  6. Linux下抓包工具tcpdump详解

    简介 用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的 ...

  7. Burpsuite工具的代理抓包功能实验

    实验声明:本实验教程仅供研究学习使用,请勿用于非法用途,违者一律自行承担所有风险! 实验目的 实验环境 实验原理 实验步骤 第一步 启动Burpsuite 第二步 配置Burpsuite的监听参数 第 ...

  8. 七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包...

    七周二次课(1月23日) 10.6 监控io性能 10.7 free命令 10.8 ps命令 10.9 查看网络状态 10.10 linux下抓包 ========================== ...

  9. centost查看网络信息_监控io性能、free命令、ps命令、查看网络状态、Linux下抓包...

    一.监控io性能 iostat命令 iostat命令被用于监视系统输入输出设备和cpu的使用情况.它的特点是汇报磁盘活动统计情况,同时也会汇报出cpu使用情况.通vmstat一样,iostat也有一个 ...

最新文章

  1. git拉取远程分支并创建本地分支
  2. MySQL查看及修改字段的字符集
  3. oracle的等保,Oracle等保测评相关指令
  4. LeetCode 1426. 数元素(哈希set)
  5. Spring Batch示例教程
  6. 2021年上半年软考网络工程师考试下午真题及答案解析
  7. 【报告分享】科技抗疫,5G助力:5G通信为公共卫生防控诊疗体系带来的新契机.pdf...
  8. Ubuntu16下载tomcat8
  9. android 8 推送到tv,手机如何推送文件到电视,三款TV投屏软件亲测推荐!
  10. 扫描二维码登录的接口
  11. CodeMatic动软自动生成Nhibernate
  12. 锐浪报表使用技巧Gird++
  13. 机器人庄园作文_关于周庄一日游作文六年级汇总5篇
  14. Floorplan的SSN(Simultaneous Switching Noise)问题
  15. Java判断字符串中是否包含中英文标点符号
  16. MP3mini播放模块arduino<DFRobotDFPlayerMini.h>函数详解
  17. python编写的动物识别专家系统_基于Python的动物识别专家系统
  18. 《黑马》——C++基础入门
  19. Python 把几张图片拼接成一张图片,并且写上文字
  20. MFC添加加瓦系列一MFC编写的增量更新软件

热门文章

  1. Build与Version
  2. Editplus PHP版
  3. java 年计算_用Java计算leap年
  4. excel 粘贴到web_最新技术让excel秒变web数据库
  5. STM32 SPI NSS 引脚为不能拉高问题
  6. 第四章4.1 4.2 快速傅里叶变换FFT-介绍
  7. 【福利】有道云笔记免费送30天VIP会员,有道云笔记功能优缺点汇总
  8. 【DIY】DIYarduino温湿度计视频图文教程
  9. 【GPS信号】GPS信号的读取以及kalman滤波预测
  10. 1、HTML 初步认识