Wireshark的基本使用
- 选择对哪块网卡进行数据包捕获
- 开始/停止捕获
- 了解 Wireshark 主要窗口区域
- 设置数据包的过滤
- 跟踪数据流
Wireshark简介:
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
参考资料
官方文档
新手教程
Wireshark软件
基本使用:
使用内容包括:1、Wireshark软件下载和安装以及Wireshark主界面介绍。
2、WireShark简单抓包示例。通过该例子学会怎么抓包以及如何简单查看分析数据包内容。
3、Wireshark过滤器使用。过滤器包含两种类型,一种是抓包过滤器,就是抓取前设置过滤规则。另外一种是显示过滤器,就是在数据包分析时进行过滤数据使用。通过过滤器可以筛选出想要分析的内容。包括按照协议过滤、端口和主机名过滤、数据包内容过滤。
抓包示例
1、打开Wirwshark软件
2、选择自己的网络连接。(可以进入控制面板,点击网络和Internet,进入网络和共享中心,查看本机当前网络连接)
3、启动捕获,Wireshark处于抓包状态。
注意:抓包实验时,可以通过在过滤栏设置过滤条件进行过滤,得到自己需要的数据。
过滤规则:
wireshark过滤器表达式的规则
1、抓包过滤器语法和实例
抓包过滤器类型Type(host、net、port)、方向Dir(src、dst)、协议Proto(ether、ip、tcp、udp、http、icmp、ftp等)、逻辑运算符(&& 与、|| 或、!非)
(1)协议过滤
比较简单,直接在抓包过滤框中直接输入协议名即可。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
(2)IP过滤
host 192.168.1.104
src host 192.168.1.104
dst host 192.168.1.104
(3)端口过滤
port 80
src port 80
dst port 80
(4)逻辑运算符&& 与、|| 或、!非
src host 192.168.1.104 && dst port 80 抓取主机地址为192.168.1.80、目的端口为80的数据包
host 192.168.1.104 || host 192.168.1.102 抓取主机为192.168.1.104或者192.168.1.102的数据包!broadcast 不抓取广播数据包
2、显示过滤器语法和实例
(1)比较操作符
比较操作符有== 等于、! = 不等于、> 大于、< 小于、>= 大于等于、<=小于等于。
(2)协议过滤
比较简单,直接在Filter框中直接输入协议名即可。注意:协议名称需要输入小写。
tcp,只显示TCP协议的数据包列表
http,只查看HTTP协议的数据包列表
icmp,只显示ICMP协议的数据包列表
(3) ip过滤
ip.src == 192.168.1.104 显示源地址为192.168.1.104的数据包列表
ip.dst==192.168.1.104, 显示目标地址为192.168.1.104的数包列表
ip.addr == 192.168.1.104 显示源IP地址或目标IP192.168.1.104的数据包列表
(4)端口过滤
tcp.port 80, 显示源主机或者目的主机端口为80的数据包列表。
tcp.srcport == 80, 只显示TCP协议的源主机端口为80的数据包列表。
tcp.dstport == 80,只显示TCP协议的目的主机端口为80的数据包列表。
(5) Http模式过滤
http.request.method"GET", 只显示HTTP GET方法的。
(6)逻辑运算符为 and/or/not
过滤多个条件组合时,使用and/or。比如获取IP地址为192.168.1.104的ICMP数据包表达式为ip.addr == 192.168.1.104 and icmp
数据链路层
1、熟悉Ethernet 帧结构
前同步码 :用来使接收端的适配器在接收 MAC 帧时能够迅速调整时钟频率,使它和发送端的频率相同。前同步码为 7 个字节,1 和 0 交替。
帧开始定界符: 帧的起始符,为 1 个字节。前 6 位 1 和 0 交替,最后的两个连续的 1 表示告诉接收端适配器:“帧信息要来了,准备接收”。
目的地址: 接收帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。作用是当网卡接收到一个数据帧时,首先会检查该帧的目的地址,是否与当前适配器的物理地址相同,如果相同,就会进一步处理;如果不同,则直接丢弃。
源地址:发送帧的网络适配器的物理地址(MAC 地址),为 6 个字节(48 比特)。
类型: 上层协议的类型。由于上层协议众多,所以在处理数据的时候必须设置该字段,标识数据交付哪个协议处理。例如,字段为 0x0800 时,表示将数据交付给 IP 协议。
数据: 也称为效载荷,表示交付给上层的数据。以太网帧数据长度最小为 46 字节,最大为 1500 字节。如果不足 46 字节时,会填充到最小长度。最大值也叫最大传输单元(MTU)。
在 Linux 中,使用 ifconfig 命令可以查看该值,通常为 1500。
帧检验序列 FCS: 检测该帧是否出现差错,占 4 个字节(32 比特)。发送方计算帧的循环冗余码校验(CRC)值,把这个值写到帧里。接收方计算机重新计算 CRC,与 FCS 字段的值进行比较。如果两个值不相同,则表示传输过程中发生了数据丢失或改变。这时,就需要重新传输这一帧。
2、了解子网内/外通信时的MAC地址
1、ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可使用 icmp 关键字进行过滤以利于分析),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
2、然后 ping qige.io (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址是多少?这个 MAC 地址是谁的?
目的MAC地址是网关的
3、再次 ping www.cqjtu.edu.cn (或者本子网外的主机都可以),同时用 Wireshark 抓这些包(可 icmp 过滤),记录一下发出帧的目的 MAC 地址以及返回帧的源 MAC 地址又是多少?这个 MAC 地址又是谁的?
源地址是本机mac地址,目的mac地址是网关地址。
问题:通过以上的实验,你会发现:
访问本子网的计算机时,目的 MAC 就是该主机的
访问非本子网的计算机时,目的 MAC 是网关的
请问原因是什么?
在同一个子网的时候,子网内的计算机进行访问不需要经过网关就可以直接通信.
而当访问不是同一个子网的计算机的时候,信息传输出去首先就需要到达网关,再由网关进行外部网络的传输。
如果你的电脑是连接的手机热点,那么就会发现目的MAC地址就是手机热点的物理地址,而源MAC地址就是该主机的MAC地址。
3、掌握 ARP 解析过程
1、为防止干扰,先使用 arp -d * 命令清空 arp 缓存
上面显示操作权限不够,可通过管理员身份运行。
2、ping 你旁边的计算机(同一子网),同时用 Wireshark 抓这些包(可 arp 过滤),查看 ARP 请求的格式以及请求的内容,注意观察该请求的目的 MAC 地址是什么。再查看一下该请求的回应,注意观察该回应的源 MAC 和目的 MAC 地址是什么。
3、再次使用 arp -d * 命令清空 arp 缓存
4、然后 ping qige.io (或者本子网外的主机都可以),同时用 4Wireshark 抓这些包(可 arp 过滤)。查看这次 ARP 请求的是什么,注意观察该请求是谁在回应。
源MAC本机,目的mac网关。
问题
通过以上的实验,你应该会发现,
ARP 请求都是使用广播方式发送的
如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
请问为什么?
访问本子网的计算机,由于此时的两计算机是直接通信,不需要网关进行连接,当访问外部计算机的时候,信息传输需要经过网关,才能与外部网络相连,那么就需要知道网关的MAC地址,之后网关在通过路由器的等等找到目的IP的网关,然后目的IP的网关在该子网内广播,找到此IP对应的MAC地址,进行连接。
网络层
1、熟悉IP包结构
使用 Wireshark 任意进行抓包(可用 ip 过滤),熟悉 IP 包的结构,如:版本、头部长度、总长度、TTL、协议类型等字段。
Packet Details Pane(数据包详细信息), 在数据包列表中选择指定数据包,在数据包详细信息中会显示数据包的所有详细信息内容。数据包详细信息面板是最重要的,用来查看协议中的每一个字段。各行信息分别为
(1)Frame: 物理层的数据帧概况
(2)Ethernet II: 数据链路层以太网帧头部信息
(3)Internet Protocol Version 4: 互联网层IP包头部信息
(4)Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP
(5)Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议
问题
为提高效率,我们应该让 IP 的头部尽可能的精简。但在如此珍贵的 IP 头部你会发现既有头部长度字段,也有总长度字段。请问为什么?
因为有些字节是必不可少的,如ip的·源地址和目的地址,mac地址等。
2、IP 包的分段与重组
根据规定,一个 IP 包最大可以有 64K 字节。但由于 Ethernet 帧的限制,当 IP 包的数据超过 1500 字节时就会被发送方的数据链路层分段,然后在接收方的网络层重组。
缺省的,ping 命令只会向对方发送 32 个字节的数据。我们可以使用 ping 14.215.177.39 -l 2000 命令指定要发送的数据长度。此时使用 Wireshark 抓包(用 ip.addr == 14.215.177.39 进行过滤),了解 IP 包如何进行分段,如:分段标志、偏移量以及每个包的大小等。
字节长度为2000的ip包,分为了两个ip包,一个长的1514,一个562。
由图片可知,两个标识符(identifier)都一样,为15677,标记不同。
IP包分组规则
- 两个ip包的标识符一样,表示这两个ip包是同一个ip包分割之后得到的,第一个的标记(Flags)为1表示后面还有一个相同ip的包,第二个ip包的标记为0表示后面没有相同ip的数据包,即此ip的数据包被分成了两个,根据片偏移量就可以知道当前两个ip包在该组分片包中的位置,接收端靠此来组装还原ip包
- IP以目的网络的MTU为IP包的最大包长,将本地生成的较大的IP数据包分成若干个分段,发往目的主机。当这些I分段数据包到达目的主机的IP时,目的主机的I发现到来的IP数据包不是一个完整的数据包,就会将这些IP数据包先缓冲起来,一旦这些P数据包全部到齐,IP就将这些IP数据包组合成一个完整的IP数据包,交给上层协议处理。IP头的标识域(ldentification field )、协议域(Protocol field、源地址域(Source addreee field、目的地址域(destination address field)这四个域可用来唯一标识同属于一个完整的IP数据包的所有IP分段数据包。
- IP头中的标志域(Flag field的DF位表示是否允许分段,MF位表示该IP数据包是否是一个I分段数据包。IP头的分段偏移域((Fragment offset field表示该分段在完整IP包中的位置。IP就是根据这六个域来对IP数据包进行分段和重新组合的。
问题
分段与重组是一个耗费资源的操作,特别是当分段由传送路径上的节点即路由器来完成的时候,所以 IPv6 已经不允许分段了。那么 IPv6 中,如果路由器遇到了一个大数据包该怎么办?
将超处字节要求的数据包直接丢弃。
3、TTL事件
在 IP 包头中有一个 TTL 字段用来限定该包可以在 Internet上传输多少跳(hops),一般该值设置为 64、128等。
在验证性实验部分我们使用了 tracert 命令进行路由追踪。其原理是主动设置 IP 包的 TTL 值,从 1 开始逐渐增加,直至到达最终目的主机。
请使用 tracert www.baidu.com 命令进行追踪,此时使用 Wireshark 抓包(用 icmp 过滤),分析每个发送包的 TTL 是如何进行改变的,从而理解路由追踪原理。
TTL随着跳数的增加而累加,由1到跟踪完成,每一个结点3次的TTL的数值不会改变,因此我们可以简单的用过TTL的数值来确定该从源点到自己计算机之间有多少个节点数。
问题
在 IPv4 中,TTL 虽然定义为生命期即 Time To Live,但现实中我们都以跳数/节点数进行设置。如果你收到一个包,其TTL 的值为 50,那么可以推断这个包从源点到你之间有多少跳?
50跳
传输层
1、熟悉 TCP 和 UDP 段结构
1、用 Wireshark 任意抓包(可用 tcp 过滤),熟悉 TCP 段的结构,如:源端口、目的端口、序列号、确认号、各种标志位等字段。
2、用 Wireshark 任意抓包(可用 udp 过滤),熟悉 UDP 段的结构,如:源端口、目的端口、长度等。
问题
由上大家可以看到 UDP 的头部比 TCP 简单得多,但两者都有源和目的端口号。请问源和目的端口号用来干什么?
端口号:表示一台计算机中的特定进程所提供的服务。网络中的计算机是通过IP地址来代表其身份的,它只能表示某台特定的计算机,但是一台计算机上可以同时提供很多个服务,如数据库服务、FTP服务、Web服务等。
源端口号:源端口号和IP地址的作用是标示报文的返回地址
目的端口:端口指明接收方计算机上的应用程序接口
2、分析TCP建立和释放连接
1、打开浏览器访问 qige.io 网站,用 Wireshark 抓包(可用 tcp 过滤后再使用加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待2、页面显示完毕后再多等一段时间使得能够捕获释放连接的包。
请在你捕获的包中找到三次握手建立连接的包,并说明为何它们是用于建立连接的,有什么特征。
三次握手
Step1:客户端发送一个SYN=1,ACK=0标志的数据包给服务端,请求进行连接,这是第一次握手;
Step2:服务端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它,可以通讯了,并且让客户端发送一个确认数据包,这是第二次握手;
Step3:服务端发送一个SYN=0,ACK=1的数据包给客户端端,告诉它连接已被确认,这就是第三次握手。TCP连接建立,开始通讯。
3、请在你捕获的包中找到四次挥手释放连接的包,并说明为何它们是用于释放连接的,有什么特征。
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。
即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。
即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK的状态
即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK报文的序列号值,此时客户端处于TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。
即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
收到一个FIN只意味着在这一方向上没有数据流动。客户端执行主动关闭并进入TIME_WAIT是正常的,服务端通常执行被动关闭,不会进入TIME_WAIT状态。
问题
去掉 Follow TCP Stream,即不跟踪一个 TCP 流,你可能会看到访问 qige.io时我们建立的连接有多个。请思考为什么会有多个连接?作用是什么?
建立多个连接主要是浏览器为了优化打开网页的速度,会同时打开多个端口去访问同一个网页,打开多个端口同时接收数据,接收到的数据进行整合,以便于浏览网页的快速化。
们上面提到了释放连接需要四次挥手,有时你可能会抓到只有三次挥手。原因是什么?
可以在返回ACK=1确认的时候,同时发送FIN=1的数据。
应用层
1、了解DNS解析
先使用 ipconfig /flushdns 命令清除缓存,再使用 nslookup qige.io 命令进行解析,同时用 Wireshark 任意抓包(可用 dns 过滤)。
你应该可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
可了解一下 DNS 查询和应答的相关字段的含义
问题
你可能会发现对同一个站点,我们发出的 DNS 解析请求不止一个,思考一下是什么原因?
一台服务器下会有多个域名,发送DNS解析请求时不是固定在一台服务器上的,会选择距离自己最近的服务器为自己服务。
2、了解HTTP 的请求和应答
打开浏览器访问 百度网站,用 Wireshark 抓包(可用http 过滤再加上 Follow TCP Stream),不要立即停止 Wireshark 捕获,待页面显示完毕后再多等一段时间以将释放连接的包捕获。
请在你捕获的包中找到 HTTP 请求包,查看请求使用的什么命令,如:GET, POST。并仔细了解请求的头部有哪些字段及其意义。
请在你捕获的包中找到 HTTP 应答包,查看应答的代码是什么,如:200, 304, 404 等。并仔细了解应答的头部有哪些字段及其意义。
http常见代码含义
问题
刷新一次 qige.io 网站的页面同时进行抓包,你会发现不少的304代码的应答,这是所请求的对象没有更改的意思,让浏览器使用本地缓存的内容即可。那么服务器为什么会回答 304 应答而不是常见的200应答?
因为服务器在上一次访问浏览器时修改的时间不是这个时间。浏览器第二次发送请求的时候,浏览器上次请求的资源现在还在自己的缓存中,如果你那边这个资源还没有修改,就可以不用传送应答体给我了。服务器根据浏览器传来的时间对比发现和当前请求资源的修改时间一致,就应答304,表示不传应答体了,从之前的缓存里取。