本文是书籍《Wireshark数据包分析实战(第3版)》第 1~3 章的学习笔记。
网络协议是比较偏理论的东西,如果一味看书不实践的话,很难有较深刻的理解。而网络抓包分析就是很好的实践方式:通过捕获网络上的数据报文,分析网络双方的连接方式,数据包大小,状态,数据格式等,从实践中获得直观的理解,从而进一步思考并消化理论内容。
目前流行的抓包工具有:Tcpdump、OmniPeek 和 Wireshark 等,其中 Wireshark 是目前主流免费的抓包工具,使用十分广泛,而 Tcpdump 则在 Linux 命令行下经常使用。笔者目前在学习使用 Wireshark 和 Tcpdump 两个工具,在后续文章中将会不断输出对应的学习总结。
网络线路监控
说到抓包工具,其工作过程一般有 3 个步骤:收集、转换和分析。
- 收集:从网络设备上收集原始二进制数据,一般要指定从某一个网卡上收集;
- 转换:将捕获的二进制数据转换成可读形式;
- 分析:对转换后的网络报文进行深入分析,包括识别其协议,以及每种协议的具体内容和属性。
那抓包工具工作在哪里呢?这就要说到网络协议栈了,笔者曾在《基本通信模型》这篇文章中进行过阐述,这里再次引用周志明老师在《凤凰架构》一书中的这幅图:
在 OSI 参考模型中的数据链接层(对应 TCP/IP 协议栈的网络访问(链接)层)中有两个环节:Device 和 Driver,它们负责什么呢,这里再次复习一下。
Device: 是网络访问层中面向系统一侧的接口,主要作用是抽象出统一的界面,让程序代码去选择或影响收发包的出入口,譬如决定数据应该从哪块网卡设备发送出去;还有就是准备好网卡驱动所需的数据,譬如来自上一层的 IP 数据包、Next Hop 的 MAC 地址(这个地址是通过 ARP Request 得到的)等等。
但这个 Device (设备)与物理硬件设备并不是同一个概念,它只是一种向操作系统开放的接口,其背后可能代表真实的物理硬件,也可能是某段具有特定功能的程序代码,譬如即使不存在物理网卡,也依然可以存在回环设备(Loopback Device)。
许多网络抓包工具,如 Tcpdump,Wireshark 便工作在此处。Driver: 是网络访问层中面向硬件一侧的接口,网卡驱动程序会通过 DMA 将主存中的待发送的数据包复制到驱动内部的缓冲区之中。数据被复制的同时,也会将上层提供的 IP 数据包、Next Hop MAC 地址这些信息,加上网卡的 MAC 地址、VLAN Tag 等信息一并封装成为以太帧,并自动计算校验和。对需要确认重发的消息,如果没有收到接收者的 ACK(确认)响应,那重发的处理也是在这里自动完成的。
了解了抓包工具的工作位置,接下来需要回答的问题是:在一个数据中心内部,如果需要分析网络问题,我们该如何部署抓包工具呢?最容易想到的是,哪个机器上可能出现问题,就部署一个。这的确是一个经常使用的方式,那还有其他方式吗?
最理想的方式是,我们采集需要的数据,但不留下任何痕迹。也就是说,尽量不要影响正常的网络处理性能,甚至是破坏正常的网络流量。由于本地网络下一般都以交换机构成的局域网为主,故下面将对交换式网络下的几种监控方式进行总结,主要包括端口镜像、集线器输出、使用网络分流器和 ARP 缓存污染攻击。
1、端口镜像
简单来说,就是将交换机中某个 端口1 镜像复制到另一个 端口2 上,然后在 端口2 上插入带有抓包工具的网络设备(比如一台普通的计算机,这里称之为嗅探器)。使用这种方法的一个前提就是交换机支持端口镜像功能,可以通过相关命令开启或关闭。
关于开启交换机端口镜像功能的命令,交换机生产厂商会提供,比如思科家提供的命令是:
set span <source port> <destination port>
使用端口镜像的优点是简单高效,不留痕迹,并且不需要将被监控的主机脱机下线。而其不足之处,一是需要额外占用一些端口,另外一方面,如果将多个端口都镜像复制到一个端口,可能造成这个端口出现流量风暴,从而产生丢包,甚至是通信中断的情况。
所以,针对高吞吐的网络环境,可以采用后面介绍的分流器方案。
2、集线器输出
集线器这类设备的特点是某个端口接收的流量,将会广播到其他所有端口上,只不过这类设备现在已经不常用了。利用这个特点,可以将我们的嗅探器与目标计算机连接到一台集线器上,如下图所示:
但需要了解的是:
- 集线器是半双工模式,即不能同时收发数据,故在现代或高密度的网络环境中很难看到它们的身影(被交换机替代,交换机支持全双工)。
- 一般情况下,集线器广播到其他端口的数据包,对应端口上的计算机可能会根据 MAC 地址进行判断,如果不匹配,则丢弃。所以,为保证嗅探器能抓到包,可能需要将其设置为接收所有包。
- 这种抓包方式,需要将目标计算机先下线,做不到无感知监控。
3、网络分流器
集线器不适合在高吞吐的网络环境中抓包,作为替代方案,网络分流器是一个不错的选择。
网络分流器是一个特殊的硬件设备,专门用来进行网络分析,将其安装在网络环境的两个端点之间,即可捕获这两个端点之间的数据包。网络分流器又分为聚合和非聚合两种类型,其中聚合表示用一个监听口来抓取双向通信(流入流出)数据,而非聚合的意思是用两个端口来分别监听流入和流出的流量,灵活性更好。
非聚合的分流器灵活性更好,但由此带来的弊端就是嗅探器端需要接两根网线,所以需要两张网卡支持。与集线器输出类似,这种抓包方式,目标计算机也需要先下线,做不到无感知监控。另外,这类设备往往不便宜,如果预算资金有限,可能就需要权衡了。
4、ARP 缓存污染
数据包在一个局域子网内是如何寻址的?在以太网中,一般都是利用 MAC 地址,但我们发送数据的时候用的却是 IP 地址,为什么呢?因为 IP 地址 相当于门牌号,是互联网路由的基础规则,而 MAC 地址 只能在一个较小的空间内使用,更像是身份证号。所以,这里就存在一个转换工作,即通过 IP 地址找到 MAC 地址,此时便用到了 ARP 协议。
ARP 协议工作在 OSI 的第 2 层[1],当不知道某台机器的 MAC 地址时,会发送一个广播数据包:192.168.xx.xx 的 MAC 地址是多少啊
。当某一台机器发现这个 IP 地址 与自己的相同时,它就会回复,而其他机器则直接丢弃刚才收到的报文。
根据这个广播机制,通过发送虚假 MAC 地址的 ARP 消息,来劫持其他计算机的流量,就是 ARP 缓存污染,又称为 ARP 欺骗。一般来说,这种方式经常被攻击者使用,甚至可以使用它进行拒绝服务攻击(DoS)。
如上图所示,使用 ARP 缓存污染后,嗅探器将会成为双方流量的中间人,所有流量都会先到嗅探器,然后再重路由到真正的目标主机。通过 Cain & Abel 等软件,可以在本地进行模拟,但这不是本文重点内容,所以不进行赘述。
同样,这种方式也有其弊端,当所有流量都通过嗅探器之后,嗅探器就成为了流量瓶颈,可能会造成 DoS 式的影响,导致网络性能下降以及分析数据的不完备。另外,流量多绕了一圈,服务请求的延迟也会增加。
上面是针对交换式网络下的流量监控,如果换成路由网络呢(即一个网络环境中跨越多个子网)?其实上面的方式也同样适用,只不过分析问题时,不好确定是哪个子网的问题,为此可能需要部署多个嗅探器。
对于我们日常的网络故障分析,可能没有上面提到的这么复杂,一般会直接通过相关软件工具,如 Tcpdump 进行抓包,再使用 Wireshark 等工具进行可视化分析。但了解网络监控方式,对于学习网络基本原理还是非常必要的。
Wireshark 介绍
Wireshark 最初版本叫做 Ethereal,由毕业于密苏里大学堪萨斯城分校计算机科学专业的 Gerald Combs 出于项目的需要开发,并于 1998 年以 GPL 开源许可证发布。工作多年以后,Combs 从老东家离职,但由于公司取得了 Ethereal 的商标,所以 Combs 和开发团队在 2006 年年中时将项目改名为 Wireshark。Wireshark 随后被广泛下载和使用,受到开发者的追捧。
一般来说,评价一款网络抓包工具是否好,即性价比高,有以下一些评估指标:支持的网络协议、支持的操作系统、可视化分析、价格、服务支持等。而 Wireshark 在这些方面都有较大优势:
- 支持的协议:目前已支持超过 1000 ️种协议,覆盖大部分应用场景。这得益于开源社区运营模式,如果某个协议暂时不支持,大家可以一起开发实现。
- 支持的操作系统:主流操作系统都支持,包括 Windows,macOS[2],Linux等。
- 可视化分析:拥有友好的可视化分析界面,强大的过滤分析器,使用简单,上手快。
- 价格:基于 GPLv2 开源协议,产品完全免费。
- 软件支持:开源社区拥有大量的帮助文档和 FAQ 等,并且也有付费支持。
另外,在 GitLab 上有源码,可以随时下载学习和分析,理解 Wireshark 底层的实现原理。
官网可以直接下载软件安装包,参考相关步骤即可快速完成安装,这里就不赘述了。
Wireshark 窗口布局
打开软件,其主页面如下所示:
这里我们通过抓包来对整个软件的窗口布局进行一个大体的描述。
首先,选择网卡,这里选择 Wi-Fi: en0,然后在上面的捕获过滤器中选择想要抓的包,比如这里把与 baidu.com 交换的数据包抓取出来。
然后,点击回车,此时通过浏览器或 curl 命令访问 baidu.com ,即可看到如下抓包记录:
这是一个完整的 http 请求流程,从客户端发起 TCP 三次握手开始,到四次挥手结束。最上面的显示过滤器可以对已经抓取的数据包进行过滤分析,下面三块分别是数据包列表、数据包细节和数据包字节。
- Packet List:当前捕获的所有数据包,主要的几列信息分别是:数据包序号(No.)、数据包被捕获时的相对时间(Time)、源地址(Source)、目标地址(Destination)、协议(Protocol)、数据包长度(Length)以及数据包概况(Info)。
- Packet Details:分层展示了某个数据包的详细内容,比如图中选中的第 4 个数据包,被解析成了 5 层信息,分别是数据包元信息、数据链路层信息、网络层信息、TCP 传输层信息以及 HTTP 应用层信息。后续分析某一个具体协议时,我们再详细查看每一层内容。
- Packet Bytes:二进制字节数据,即这个数据包未被处理的样子,计算机接收或发出去的数据包,都是二进制的。在互联网上传输的各类数据包,都是在数字信号和模拟信号之间不停地转换。
目前这三块的布局是两行,并且第二行又拆分为两列。当然,这个布局是可以在首选项中修改的。
如上图所示,在 Wireshark 首选项中包含如下几块内容:
-
Appearance(外观):这里可以设置窗口布局、状态栏显示信息、捕获数据的字体、前景色和背景色以及 Packet List 中的列选项等。
-
Capture(捕获):对捕获数据包的方式进行特殊设置,比如设置默认抓包的网卡、是否在启动程序时加载网卡、是否实时更新 Packet List 中的数据包等。
-
Expert(专家):配置字段和严重程度,目前笔者暂时还未弄清楚如何配置[3]。
-
Filter Buttons(过滤按钮):配置并管理自定义的过滤规则。
-
Name Resolution(名称解析):将相关地址(如 MAC,IP 地址等)解析成更容易分辨的名字。
-
Protocols(协议):针对目前支持的各种网络协议,对数据包解码功能进行调整。
-
RSA Keys(RSA 密钥):针对 TLS 协议,对数据包解密而配置的密钥[4]。
-
Statistics(统计):Wireshark 统计功能的相关设置选项。
-
Advanced(高级):更高级的捕获设置功能,一般针对 Wireshark 高级玩家。
除了上面这些基本设定,在 Wireshark 的功能菜单中还有很多设置,比如让数据包彩色高亮的“View–>Coloring Rules”。后续在使用的过程中,我们会不断遇到这些配置,到时笔者再针对场景进行说明。
关于 ARP 协议工作在哪一层有争议,比如《TCP/IP 详解》把它放在了二层和三层之间,但既然是协议,大家遵守契约即可,具体在哪一层其实并没有太大关系。 ↩︎
目前 macOS Intel 和 macOS Arm 版本都已支持。 ↩︎
https://www.wireshark.org/docs/wsug_html_chunked/ChAdvExpert.html ↩︎