今天我们分享网络抓包工具 Wireshark 和 tcpdump
一、WireShark工具
1、为什么要抓包
1)
、定位网络问题;
2)
、分析接口数据;
3)
、学习网络协议,使用抓包工具分析网络数据更直观。
大部分场合都可以通过程序调试来定位问题,但有些场景使用抓包来定位接口问题更准 确、更方便,如以下场景:
1)
、你发送数据给后台,但后台没有收到,可以对接口进行抓包分析,看是后台处理有 问题,还是没有将数据发出去,或是发送数据格式有误;
2)
、你和后台接口联调测通,但业务数据对不上,你认为是后台问题,后台认为是你发的问题,可以抓包确认问题所在;
3)
、线上出现
bug
需要定位,但你没在公司,没有代码可调试,可直接抓包分析;
4)
、系统性能不佳,抓包看下接口响应时长,是不是后台出现性能问题。
常用的抓包工具有:
F12
(浏览器自带的抓包工具)、
Fiddler
、
Charles
,
Wireshark
。而 Wireshark 在支持的协议,用户友好度、价格(开源)、程序支持、支持的操作系统上都很 好,所以 Wireshark
也是我们最常用的抓包工具和报文分析工具。
下载与安装
在
https://www.wireshark.org/
的官方主页点击
![](https://i-blog.csdnimg.cn/blog_migrate/43c6d409b9839854d12a7595f601920b.png)
进入下载页面,选择适合自己的版本下载即可
![](https://i-blog.csdnimg.cn/blog_migrate/ef27ded24bf53006ff728567721ba402.png)
我们以当前版本
3.2.7
作为讲解版本,Wireshark 的安装很简单,就是一般的
windows
程序的安装流程,如遇问题自行百度解决。
1
、双击
.exe
文件开始进行安装,在介绍页面上单击
Next
。
![](https://i-blog.csdnimg.cn/blog_migrate/eb76e089407d8e55493318021226a377.png)
2
、同意许可证条款,单击
I Agree
![](https://i-blog.csdnimg.cn/blog_migrate/c435535da7228b9edc619e7c659157d7.png)
3
、接受默认设置,单击
Next
![](https://i-blog.csdnimg.cn/blog_migrate/24894e3c8a639411880f2ba352d1129e.png)
4
、根据自己的需求在
Additional Tasks
窗口中选择后并单击
Next
。
![](https://i-blog.csdnimg.cn/blog_migrate/cfb504c589364d6d0f643aeaf77e58dc.png)
5
、选择
Wireshark
的安装位置,并单击
Next
。
![](https://i-blog.csdnimg.cn/blog_migrate/53e79ac54ccc7363d56f59610abe9f3b.png)
6
、当弹出是否需要安装
Npcap/WinPcap
的对话框时,
务必确保
Install 选项已被勾选,然后单击 Install
。安装过程便会随即开始。(
WinPcap
驱动是
Windows
对于
pcap
数据包捕获的通用程序接口(
APT
)的实现,简单来说就是这个驱动能够通过操作 系统捕捉原始数据包、应用过滤器,并能够让网卡切入或切出混杂模式。[
混杂模式就是接
收所有经过网卡的数据包,包括不是发给本机的包,即不验证
MAC
地址。普通模式下网卡
只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃。一般来说,混杂
模式不会影响网卡的正常工作,多在网络监听工具上使用。
USBPcap 就没必要安装了。
![](https://i-blog.csdnimg.cn/blog_migrate/4030e4d1dd11a5940868d619336040aa.png)
7
、耐心等待,同时
Wireshark
的安装过程中,会开始安装
WinPcap
。在介绍页面单击
Next 之后,请阅读许可协议并单击 I Agree
,如有其它安装页面,选择默认配置
Install
即可。
8
、后面一路
Next
和
Finish
,并重启电脑即可。
2、数据包的捕获和基本用法
基本用法
运行 Wireshark
,稍等,就会让我们选择捕获哪个设备(连接)的数据包
当前我们活跃的是“以太网”,双击这一行,Wireshark 开始捕获数据,并在窗口中显 示,可以看见随着时间前进,窗口中不断刷新。等上几秒钟,结束捕获,单机工具栏中的 按钮,或者“捕获”下拉菜单中选择“停止”选项即可。 这个时候可以看见,Wireshark 窗口中显示了大量的数据:
![](https://i-blog.csdnimg.cn/blog_migrate/5d3c7f9e4a9a20e9a2812a3ed053a3d6.png)
数据包列表:最上面的面板用表格显示了当前捕获文件中的所有数据包,其中包括了数 据包序号、数据包被捕获的相对时间、数据包的源地址和目标地址、数据包的协议以及在数 据包中找到的概况信息等列。 包详情:中间的面板分层次地显示了一个数据包中的内容,并且可以通过展开或是收缩 来显示这个数据包中所捕获到的全部内容。
包数据的字节形式显示:最下面的面板显示了一个数据包未经处理的原始样子,也就是 其在链路上传播时的样子。这些原始数据当然不容易理解。 在数据包列表中,可以很明显看见每行的五颜六色,这些颜色其实是 Wireshark
用来区 分不同的协议的。可以通过 Coloring Rules (
着色规则)窗口可以很容易地查看或修改每个协 议所对应的颜色。如果想要打开这个窗口,可以在“视图”下拉菜单中选择的“着色规则” 选项即可。
![](https://i-blog.csdnimg.cn/blog_migrate/697121ef6d5b319bd26fb0cce693c885.png)
同时捕获的数据包可以导出为文件,也可以将数据包文件导入
Wireshark
进行分析。
过滤器
过滤器可以让你找出你所希望进行分析的数据包。简单来说,一个过滤器就是定义了一 定条件,用来包含或者排除数据包的表达式。如果你不希望看到一些数据包,你可以写一个 过滤器来屏蔽它们。如果你希望只看到某些数据包,你可以写一个只显示这些数据包的过滤 器。
Wireshark
主要提供两种主要的过滤器。
·捕获过滤器:
当进行数据包捕获时,只有那些满足给定的包含
/
排除表达式 的数据包会被捕获。
显示过滤器
:
该过滤器根据指定的表达式用于在一个已捕获的数据包集合中,隐藏不想 显示的数据包,或者只显示那些需要的数据包。
捕获过滤器
捕获过滤器用于进行数据包捕获的实际场合,使用它的一个主要原因就是性能。如果你 知道你并不需要分析某个类型的流量,你可以简单地使用捕获过滤器过滤掉它,从而节省那 些会被用来捕获这些数据包的资源。
比如,我们现在要捕获我们机器上所有
UDP
类型的数据包,怎么做?在“捕获”下拉 菜单中选择“选型”,弹出窗口中
![](https://i-blog.csdnimg.cn/blog_migrate/392b2172b30de236767f39f501e43562.png)
选择或者输入
UDP
,然后单击“开始”按钮进行捕获。
![](https://i-blog.csdnimg.cn/blog_migrate/80a8ea2c761c1f997fa27b4c4038d4a3.png)
捕获过滤器的
BPF
语法
捕获过滤器应用于
WinPcap/NPcap
,并使用
Berkeley Packet Filter
(
BPF
)语法。 这个语法被广泛用于多种数据包嗅探软件,主要因为大部分数据包嗅探软件都依赖于使
用
BPF
的
libpcap/WinPcap
库。掌握
BPF
语法对你在数据包层级更深入地探索网络来说, 非常关键。 使用 BPF
语法创建的过滤器被称为表达式,并且每个表达式包含一个或多个原语。每 个原语包含一个或多个限定词,然后跟着一个 ID
名字或者数字 Type 指出名字或数字所代表的意,例如: host
、
port Dir
指明传输方向是前往还是来自
例如:
src
、
dst
Proto
限定所要匹配的协议
例如:
ether
、
ip
、
tcp
、
udp
、
http
、
ftp
例如: dst host 192.168.0.10 && tcp port 80
这是一个捕获过滤器样例,其中“
dst host 192.168.0.10
”就构成了一个原语,我们的样 例里有两个原语,两个原语用逻辑运算符“&&
”组合了起来。逻辑运算符共有三个:
连接运算符: 与
(&&)
选择运算符: 或
(||)
否定运算符: 非
(!)
对我们的样例来说,表示捕获的数据包应该满足条件为:目的主机是
192.168.0.10
,通 信协议是 tcp
,源端口或者目的端口是
80
。
主机名和地址过滤器
我们所创建的大多数过滤器都会关注于一个或一些特定的网络设备。根据这个情况,可 以根据设备的 MAC
地址、
IPv4
地址、
IPv6
地址或者
DNS
主机名配置过滤规则。比如:
捕获所有和主机
IPv4
地址相关的流量: host 192.168.0.10
捕获所有和主机
Ipv6
地址相关的流量: host fe80::1945:cbf1:1393:8f17
使用基于一台设备的主机名
host
限定词进行过滤: host remoteserver
考虑到一台主机的
IP
地址可能会变化,你可以通过加入
ether
协议限定词,对它的
MAC 地址进行过滤: Ether host 24-41-8C-26-04-9F
当然还可在
host
之前加
src
或者
dst
进行传输方向的限定。
端口和协议过滤器
只对
8080
端口进行流量捕获: port 8080
想要捕获除
8080
端口外的所有流量
!port 8080
端口过滤器一样和传输方向限定符一起使用,比如: dst port 80
协议过滤器可以让我们基于特定协议进行数据包过滤。
BPF
语法甚至提供给我们的一项 强大功能,就是我们可以通过检查协议头中的每一字节来创建基于那些数据的特殊过滤器。
比如:
tcp[13]&4=4
表示捕获的数据是
tcp
协议的数据包,且
tcp
数据包中第
13
个字节的第
4
位被设置了。
显示过滤器
显示过滤器应用于捕获文件,用来告诉
Wireshark
只显示那些符合过滤条件的数据包。 你可以在包列表面板上方的 Filter
文本框中,输入一个显示过滤器。
![](https://i-blog.csdnimg.cn/blog_migrate/6d57f5365299817c76fea09a3ec3ccd7.png)
显示过滤器的语法不同于捕获过滤器,比如我们通过捕获功能,捕获了本机所有的数据 包
![](https://i-blog.csdnimg.cn/blog_migrate/62b73d89e990dbd13206eb40071742da.png)
现在我们不需要看
UDP
类型的数据包,只需输入: !udp
可以看见所有的
udp
类型的数据包不再显示了:
![](https://i-blog.csdnimg.cn/blog_migrate/0d190b65c4239054d7fcb7060247748d.png)
现在我们多加一个限定,只显示
ip
地址为
40.90.189.152
(新加坡
Microsoft
数据中心) 的数据包
![](https://i-blog.csdnimg.cn/blog_migrate/ffdb2eb6f70748b8d2efe5f6f47d9f43.png)
可以看见,显示的数据包就变为:不是
udp
数据包,同时源地址或者目的地址是 40.90.189.152。
在我们上面的过滤条件“
!udp and ip.addr==40.90.189.152
”中,牵涉到了过滤条件的
比
较操作符
和
逻辑操作符
: 比较操作符可以让你进行值的比较。举例来说,当你在检查一个 TCP/P
网络中的问题 时,你可能经常需要检查和某一个 IP
地址相关的数据包。等于操作符可以让你创建一个只 显示 192.168.0.1
这个
IP
地址相关数据包的过滤器。
ip.addr==192.168.0.1
比较操作符
还有:
等于
==
不等于
!=
大于
>
小于
<
大于或等于
>=
小于或等于
<=
逻辑操作符
有:
and
两个条件需同时满足
or
其中一个条件被满足
xor
有且仅有一个条件被满足
not
没有条件被满足
尽管在理论上编写过滤器表达式很简单,但针对不同问题创建过滤器时,依然需要许多 特定的关键词与操作符。可以到 Wireshark
的官网查看:
https://www.wireshark.org/docs/dfref
![](https://i-blog.csdnimg.cn/blog_migrate/ff0b5b901da4a9008c6ce9191481a925.png)
比如
tcp
相关的,可以通过单击具体条目查看更多:
![](https://i-blog.csdnimg.cn/blog_migrate/58176eeabc3632fbc03d33ac10dad185.png)
![](https://i-blog.csdnimg.cn/blog_migrate/05610164b2d00b8bfdd1c1cc7997d291.png)
预定义过滤器
过滤器可以事先设置好,不需要每次使用时都重新输入,捕获过滤器在菜单“捕获”
- “捕获过滤器”中设置,显示过滤器在菜单“分析”-
“
Display Filters
” 中设置。
实战:用
WireShark
看看
TCP
的三次握手
准备
现在我们用平时比较常见的连接
mysql
服务器来看看,打开一个
mysql
的客户端,准备 连接 IP
地址为
47.112.44.148
的云端
mysql
。
于是我们设定捕获过滤器,只捕获与
IP
地址
47.112.44.148
相关的数据包: host 47.112.44.148
![](https://i-blog.csdnimg.cn/blog_migrate/7804affb5c3339e5c1f1bdcd8d646bbc.png)
开始捕获,连接数据库:
![](https://i-blog.csdnimg.cn/blog_migrate/53fc97cb4694677f9971822d236ddc67.png)
![](https://i-blog.csdnimg.cn/blog_migrate/cbd75a584e17225508da774d124a7c53.png)
很明显,
WireShark
捕获到了本机所有和
47.112.44.148
通信的报文,现在我们只需要 观察 TCP
的三次握手和四次分手的报文,所以,我们在显示过滤器中写上
tcp and !mysql
![](https://i-blog.csdnimg.cn/blog_migrate/0eb3301de6b750d671941b85232282e7.png)
按照
tcp
三次握手的规则,三次握手包含一个
SYN
包、 一个
SYN/ACK
包和 一个
ACK 包
![](https://i-blog.csdnimg.cn/blog_migrate/7680b57d87eab2dc12494bad04bc8aa3.png)
就是窗口里最上面的三条记录:
![](https://i-blog.csdnimg.cn/blog_migrate/07f2d3f036f2cd35ddd525129934252a.png)
我们一条条看过来,
第一次握手
![](https://i-blog.csdnimg.cn/blog_migrate/6f59db31af3d1e2bed117de29f464422.png)
从这里我们可以看出,这是数据链路层相关的信息,
source
部分的地址和我们机器上的 mac 地址一模一样
![](https://i-blog.csdnimg.cn/blog_migrate/eb4a68d2a09c561b995ea5b50580a066.png)
接下来,就是
IP
层的相关信息,其中表明了它的上一层协议是
TCP
,同时本地和远程 服务器的 IP
地址:
![](https://i-blog.csdnimg.cn/blog_migrate/c0a3db1066f51080b26da146b6bc9978.png)
接下来,就是
TCP
层的相关信息,其中包括了本地端口和远程服务端口,既然是
syn
包, 里面当然会带上 seq
值,本次通信是
1979849485
,
tcp
报文格式中的
syn
字段被设置为
1
, 用来表明这是一个 syn
包。
![](https://i-blog.csdnimg.cn/blog_migrate/fffd0c8030647e8a0d8ef3355a998eca.png)
第二次握手
数据链路层和
IP
层的报文我们不再查阅,直接看
TCP
层的报文,很明显,这是服务器 给客户端的 ACK
报文,其中依然包括了远程服务端口和本地端口,同时服务器要把自己端 的 seq
值告诉客户端,我们看到实际值是
3366556883
。同时服务器要把客户端传给自己的 seq 值做个应答确认,所以我们看见
Acknowledgment number
字段值是
1979849486
,刚好
是第一次握手中,客户端传递给服务端的
seq
值
1979849485
加
1
。同时
tcp
报文格式中的 syn 字段被设置为
1
,
Acknowledgment
字段被设置为
1
,用来表明这是一个
syn/ack
包。
![](https://i-blog.csdnimg.cn/blog_migrate/389741fe3db09cca5dfe51d52b098292.png)
第三次握手
这次握手的的报文分析,通过前两次的分析,相信同学们能够自行分析出来,这里就不 在赘述。
![](https://i-blog.csdnimg.cn/blog_migrate/832ed4b6062689442f0a1f9730666b8f.png)
二、TCPDUMP
tcpdump
可以抓所有层的数据,功能十分强大,
tcpdump Linux
作为网络服务器,特别 是作为路由器和网关时,数据的采集和分析是不可少的。TcpDump
是
Linux
中强大的网络数
据采集分析工具之一。用简单的话来定义
tcpdump
,就是
:dump the traffic on a network
,根 据使用者的定义对网络上的数据包进行截获的包分析工具。作为互联网上经典的的系统管理 员或者运维人员必备工具,tcpdump
以其强大的功能,灵活的截取第略,成为每个高级的系 统管理员/
运维人员分析网格,排查问题等所必备的工具之一。注意
tcpdump
必须以超级管 理员的身份登录系统才能使用。
tcpdump
的参数比较多:
tcp
![](https://i-blog.csdnimg.cn/blog_migrate/d5f8103cfeec398fbbb9f22d3b2d1f82.png)
各个参数的意义如下:
A
:以
ascii
编码打印每个报文(不包括链路的头)。
a
:将网络地址和广播地址转变成名字。
c
:抓取指定数目的包。
C
:用于判断用
-w
选项将报文写入的文件的大小是否超过这个值,如果超过了就新建
文件(文件名后缀是
1
、
2
、
3
依次增加);
d
:将匹配信息包的代码以人们能够理解的汇编格式给出;
dd
:将匹配信息包的代码以
c
语言程序段的格式给出;
ddd
:将匹配信息包的代码以十进制的形式给出;
D
:列出当前主机的所有网卡编号和名称,可以用于选项
-i
;
e
:在输出行打印出数据链路层的头部信息;
f
:将外部的
Internet
地址以数字的形式打印出来;
F<
表达文件
>
:从指定的文件中读取表达式
,
忽略其它的表达式;
i<
网络界面
>
:监听主机的该网卡上的数据流,如果没有指定,就会使用最小网卡编号 的网卡(在选项-D
可知道,但是不包括环路接口),
linux 2.2
内核及之后的版本支持
any
网
卡,用于指代任意网卡;
l
:如果没有使用
-w
选项,就可以将报文打印到 标准输出终端(此时这是默认);
n
:显示
ip
,而不是主机名;
nn
:显示
port
,而不是服务名;
N
:不列出域名;
O
:不将数据包编码最佳化;
p
:不让网络界面进入混杂模式;
q
:快速输出,仅列出少数的传输协议信息;
r<
数据包文件
>
:从指定的文件中读取包
(
这些包一般通过
-w
选项产生
)
;
s<
数据包大小
>
:指定抓包显示一行的宽度,
-s0
表示可按包长显示完整的包,经常和
-A 一起用,默认截取长度为 60
个字节,但一般
ethernet MTU
都是
1500
字节。所以,要抓取 大于 60
字节的包时,使用默认参数就会导致包数据丢失;
S
:用绝对而非相对数值列出
TCP
关联数;
t
:在输出的每一行不打印时间戳;
tt
:在输出的每一行显示未经格式化的时间戳记;
T<
数据包类型
>
:将监听到的包直接解释为指定的类型的报文,常见的类型有
rpc
(远 程过程调用)和 snmp
(简单网络管理协议);
v
:输出一个稍微详细的信息,例如在
ip
包中可以包括
ttl
和服务类型的信息;
vv
:输出详细的报文信息;
x/-xx/-X/-XX
:以十六进制显示包内容,几个选项只有细微的差别,详见
man
手册;
w<
数据包文件
>
:直接将包写入文件中,并不分析和打印出来;
expression
:用于筛选的逻辑表达式。
在
tcpdump
中,
tcpdump
利用正则表达式作为过滤报文的条件,如果一个报文满足表 达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会 被截获。
在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括
host
, port, 例如
host 210.27.48.2
,指明
210.27.48.2
是一台主机,
port 23
指明端口号是
23
。如 果没有指定类型,缺省的类型是 host
。 第二种是确定传输方向的关键字,主要包括 src , dst
这些关键字指明了传输的方向。举 例说明,src 210.27.48.2 ,
指明
ip
包中源地址是
210.27. 48.2 , dst net 202.0.0.0 指明目的网络地址是
202.0.0.0
。如果没有指明方向关键字,则 缺省是 src or dst
关键字。 第三种是协议的关键字,主要包括 fddi,ip ,arp,rarp,tcp,udp
等类型。 如果没有指定任何协议,则 tcpdump
将会监听所有协议的信息包。 表达式还可以通过
! or not
&& or and
|| or or
进行连接 比如,
tcpdump -i eth0 tcp port 3306 -w ./mysql.cap
捕获本机网络设备
eth0
上
tcp
协议,端口
3306
的数据包,并写入当前目录下的
mysql.cap 文件。
![](https://i-blog.csdnimg.cn/blog_migrate/16db76fad18f5457afcd2a0d20e01974.png)
不过
tcpdump
的输出不够直观,所以我们一般用
tcpdump
抓包以后下载到本地用 Wireshark 打开分析。
![](https://i-blog.csdnimg.cn/blog_migrate/733be2305c3cbbe43f43f0dd82f33d60.png)
到此抓包工具分析结束,下篇我们分析HTTP 原理,敬请期待!