抓包学习笔记
《wireshark数据包分析实战》第三版中文版
夹杂其他的笔记一起记录抓包相关的知识笔记,如:极客时间《网络排查案例课》。
底层原理
BPF
BPF 全称是 Berkeley Packet Filter(也叫 BSD Packet Filter),它是 tcpdump 等抓包 工具的底层基础。在 BPF 出现之前,虽然各家操作系统都有自己的抓包工具,但也都有这 样或那样的不足。比如,有些系统把所有网络报文一股脑儿塞给用户空间程序,开销非常 大;而有些系统虽然有报文过滤功能,但是工作很不稳定。
为了解决这些问题,1992 年,也还是在劳伦斯伯克利国家实验室,当初 tcpdump 的两个 作者史蒂文·麦克凯恩(Steven McCanne)和范·雅各布森(Van Jacobson)发表了关于 BPF 的 论文,它以一种新的基于寄存器的虚拟机方式,实现了高效稳定的报文过滤功 能。从此以后,抓包技术这棵大树有了一个甚为强大的根基,而构建在 BPF 之上的 libpcap、tcpdump 等不断枝繁叶茂,进一步使得抓包工作变得方便、稳定,我们这些凡 夫俗子才好在这棵大树底下,下棋乘凉。
libpcap
BPF 实现了抓包虚拟机,但它是如何被用户空间程序使用的呢?于是,libpcap 出现了, 它提供了 API 给用户空间程序(包括 tcpdump、Wireshark 等),使得后者能方便地调 用 BPF 实现抓包过滤等功能。也就是说,libpcap 是 BPF 的一层 API 封装。 那么到目前为止,我们应该就能明白 tcpdump 是怎么工作的了:tcpdump 调用了 libpcap 接口,后者调用 BPF 实现了报文过滤和抓取。我们来看一下示意图:
WinPcap
Windows 上也可以做到类似 Linux 这样的抓包,其底层就是依赖 WinPcap,它是 libpcap 的 Windows 版本。微软很早就支持了图形界面抓包工具,从 Windows NT 时代 开始,人们就可以用 Network Monitor 这个工具在 Windows 平台上进行网络排查。十 多年前,我还在做 Windows 工程师时,也时常用到这个工具。算起来,我跟抓包工具结 缘也有不少年头了(哎,又暴露年龄了)。
eBPF
Linux 从 3.18 版本开始支持 extended BPF,简称 eBPF。这是一个更加通用的内核接口,不仅能支持网络抓包,还能支持网络以外的内核观测点的信息收集等工作。所以事实上,eBPF 已经是一个通用工具,而不再局限在网络工具这个角色定位上了。
同时,也因为它在数据面上的性能很出色,所以现在不少公司正在探索,利用它实现一些 数据面的开发工作,比如高性能的负载均衡。相信不久的将来,我们就能看到越来越多的 eBPF 的应用案例了。
为什么抓包文件有好几种类型?
如果你留意过抓包文件后缀名的话,会发现有 pcap、cap、pcapng 这几种不同的后缀名。为什么会有好几种类型呢?下面我来给你说道说道。
pcap
这个是 libpcap 的格式,也是 tcpdump 和 Wireshark 等工具默认支持的文件格式。pcap 格式的文件中除了报文数据以外,也包含了抓包文件的元信息,比如版本号、抓包时间、 每个报文被抓取的最大长度,等等。
cap
cap 文件可能含有一些 libpcap 标准之外的数据格式,它是由一些 tcpdump 以外的抓包程序生成的。比如 Citrix 公司的 netscaler 负载均衡器,它的 nstrace 命令生成的抓包文 件,就是以.cap 为扩展名的。这种文件除了包含 pcap 标准定义的信息以外,还包含了 LB 的前端连接和后端连接之间的 mapping 信息。Wireshark 是可以读取这些.cap 文件的, 只要在正确的版本上。
pcapng
pcap 格式虽然满足了大部分需求,但是它也有一些不足。比如,现在多网口的情况已经越来越常见了,我们也经常需要从多个网络接口去抓取报文,那么在抓包文件里,如果不把这些报文跟所属的网口信息展示清楚,那我们的分析,岂不是要张冠李戴了吗?
为了弥补 pcap 格式的不足,人们需要有一种新的文件格式,pcapng 就出现了。有了它, 单个抓包文件就可以包含多个网络接口上抓取到的报文了。pcapng 还有很多别的特性,比如更细粒度的报文时间戳、允许对报文添加注释、 更灵活的元数据,等等。如果你是用版本比较新的 Wireshark 和 tshark 做抓包,默认生 成的抓包文件就已经是 pcapng 格式了。
tshark对比tcpdump
TShark是基于终端(cli)的Wireshark,它是能够提供大量和Wireshark功能相同的数据包分析功能。如果你安装了Wireshark,那么你应该也安装了TShark。
如果要使用命令行抓包,则windows多用tshark;linux下一般使用tcpdump,也可以yum/apt instgall wireshark,安装完自带tshark。建议使用tshark,tshark比tcpdump更强大。
二者区别:
在TShark的输出里,每一行代表一个数据包,每一行输出的格式取决于数据包使用的协议类型。TShark底层使用和Wireshark一样的解析器来分析数据包,所以TShark的输出和Wireshark的包列表窗口很像。正因为TShark可以解析七层协议,所以它能够比Tcpdump提供更多的有关包头信息的内容。
Tcpdump中每行也代表一个数据包,根据不同的协议来规范每行的输出格式。因为Tcpdump不依赖于Wireshark的协议解析器,所以第7层的协议信息无法被解码。这也是Tcpdump的最大限制之一。取而代之的是,Tcpdump单行数据包只会根据传输层协议(TCP或UDP)进行解码。
第1章 网络基础
数据包在网络层。
OSI参考模型最初在1983年由国际标准化组织出版,标准号为ISO 7498。OSI参考模型只是一个行业建议标准,协议开发时并不需要严格地遵守它。OSI参考模型也并不是现有唯一的网络模型,例如,有些人更推崇美国国防部(DoD)的网络模型,也被称为TCP/IP模型。
集线器是半双工,不能同时发送和接收,已经被交换机取代。
第2章 监听网络线路
我们可以使用网卡的混杂模式来确保能够捕获所有的网络流量。一旦工作在混杂模式下,网卡将会把每一个它所看到的数据包都传递给主机的处理器,无论数据包的目的地址是什么。一旦数据包到达CPU,它就可以被一个数据包嗅探软件捕获并进行分析。
现在的网卡一般都支持混杂模式,Wireshark软件包中也包含了libpcap / WinPcap驱动,这让你能够很方便地在Wireshark软件界面上就将网卡直接切换到混杂模式上。
交换机是现在网络环境中一种常见的连接设备类型。它们为通过广播、单播与组播方式传输数据提供了高效的方法。另外,一些交换机还允许全双工通信,也就是说,设备可以同时发送和接收数据。
第3章 Wireshark入门
与类似于Tcpdump使用复杂命令行的那些数据包嗅探工具相比,Wireshark的图形化界面对于那些数据包分析的初学者而言,是十分方便的。记住一些快捷操作:
<C+f>搜索框
搜索到结果后,<C+n>下一个结果,<C+b>上一个结果。
标记 <C+m>
标记里面跳转 <shift+C+n>
第4章 玩转捕获数据包
捕获过滤器:bpf语法规则
设置菜单
显示过滤器:更加常用
Wireshark 过滤器
过滤器这一块也是很丰富且很有价值的内容。有时候,能否写出一个高效准确的过滤器,几乎可以当做是区分我们抓包分析水准的量尺,所以对过滤器再重视也不为过。下面我们 来回顾几个典型的过滤器。
排查技巧:
整数值: