什么是Wireshark

    Wireshark是世界上最流行的网络分析工具。这个强大的工具可以捕捉网络中的数据包,并为用户提供关于网络和上层协议的各种信息,并尝试显示包尽可能详细的情况。与很多其他网络工具一样,Wireshark 也使用pcap network library来进行封包捕捉。Wireshark可能算得上是今天能使用的最好的开源网络分析软件。

    Wireshark的前身叫做Ethereal(因为商标问题而改名),是开放源代码软件,我们可以免费从官方网站(http://wireshark.org)下载使用。Wireshark支持多种操作系统,在windows,UNIX,MAC等系统都有相应的版本。通过此软件,我们可以抓取网络数据包,分析数据包的内容,一般常用在网络故障排除、软件封包检测。在使用上,Wireshark提供的图形界面,非常直观,而且相当容易上手,以及支持丰富的过滤语言,可以灵活捕获我们需要的数据包,是一个非常有用的软件。

    如果您不使用图形界面,也许会对TShark感兴趣。它是Wireshark的CLI版本。TShark支持与Wireshark 相同的功能。

下面是Wireshark一些应用的举例:

  • 网络管理员用来解决网络问题

  • 网络安全工程师用来检测安全隐患

  • 开发人员用来测试协议执行情况

  • 用来学习网络协议

除了上面提到的,Wireshark还可以用在其它许多场合。

注意事项:

    Wireshark支持UNIX和Windows平台,对于UNIX/Linux:Wireshark依赖于libpcap库,它需要使用这个库的功能进行封包捕捉工作。 对于Windows平台:依赖于winpcap库。如果系统中没有安装libpcap或者winpcap库或者其他必要的组件,Wireshark就无法工作,请自行安装。

使用wireshark的前提:

    使用wireshark之前,请确保了解OSI七层网络协议,以及各层协议包首部的格式,否则看不懂捕获的信息。

wireshark不能做的:

    为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。

Wireshark VS Fiddler:

Fiddler是在windows上运行的程序,专门用来捕获HTTP,HTTPS的。

wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容

总结,如果是处理HTTP,HTTPS 还是用Fiddler,  其他协议比如TCP,UDP 就用wireshark

安装Wireshark

    首先,我们到其官方网站(http://www.wireshark.org)下载相应操作系统版本的wireshark软件。这里以windows平台演示,安装的过程很简单,基本保持默认的设定即可。

注意:我只是截一些比较关键步骤的图。

wKioL1Psp-uAZKvDAAFSnr_ZwHk514.jpg

    需要注意的是,安装过程中会提示我们安装WinPcap(Windows Packet Capture),WinPcap是Windows版本的libpcap库,Wireshark使用这个库区抓取网络上的封包,它含有支持抓取网络封包的驱动程序,所以我们必须安装它。如果电脑上已经安装WinPcap,也建议更新到最新的版本。

    这里,请选择 Install WinPcap, 如果想了解更多的WinPcap信息,点击【What is WinPcap?】即可。 其他的地方都是一路Next即可

wKioL1PsqCTQtBE_AAFIhVouGBU087.jpg

运行Wireshark

Wireshark开始页面,图中画框的地方,是我们最常用到的操作。

wKioL1PssP7iaIT_AAMmfK8gz8I258.jpg

    Wireshark只能捕获机器某一块网卡的网络包,当你的机器有多块网卡的时候,需要指定捕获哪一块网卡的数据包。我们选择一块网卡之后,点击"Start"按钮,即可开始抓包。

wKiom1PssV2wT_BLAAMLG-6Z2jY235.jpg

下面我们看一下wireshark的窗口

wKiom1PstA2TAdxdAAYwtFAGyzI785.jpg我们分别介绍解释这些窗口的作用。

1、MENUS(菜单)

wKioL1Pstdzhxt7yAAB9-OidrqI857.jpg

程序上方的11个菜单项用于对Wireshark进行配置:

- "File"(文件)            打开或保存捕获的信息。

- "Edit"(编辑)            查找或标记封包。进行全局设置。

- "View"(视图)            设置Wireshark的视图。

- "Go"(转到)              跳转到捕获的数据。

- "Capture"(捕获)         设置捕获的网卡,捕获过滤器。

- "Analyze"(分析)         设置分析选项。

- "Statistics"(统计)      查看wireshark的统计信息

- "Telephony"(电话)

- "Tools"(工具)           访问控制列表ACL及LUA相关

- "Internals"(内部信息)   解析表及支持的协议类型。

- "Help"(帮助)            查看本地或者在线帮助文档。

2、SHORTCUTS(快捷方式)

wKioL1PsuIzB5okEAAB7THvcep8591.jpg在菜单下面,是一些常用的快捷按钮。您可以将鼠标指针移动到某个图标上以获得其功能说明。

3、DISPLAY FILTER(显示过滤器)

wKiom1Pst-fgrsdPAABFoi4mEdA655.jpg

显示过滤器用于查找捕捉记录中的内容。请不要将捕捉过滤器和显示过滤器的概念相混淆。如果过滤表达式正确,则方框中显示为淡绿色,表达式有错误,则为粉红色。

4、PACKET LIST PANE(封包列表)

wKiom1PsuKjiokn7AAKj49q_Tco502.jpg

    封包列表中显示所有已经捕获的封包。在这里您可以看到发送或接收方的MAC/IP地址,TCP/UDP端口号,协议或者封包的内容。
    如果捕获的是一个OSI layer 2的封包,您在Source(来源)和Destination(目的地)列中看到的将是MAC地址,当然,此时Port(端口)列将会为空。
    如果捕获的是一个OSI layer 3或者更高层的封包,您在Source(来源)和Destination(目的地)列中看到的将是IP地址。Port(端口)列仅会在这个封包属于第4或者更高层时才会显示。

封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。你可以看到每一种协议都会以不同的颜色表示,你也可以修改这些颜色显示的规则:

View -> Coloring Rules

您可以在这里添加/删除列或者改变各列的颜色:
Edit menu -> Preferences 

5、PACKET DETAILS PANE(封包详细信息)

wKioL1PswA3j3yY-AAL5T9fnSQU694.jpg

这里显示的是在封包列表中被选中项目的详细信息。
信息按照不同的OSI layer进行了分组,您可以展开每个项目查看。前面带" + "号的项,就可以展开。

各行信息分别为

Frame:   物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol Version 4: 互联网层IP包头部信息

Transmission Control Protocol:  传输层T的数据段头部信息,此处是TCP

Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议

wireshark详细信息的层与对应OSI七层模型

wKioL1Psw6TAtleEAAJUF8BBurI882.jpg

6、DISSECTOR PANE(十六进制数据)

wKioL1PswRbAmzZJAAKQOf9gZ4Q877.jpg

“解析器”在Wireshark中也被叫做“16进制数据查看面板”。这里显示的内容与“封包详细信息”中相同,只是改为以16进制的格式表述。
在上面的例子里,我们在“封包详细信息”中选择查看TCP端口(80),其对应的16进制数据将自动显示在下面的面板中(0050)。

7、MISCELLANOUS(杂项)

wKioL1PswbTQKXLJAABVm5RDMCg412.jpg

在程序的最下端,您可以获得如下信息:

- "File:"        捕捉结果的保存位置。
- "Packets:"     已捕捉封包的数量。

- "Displayed:"   显示的封包数量。

- "Dropeed:"     (经过显示过滤器过滤后仍然显示的封包)

Wireshark之过滤器

    使用Wireshark时最常见的问题,是当您使用默认设置时,瞬间就会得到大量冗余信息,以至于很难找到自己需要的部分。

    这就是为什么过滤器会如此重要。它们可以帮助我们在庞杂的结果中迅速找到我们需要的信息。

  • 捕获过滤器:用于决定捕获什么数据,需要在开始之前捕获时设置

  • 显示过滤器:在捕获的结果中进行详细查找。它们可以在得到捕获结果后随意修改

那么我应该使用哪一种过滤器呢?
两种过滤器的目的是不同的。
捕捉过滤器是数据经过的第一层过滤器,它用于控制捕捉数据的数量,以避免产生过大的日志文件。
显示过滤器是一种更为强大(复杂)的过滤器。它允许您在日志文件中迅速准确地找到所需要的记录。

两种过滤器使用的语法是完全不同的。

捕获过滤器

    捕捉过滤器的语法与其它使用Lipcap(Linux)或者Winpcap(Windows)库开发的软件一样,比如著名的TCPdump(如果您使用过tcpdump,那么这个对于您来说,这都不是事儿。捕捉过滤器必须在开始捕捉前设置完毕,这一点跟显示过滤器是不同的。 

设置捕捉过滤器的步骤是:
- 选择 capture -> options。
- 填写"capture filter"栏或者点击"capture filter"按钮为您的过滤器起一个名字并保存,以便在今后的捕捉中继续使用这个过滤器。
- 点击开始(Start)进行捕捉。

wKioL1PsxzeSZeXVAACzPnMq6Dw067.jpg

wKiom1PsxomBdreTAAIX3-vkp3s486.jpg

过滤表达式的语法(语法正确:浅绿色  语法错误:粉红色)

wKioL1PsyB3xMIfeAACEUpEpGoE889.jpg

droite.gif Protocol(协议):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp.
如果没有特别指明是什么协议,则默认使用所有支持的协议。 

droite.gif Direction(方向):
可能的值: src, dst, src and dst, src or dst
如果没有特别指明来源或目的地,则默认使用 "src or dst" 作为关键字。
例如,"host 10.2.2.2"与"src or dst host 10.2.2.2"是一样的。

 
droite.gif Host(s):
可能的值: net, port, host, portrange.
如果没有指定此值,则默认使用"host"关键字。
例如,"src 10.1.1.1"与"src host 10.1.1.1"相同。 

droite.gif Logical Operations(逻辑运算):
可能的值:not(!), and(&&), or(||).
否("not")具有最高的优先级。或("or")和与("and")具有相同的优先级,运算时从左至右进行。
例如,
"not tcp port 3128 and tcp port 23"与"(not tcp port 3128) and tcp port 23"相同。
"not tcp port 3128 and tcp port 23"与"not (tcp port 3128 and tcp port 23)"不同。

例子:

// 显示目的TCP端口为3128的包
tcp dst port 3128

// 显示来源IP地址为10.1.1.1的封包
ip src host 10.1.1.1

// 显示来源为UDP或TCP, 并且端口号在2000-2500范围内的封包
src protrange 2000-2500

// 显示除了icmp以外的所有封包,icmp通常被ping工具使用
not icmp    或者  ! icmp

// 显示来源IP地址为10.7.2.12,但目的地址不是10.200.0.0/16的封包
src host 10.7.2.12 and (not dst net 10.200.0.0/16)


注意事项:

当使用关键字作为值时,需使用反斜杠“\”。
"ether proto \ip" (与关键字"ip"相同).
这样写将会以IP协议作为目标。

"ip proto \icmp" (与关键字"icmp"相同).
这样写将会以ping工具常用的icmp作为目标。 

可以在"ip"或"ether"后面使用"multicast"及"broadcast"关键字。
当您想排除广播请求时,"no broadcast"就会非常有用。 


显示过滤器

通常经过捕捉过滤器过滤后的数据还是很复杂。此时您可以使用显示过滤器进行更加细致的查找。
它的功能比捕捉过滤器更为强大,而且在您想修改过滤器条件时,并不需要重新捕捉一次。

wKiom1Psy-WQzDmfAACQ86isrTQ580.jpg

droite.gif Protocol(协议):

您可以使用大量位于OSI模型第2至7层的协议。点击"Expression..."按钮后,您可以看到它们。
比如:IP,TCP,DNS,SSH

wKioL1PszV6jgtuFAAKcDSDYj0U813.jpg

droite.gif String1, String2 (可选项):

协议的子类。
点击相关父类旁的"+"号,然后选择其子类。 

wKiom1PszNCghOVcAAE9m5ZjPeA990.jpg

droite.gif Comparison operators (比较运算符)

可以使用6种比较运算符:

wKioL1Pszh2CUn62AABzrsp_WKA036.jpg

droite.gif Logical expressions(逻辑运算符):

wKiom1PszRrxSE0wAABhQY5dbYw341.jpg

被程序员们熟知的逻辑异或是一种排除性的或。当其被用在过滤器的两个条件之间时,只有当且仅当其中的一个条件满足时,这样的结果才会被显示在屏幕上。
让我们举个例子:
"tcp.dstport 80 xor tcp.dstport 1025"
只有当目的TCP端口为80或者来源于端口1025(但又不能同时满足这两点)时,这样的封包才会被显示。 

例子:

// 显示SNMP或DNS或ICMP封包
snmp || dns || icmp

// 显示来源或目的的IP地址为10.1.1.1的封包
ip.addr == 10.1.1.1

// 显示来源不为10.1.12.3或者目的不为10.4.5.6的封包。
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6 

// 显示来源或目的TCP端口为25的封包
tcp.port == 25

// 显示目的TCP端口为25的封包
tcp.dstport == 25

// 显示包含TCP SYN标志的封包
tcp.flags.syn == 0x02

如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。

wKioL1Ps0SqT0cdrAABAfOhHgis971.jpg

wKiom1Ps0BHAoEpOAABE1EHcH9k169.jpg

最后补充下,输入过滤表达式之后,点击"Apply"应用生效。如果想重新过滤的话,不能在过滤结果中再打过滤条件,记得"Clear"掉过滤条件后再打。


好了,到此,你应该能够很好的利用wireshark去抓取数据包了,但是只是抓取数据包还不行,我们还得对数据包进行分析才行,下一篇文章接着写 如何分析。


http://fangxin.blog.51cto.com/1125131/735178

http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html

http://man.lupaworld.com/content/network/wireshark/Introduction.html#whatis

http://openmaniak.com/cn/wireshark_filters.php

http://www.howtogeek.com/104278/how-to-use-wireshark-to-capture-filter-and-inspect-packets/