WireShark是一款网络封包分析软件,它抓取网络封包,并尽可能显示出最详细的封包资料。
wireshark的准备工作
安装wireshark
sudo apt-get install wireshark |
在non-root下使用wireshark
由于sudo下使用wireshark太过aggressive,所有需要解决wireshark普通权限下访问网卡的问题。
1.添加wireshark用户组
sudo groupadd wireshark
2.将dumpcap更改为wireshark用户组
sudo chgrp wireshark /usr/bin/dumpcap
3.让wireshark用户组有root权限使用dumpcap
sudo chmod 4755 /usr/bin/dumpcap
4.将需要使用的用户名yourname加入wireshark用户组
sudo gpasswd -a yourname wireshark
参考资料:
开始抓包
打开wireshark软件:
wireshark & |
过滤器设置
wireshark过滤语法总结:
wireshark有两种顾虑器,捕捉过滤器(Capture Filters)和显示过滤器(Dispaly Filters)。
配置带抓取网络接口,Capture Filter设置为只抓取主机和10.41.71.8之间的网络封包:
host 10.41.70.8等价于src or dst host 10.41.70.8 |
显示过滤器设置:
分析抓取的网封包
参考资料:,感谢TankXiao。
从上到下依次是:
1. Main Toolbar(工具栏),一系列工具按钮。
2. Display Filter(显示过滤器), 用于过滤
3. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表
4. Packet Details Pane(封包详细信息), 显示封包中的字段
5. Dissector Pane(16进制数据)
6. Miscellanous(地址栏,杂项)
封包详细信息与OSI对应
TCP三次握手
TCP包和协议中TCP报文格式对应:
TCP三次握手:
打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao
在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream",
这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图
图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。
第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图
第二次握手的数据包
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:
就这样通过了TCP三次握手,建立了连接。
彩蛋
如果协议使用的端口号不规范,比如https使用34128怎么办?
参考文档:《》
在TCP/IP详解一书中谈到了协议的分用,书中的图1-8如上。图1-8可以很好地解释在互联网的分层结构中,底层的协议头是如何承载上层的不同的协议的。对于链路层而言,以太网首部中有不同帧类型用于表示以太网帧内的数据。在IP数据包的首部,也有专门的8位协议类型,用于表示IP包中的上层协议类型,网址中给出了IETF规定的详细的协议类型号,其中TCP是6,UDP是17,ICMP是1。不过在传输层的两个常用协议TCP和UDP首部中,并没有协议类型的字段,TCP和UDP包内的应用程协议的类型依靠的是TCP和UDP包首部的端口号来进行区分。对于一些常用的应用层协议IETF都规定了相应的熟知端口号,在网址中有一份详细的列表。TCP和UDP报头的16比特端口号给应用层协议的设计提供了足够的设计空间(65535个)和足够的灵活度。
查询网址可知https的端口号对应:
理解了协议的分用之后,就比较容易理解wireshark是如何将数据包识别和展示出来的了。wireshark的工作原理的简单介绍可以参见。概括地说,就是wireshark是一款建立在已有的包捕捉工具上的一款数据包分析软件。常见的抓包的库有libpcap、jpcap、winpcap等等,这些抓包工具将主机的网卡设置为混杂模式,从而可以捕捉到目的MAC不是主机网卡的数据包。而wireshark基于这些库捕捉到的包进行识别和分析,将包中内容按照协议类型和层次展示出来。
不过对于那些不采用熟知端口传输的应用层协议而言,wireshark就有可能出现无法识别的情况,这也是我最近遇到的一个场景。我在抓包的时候遇见了wireshark protocol一栏显示enttec,Info 一栏显示 unknown的情况。经过一段时间的分析,可以确定wireshark显示enttec和unknown的原因是TCP采用了非熟知端口发送HTTP报文。不过wireshark在设计中已经考虑到这样一种情况的出现,可以针对非熟知端口的已知应用层协议设置相应的解码方式。具体的方法是:选中无法识别的报文->右键单击->Decode As->选择相应的应用层协议。
WireShark识别应用层协议的依据是端口号!!!
背景:使用20001端口进行https握手和传输。
抓包后看到的结果是这样的,显示的都是TCP。这种应该就是没有找到对应的应用层协议。但是下面的明明应该是https握手和传输。可以看出此时进行传输的端口号是34128.
在34124端口数据上右击,选择Decode As…->Transport,将34128<->80之间的TCP传输当成SSL协议。
再看看wireshark显示,可以看到相关的TLSv1.2的握手和传输都已经正确显示了。
参考资料
Wireshark基本介绍和学习TCP三次握手:
Fiddler-http检测调试工具:
WEB/HTTP 调试利器 Fiddler 的一些技巧分享:
Http调试工具-Fiddler使用指引:
用Wireshark简单分析HTTPS传输过程-抓包过程:
利用Fiddler对Android https请求进行监测:
为什么Wireshark无法解密HTTPS数据: