GNU开发工具——WireShark网络分析工具

一、WireShark网络分析工具简介

1、WireShark简介

Wireshark是目前全球使用最广泛的开源网络封包分析软件(前身为Ethereal),由Gerald Combs编写并于1998年以GPL开源许可证发布。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。

2、WireShark架构

GUI:处理所有的用户输入输出(所有窗体,对话框等) Core:核心模块,通过函数调用将其他模块连接在一起 Epan:包分析引擎(WireShark Packetage Analyzing) Protocol-Tree:负责独立包的信息剖析。 Dissectors:存在于epan/dissectors目录下的各种协议解析器,支持700+种协议解析,对于每种协议,×××都能识别出协议字段(field),并显示出字段值(field value)。 Dissector Plugins:支持将解析器的具体实现作为独立模块存在。 Display-Filters:显示过滤引擎,源码在epan/dfilter目录 Capture:抓包引擎接口,利用libpcap/WinPcap从底层抓取网络数据包,libpcap/WinPcap提供了通用的抓包接口,能从不同类型的网络接口(包括以太网,令牌环网,ATM网等)获取数据包。 Wiretap:wiretap库用于读写捕获的文件,读写格式时libpcap、 pcapng或者其他类型的文件格式。 Dumpcap:捕获引擎本身,执行需要提升权限。 WinPcap/libpcap:提供不同平台的包捕捉以及过滤支持功能的库。

3、libpcap简介

WireShark使用libpcap/WinPCAP作为接口,直接与网卡进行数据报文交换。 libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库,是一个独立于系统的用户层包捕获的API接口,为底层网络监测提供了一个可移植的框架。 WinPcap是一个专为Windows系统设计的、基于libpcap的库。 地址:http://www.winpcap.org/。 libpcap是一个c库,用于网络抓包和过滤,源于tcpdump项目。tcpdump项目中抓包、过滤、capture file的读写的代码被提取出来成为libpcap,由tcpdump项目的开发者维护。 libpcap主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。Libpcap利用BSD Packet Filter(BPF)算法对网卡接收到的链路层数据包进行过滤。BPF算法的基本思想是在有BPF监听的网络中,网卡驱动将接收到的数据包复制一份交给 BPF过滤器,过滤器根据用户定义的规则决定是否接收此数据包以及需要拷贝该数据包的哪些内容,然后将过滤后的数据给与过滤器相关联的上层应用程序。 libpcap的包捕获机制就是在数据链路层加一个旁路处理。当一个数据包到达网络接口时,libpcap首先利用已经创建的Socket从链路层驱动程序中获得该数据包的拷贝,再通过Tap函数将数据包发给BPF过滤器。BPF过滤器根据用户已经定义好的过滤规则对数据包进行逐一匹配,匹配成功则放入内核缓冲区,并传递给用户缓冲区,匹配失败则直接丢弃。如果没有设置过滤规则,所有数据包都将放入内核缓冲区,并传递给用户层缓冲区。

二、WireShark快速抓包

1、WireShark主窗口

MENUS(菜单栏):显示打开文件的路径名称 SHORTCUTS(工具栏,快捷方式):常用功能菜单的快捷方式 DISPLAY FILTER(显示过滤器):显示过滤器设置 PACKET LIST PANE(封包列表):封包列表 PACKET DETAILS PANE(封包详细信息):选中封包的详细信息 DISSECTOR PANE(16进制数据):选中封包的16进制数据 MISCELLANOUS(状态栏,杂项)

2、网卡接口选择

打开菜单栏Capture->Options,界面如下:

3、快速抓包

选择网卡,点击“开始抓包”按钮。

4、停止抓包

点击“停止抓包”按钮,界面如下:

三、WireShark显示设置

1、显示设置

通过对显示设置工具栏的按钮进行设置,可以放大、缩小、重置主界面的显示区。

2、列设置

默认列表显示:序号、时间、源、目的、协议、长度、信息 A、增加列 在封包详细信息区的任意字段,如TTL,右键选择菜单“Apply as Column”,将选择的字段信息添加到封包列表区作为一列。 B、删除列 在封包列表区的某列右键点击,选择“Remove This Column”菜单项,将该列从列表区删除。 C、修改列 在封包列表区的某列右键点击,选择“Edit Column”菜单项,可以修改该列的名称。

3、时间设置

A、时间格式设置 点击菜单栏“View->Time Display Format”,选择合适的时间显示格式。 B、时间参考设置 选中封包列表区的Time列的某项,右键单击菜单“Set/Unset Time Reference”设置该数据项为时间参考点,可以设置多个时间参考点。

4、名字解析

名字解析将MAC地址、IP地址、端口号等转换成名字,方便记忆,默认开启MAC地址解析。 点击菜单栏“Capture->Options->Options”,选中“Name Resolution”的三个复选框,如下图:

四、WireShark数据包操作

1、标记数据包

