IEEE802.11数据帧在Linux上的抓取

终于得到了梦寐的《802.11无线网络权威指南》,光看书是不行的,关键还是自己练习,这就需要搭建一个舒服的实验环境,抓包是必不可少的了,因为只有详细分析802.11数据帧,才能深入理解协议的细节。软件上就是这个理,手上没设备还是不行,这可是搭建实验环境的第一步,巧妇难为无米之炊。设备问题很好解决,买一个就行了,最好买适合DIY的那种,既便宜又不怕折腾坏了,因此淘宝是一个好去处。我搞到了一个ralink的802.11bgn的无线网卡,USB2.0的,除了有点发热之外别的都很好,软AP信号足,功率够,速度快。就是驱动不太给力啊。

《802.11无线网络权威指南》第二版(中文影印版)(非扫描版)PDF下载见

硬件有了,先驱起来再说,完事之后就要想办法抓包了,千万别以为抓包很容易,一个软件就搞定,想抓取802.11的数据包,还真得下一番功夫啊,本文接下来的部分就谈谈我的802.11抓包经历。

Linux内核的抓包机制软件上全在ptype_all这个链表,而不存在所谓“网卡混杂模式”,混杂模式主要是硬件上的概念,有些网卡会在芯片内部完成MAC地址的过滤,因此必须让芯片“知道”不要过滤任何地址这一件事,因此就有了混杂模式的概念,对于无线网络,混杂模式在理解上更加复杂,因此“不要过滤任何数据帧”和802.11规定的AP地址过滤某些行为上是矛盾的。举个例子,一个没有和此AP建立关联的移动节点发来的包,AP按照802.11规范是要丢掉它的,然而混杂模式又要求接受它,这就是矛盾。矛盾的本质原因在于无线链路的“无边界”特征,这是电磁波的物理特性导致的。对于此谁也无能改变,因此ESS无线网络就不能设计成一个完全的广播网络,否则一个三维空间的广播造成的冲突要浪费多少资源啊--我们知道有线局域网以太网最初是一个一维线缆上的广播而已,现在有了交换机,CSMA/CD基本已经不再被使用了。只能由AP接入点来负责在移动节点之间转发数据帧,因为只有它知道谁跟自己建立了关联。这种区别造成了无线网络抓包的尴尬。

在设计上,操作系统完全避免了这个尴尬,要么它根本不允许在802.11这个层次上进行抓包,要么由驱动决定如何实现抓包。对于Linux,高版本内核实现了统一的802.11适配层框架,驱动的实现可选使用,低版本内核完全由驱动来决定能否实现抓包;对于Windows,如果你使用WireShark工具在无线网卡上进行抓包,会得到以下错误:

IEEE802.11数据帧在Linux上的抓取

在Wireshark的网站上,也有类似的说法:


这个may not未免太无耻了。然而tcpdump的手册上却说可以在monitor mode下抓取802.11帧,然而这却需要驱动来支持。对Linux而言,虽然较高版本的内核支持了802.11适配层,然而却不是每个驱动的实现都遵循了这个框架,比如我手上的ralink的驱动就很扯,完全按照windows的那一套来写的。因此依靠monitor mode来抓取802.11帧这完全靠不住!接下来分析Linux的抓包机制和802.11适配层的关系以及衔接。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/pxgxg.html