A、标记/高亮数据包 在封包列表区选中某个封包,右键选择“Mark/Unmark Packet”标记/取消标记高亮。 B、修改数据包颜色 在封包列表区单击右键,选择“Colorize Conversation->Ethernet->New Coloring Rule”菜单项,可以对Ethernet协议进行具体的配色工作。

2、注释数据包

在封包列表区的某个数据包上单击鼠标右键,选择“Packet Comment”菜单项,对数据包进行注释。

3、合并数据包

点击菜单栏“File->Merge”菜单项,弹出对话框,选择要合并的数据包。 WireShark需要将当前抓取的数据包保存为文件后才能和其他数据包合并。

4、导出数据包

可以导出特定的数据包,如过滤后的特定协议数据包、标记数据包、特定范围内的数据包。 也可以导出数据包为其他格式文件。

五、WireShark参数设置

1、首选项设置

点击菜单栏“Edit->Preference”菜单项, 主界面布局设置 封包列表区的列信息设置 字体和颜色设置

2、抓包选项设置

点击菜单栏“Capture->Options”菜单项 A、网卡设置 B、多文件连续保存 创建一个文件名,开启文件连续保存,如每个文件达到1M或每隔1分钟存取一个文件。 C、名字解析设置 多文件连续保存时,可以选择抓包停止的条件,抓取一定数量的数据包、抓取一定数量的文件时自动停止抓包。选取MAC地址解析、TCP解析等功能。

六、WireShark过滤器

1、抓包过滤器

通过BPF(Berkeley Packet Filter)语法选择性抓取某些特定条件的数据包。 类型:host、net、port 方向:src、dst 协议:ether、ip、tcp、udp、http、ftp 逻辑运算符:与(&&)、或(||)、非(!) A、ethernet过滤器 第二层过滤器,根据mac地址来进行过滤   

ether host XX:抓取源和目的为指定的mac的以太网帧  
ether dst XX:抓取目的为指定mac的以太网帧  
ether src XX:抓取源为指定mac的以太网帧  
ether broadcast:抓取所有以太网广播流量  
ether multicast:抓取多播流量  
ether proto <protocol>:抓取指定协议的以太网流量,比如以太网类型为0x0800,ether proto 0800。以太网类型指的是以太网帧帧头的ether-type字段,表示上层的协议类型。0x0800为ipv4、0x86dd为ipv6、0x0806为arp。 
ether host 00:88:ca:86:f8:0d
ether src host 00:88:ca:86:f8:0d
ether dst host 00:88:ca:86:f8:0d

B、主机和网络过滤器,第三层过滤器   ip或ipv6:抓取ipv4或ipv6流量  

host <host>:抓取源或目的为指定主机名(网址)或ip的流量  
dst host <host>:抓取目的为指定主机名(网址)或ip的流量  
src host <host>:抓取源为指定主机名(网址)或ip的流量  
gateway <host>:抓取穿越网关的流量,host必须是主机名。  
net <net>:抓取源或目的为指定网络号的流量,如:net 192.168.1或net 192.168.1.0  
dst net <net>:抓取目的为指定网络号的流量  
src net <net>:抓取源为指定网络号的流量  
net <net> mask <netmask>:抓取源或目的由net和mask共同指明的ipv4网络号的流量,ipv6流量无效。如:net 192.168.1.0 mask 255.255.255.0  
dst net <net> mask <netmask>:抓取目的由net和mask共同指明的ipv4网络号的流量,ipv6流量无效。  
src net <net> mask <netmask>:抓取源由net和mask共同指明的ipv4网络号的流量,ipv6流量无效。  
net <net>/<len>:抓取源或目的为指定网络和长度的流量,如:net 192.168.1.0/24  
dst net <net>/<len>:抓取目的为指定网络和长度的流量  
src net <net>/<len>:抓取源为指定网络和长度的流量  
broadcast:抓取ip广播包,通常如:ip broadcast  
multicast: 抓取ip多播包  
ip proto <protocol code>:抓取ip包头协议类型字段值等于特定值的数据包。如:tcp为6,udp为17,icmp为1  
ip6 proto <protocol>: 抓取ipv6包头中下一个包头字段值等于特定值的ipv6数据包。无法用该原词根据ipv6扩展包头链中的相关字段值执行过滤。  
icmp [icmptype]==<identifier>:抓取特定类型[icmptype]的icmp数据包,<identifier>表示的是icmp头部中的类型字段值,如,0(icmp echo reply数据包)或8(icmp echo request数据包)等。如:icmp[icmptype]==icmp-echo 或 icmp[icmptype]==8  
ip[2:2]==<number>:抓取指定长度的ip数据包(number表示ip包头中的ip包总长度字段值)  
ip[8]==<number>:抓取具有指定ttl的ip数据包(number表示ip包头中的ttl字段值)  
ip[9]==<number>:抓取指定协议类型的ip数据包(number表示ip包头中的协议类型字段值)  
ip[12:4]==ip[16:4]:表示数据包源和目的ip相同  
注:中括号内的数字表示相关协议头部的内容,第一个数字指从协议头部的第几个字节开始关注,第二个数字表示所要关注的字节数。
host 192.168.1.1
src host 192.168.1.1
dst host 192.168.1.1

C、tcp和udp及端口过滤,第四层 过滤器

port <port>:匹配port指明的端口号,如:port 80或port http  
dst port <port>:目的端口号为指定的端口号  
src port <port>:源端口号为指定的端口号  
tcp portrange <p1>-<p2>或udp portrange <p1>-<p2>:用来抓取端口范围介于p1和p2之间的tcp或udp数据包  。
tcp src portrange <p1>-<p2>或udp dst portrange <p1>-<p2>  。
tcp [tcpflags] & (tcp-syn|tcp-fin)!=0:抓取tcp连接中用来发起连接(syn标记位置1)或终止连接(FIN标记位置1)的数据包 。
tcp [tcpflags] &(tcp-rst)!=0:抓取所有RST标记位置1的TCP数据包,RST标记位用来立刻拆除连接,PSH用来表示将数据提交给末端进程处理。  
less <length>:抓取不长于指定长度的数据包,写法等价于:len <= <length>  
greater <length>:抓取不短于标识符指定的长度的数据包,写法等价于:len >= <length>  
tcp portrange 2000-2500:抓取端口在这个范围内的tcp数据包 。
tcp[13] & 0x00=0:抓取所有标记位都未置1的tcp流量(在怀疑遭遇空扫描攻击时使用) 。
tcp[13] & 0x01=1:抓取FIN位置1,但ACK位置0的TCP流量  
tcp[13] & 0x03=3:抓取SYN和FIN位同时置1的TCP流量  
tcp[13] & 0x05=5:抓取RST和FIN位同时置1的TCP流量  
tcp[13] & 0x06=6:抓取SYN和RST位同时置1的TCP流量  
tcp[13] & 0x08=8:抓取PSH位置1,但ACK位置0的TCP流量  
13指代TCP头部中的标记字段,‘=’号后面数字表示tcp标记位的置位情况。0表示标记位都没置1,1表示FIN位置1,但ACK位置0,1+2表示SYN和FIN位同时置1,1+4表示RST和FIN同时置1,2+4表示SYN和RST同时置1,8表示PSH位置1,但ACK置0.  
port 80
! port 80
dst port 80
src port 80

D、复合过滤: host 192.168.1.100 && port 8080 抓包过滤器在菜单栏“Capture->Options”

2、显示过滤器

将抓取的数据包通过显示过滤器过滤出某些特定的数据包。 逻辑操作符:and、or、xor、not 比较操作符:==、!=、>、<、>=、<= IP地址:ip.addr、ip.src、ip.dst 端口:tcp.port、tcp.srcport、tcp.dstport、tcp.flag.syn、tcp.flag.ack 协议:arp、ip、icmp、tcp、udp、dns 过滤IP地址:

ip.addr == 192.168.1.1
ip.src == 192.168.1.1
ip.dst == 192.168.1.1
ip.src == 192.168.1.100 and ip.dst == 58.250.135.156

过滤端口:

tcp.port == 80
tcp.srcport == 80
tcp.dstport == 80
tcp.flag.syn == 1

过滤协议:

arp
tcp
udp
not http

复合过滤:

ip.src == 192.168.1.100 and tcp.dstport == 80
ip.addr == 192.168.1.106 and udp.port == 4000

七、WireShark高级功能

1、数据流追踪

将TCP、UDP、SSL等碎片化的数据包进行重组并完整呈现出来。 单击菜单栏“Analyze->Follow->TCP Stream”或是选中某个TCP数据包右键菜单“Folow->TCP Stream”,查看数据流。

2、专家信息

可以对数据包中特定状态进行警告说明。 点击菜单栏“Analyze->Expert Information”菜单项 根据对统计出的不同级别(Error、Warning、Note、Chat)的数据包,点击相应的数据包,主界面显示区会跳到相应的数据包并高亮标记。

3、统计摘要信息

对抓取的数据包进行全局统计 点击菜单栏“Statistics->Capture File Properties”菜单项 可以查看抓取的数据包的统计信息。

4、协议分层统计

点击菜单栏“Statistics->Protocol Hierarchy”菜单项 可以统计通信流量中不同协议占用的百分比。

5、网络节点统计

“Statistics->Endpoints” 统计通信会话中每个节点接收和发送的数据包和字节数,通过网络节点统计可以找出网络中哪个节点(IP地址或端口号)最占用带宽。

6、网络会话统计

“Statistics->Conversations” 统计通信会话之间接收和发送的数据包和字节数,通过网络会话统计可以找出网络中哪个会话(IP地址或端口号)最占用带宽。

7、数据包长度统计

“Statistics->Packet Lengths” 统计数据流量中数据包长度的分布。

8、图表分析

“Statistics->IO Graph”查看网络吞吐量图表。 对网络中的吞吐流量进行实时图形显示,可以对不同过滤条件过滤的数据包以不同的线型、颜色表示。 “Statistics->Flow Graph”查看数据流图 将会话通信过程图形可视化出来。