网络工具Netwox和Wireshark详解

时间:2022-11-08 20:53:39

一、Netwox网络工具集

1、Netwox简介

一个好的辅助工具可以起到事半功倍的效果。

netwox是由lauconstantin开发的一款网络工具集,适用群体为网络管理员。它可以创造任意的TCP、UDP和IP数据报文,以实现网络欺骗。它可以在命令模式下使用,也可以在GUI中使用netwag调用。

该工具包含了超过200个不同的功能,这里被称为模块。每个模块都有一个特定的编号,使用不同的编号模块来实现不同的功能。netwox工具支持在Linux和Windows系统中运行。

2、下载及安装

Kali Linux系统自带netwox工具,而Windows系统默认没有安装。因此,这里我们讲解如何在Windows系统中安装netwox工具。

安装方法如下:

(1)访问网址netwox download | SourceForge.net,进入netwox下载页面,如图所示。

网络工具Netwox和Wireshark详解

图中显示了可下载的版本,从这里可以看到当前的最新版本为5.39。

(2)下载最新版本,单击Download Latest Version按钮进行下载。成功下载后,下载的是一个压缩包,名称为netw-ib-ox-ag-5.39.0.tgz。

(3)解压netw-ib-ox-ag-5.39.0.tgz安装包,在解压的文件夹中找到对应的应用程序文件installwindows.exe。双击该文件进行安装,会弹出“安装确认”对话框,如图所示。

网络工具Netwox和Wireshark详解

(4)同意在该系统中安装。输入y,并回车,将显示其他需要确认的信息。这里,一律输入y并回车即可,信息如下: 

This program will install netwib, netwox and netwag on your system.
Do you agree ? [y/n] y
Setting global variables.
Version...
Version=539
InstallDir...
InstallDir=C:\Program Files (x86)\netw\netw539
Do you agree to use this installation directory ? [y/n] y #确认安装的目录
Copying files under C:\Program Files (x86)\netw\netw539
src\netwox-bin_windows\netwib539.dll
src\netwox-bin_windows\netwox539.exe
src\netwag-bin_windows\netwag539.tcl
src\netwib-bin_windows\dll
src\netwib-bin_windows\include
src\netwib-bin_windows\lib
src\netwib-doc_html\*
src\netwox-doc_html\*
src\netwag-doc_html\*
Do you agree to place shortcuts on desktop ? [y/n] y #确认是否创建桌面快捷键
Do you agree to place shortcuts in start menu ? [y/n] y #确认是否在开始菜单中创建快捷键
Press any key to terminate

(5)上述代码中的最后一行信息表示按任意键终止,即表示安装完成。此时在“开始”菜单中可以查看到安装的netwox工具,如图所示。

网络工具Netwox和Wireshark详解

3、Netwox功能介绍 

成功安装了netwox工具以后就可以使用了。由于该工具提供了众多模块,为了方便用户对模块的查找和使用,netwox对这些模块以分类的方式进行了整理,以层次结构(如主菜单、子菜单)的方式进行显示,供用户查找和使用。使用该工具之前,需要了解分类的这些层次结构。

下面将对层次结构进行分析:

(1)在“开始”菜单中,选择netwox命令,运行netwox工具,如图所示。

网络工具Netwox和Wireshark详解

图中显示了该工具的主菜单。每一行表示一个菜单项,第一个字符为该菜单的快捷键。每个菜单含义如下:

  • 0:退出netwox工具。
  • 3:搜索工具,用来搜索与指定信息相关的模块。
  • 4:显示指定模块的帮助信息。
  • 5:在命令行中输入指定模块的参数选项并运行。
  • 6:从键盘输入指定模块的参数选项并运行。
  • a:显示信息。
  • b:显示网络协议下相关的模块。
  • c:显示应用程序协议下相关的模块。
  • d:显示与嗅探数据包相关的模块。
  • e:显示与创建和发送数据包相关的模块。
  • f:显示与进行数据包记录相关的模块。
  • g:显示与客户端相关的模块。
  • h:显示与服务器相关的模块。
  • i:显示与检测主机连通性相关的模块。
  • j:显示与路由跟踪相关的模块。
  • k:显示与扫描计算机和端口相关的模块。
  • l:显示与审计相关的模块。
  • m:显示与暴力破解相关的模块。
  • n:显示与远程管理相关的模块。
  • o:显示其他模块。

以上菜单项是netwox工具的总体分类,每个菜单项属于一个大类。而每个菜单项中还会有子菜单,而每个子菜单下又有一个小的分类。

(2)使用快捷键e,查看创建和发送数据包的相关模块,输出信息如下: 

Select a node (key in 03456abcdefghijklmno): e
############# spoof (create and send packets) ############## #创建和发送数据包模块
0 - leave netwox
1 - go to main menu
2 - go to previous menu
3 - search tools
4 - display help of one tool
5 - run a tool selecting parameters on command line
6 - run a tool selecting parameters from keyboard
a + Ethernet spoof
b + IP spoof
c + UDP spoof
d + TCP spoof
e + ICMP spoof
f + ARP spoof

从输出信息可以了解到,该分类中的子菜单包含了各种创建和发送数据包的模块,如IP协议的(快捷键b)、UDP协议的(快捷键c)、ICMP协议的(快捷键e)。通过子菜单的快捷键,可以进一步查看具体的可用模块或更小的分类。

(3)使用快捷键c,查看创建和发送UDP数据包的模块,输出信息如下:

Select a node (key in 0123456abcdef): c
######################## UDP spoof ######################### #创建和发送UDP数据包
0 - leave netwox
1 - go to main menu #返回主菜单
2 - go to previous menu #返回上一个菜单
3 - search tools
4 - display help of one tool
5 - run a tool selecting parameters on command line
6 - run a tool selecting parameters from keyboard
a - 35:Spoof EthernetIp4Udp packet
b - 39:Spoof Ip4Udp packet
c - 43:Spoof of packet samples : fragment, ip4opt:noop
d - 44:Spoof of packet samples : fragment, ip4opt:rr
e - 45:Spoof of packet samples : fragment, ip4opt:lsrr
f - 46:Spoof of packet samples : fragment, ip4opt:ts
g - 47:Spoof of packet samples : fragment, ip4opt:ipts
h - 48:Spoof of packet samples : fragment, ip4opt:ippts
i - 141:Spoof EthernetIp6Udp packet
j - 145:Spoof Ip6Udp packet
k - 192:Spoof of packet samples : fragment, ip4opt:ssrr

以上输出信息显示了相关的各种模块及快捷键。

例如,加netwox的第39个模块功能为创建基于IPv4地址的UDP协议数据包。如果使用该模块,可以使用快捷键b;如果用户想退出当前分类,以使用快捷键1返回主菜单,或使用快捷键2返回上一个菜单;使用快捷键0退出netwox工具。以类似的方法,可以查看其他分类中的模块。

4、使用搜索功能

虽然netwox工具对所有模块进行了整理和分类,但是有时候想找到要使用的模块也会很麻烦。因此,netwox提供了搜索功能。用户可以指定关键字搜索与之相关的模块。

例如,搜索与DNS相关的模块。在主菜单界面中输入3,显示信息如下:

Select a node (key in 03456abcdefghijklmno): 3
Enter search string:

以上输出信息表示,需要在这里输入要搜索的关键字。

例如,这里输入dns然后回车,将显示与DNS相关的模块,输出信息如下:

Enter search string: dns
############ list of tools containing this text ############
Tools containing "dns":
102:Query a DNS server
103:Obtain version of a Bind DNS server
104:DNS server always answering same values
105:Sniff and send DNS answers

输出信息显示了与DNS相关的模块。相关的模块编号有102、103、104和105。

5、使用模块

我们介绍了如何查找要使用的模块。找到要使用的模块编号以后就可以进行使用了。我们将以一个模块为例,简单地介绍其使用方法。

无论使用哪个模块,基本语法是不会变的。

语法格式如下:

neywox ID options

其中,ID表示模块对应的编号,是必需的;options表示可用到的选:项,是可选的。

案例1:演示使用编号为1的模块,实现对应的功能。

(1)启动netwox工具

然后在主菜单界面中按快捷键5,显示信息如下:

Select a node (key in 03456abcdefghijklmno): 5
Select tool number (between 1 and 223):

以上输出信息表示需要输入要使用的模块编号。

(2)本例使用第1个模块,输入1然后回车,将显示该模块的帮助信息,并在帮助信息下面会给出使用模块的命令。

输出信息如下:

Select tool number (between 1 and 223): 1
################## running tool number 1 ###################
Title: Display network configuration #功能简单介绍
+--------------------------------------------------------------------------------------------------------------+
| This tool displays network configuration: | #功能详细说明
| - the list of devices/interfaces: |
| + nu: device number |
| + dev: easy device name |
··· #省略其他信息
| - the routes |
| + nu: device number of device associated to this entry |
| + destination/netmask: destination addresses |
| If no Parameter is set, they are all displayed. |
| |
| This tool may need to be run with admin privilege in order to obtain |
| full network configuration. |
+-------------------------------------------------------------+
Synonyms: address, arp, device, gateway, ifconfig, interface, ipconfig, mac,
neighbor, netmask, route, show
Usage: netwox 1 [-d|+d] [-i|+i] [-a|+a] [-r|+r] #语法格式
Parameters: #可用的选项参数
-d|--devices|+d|--no-devices display devices
-i|--ip|+i|--no-ip display ip addresses
-a|--arpcache|+a|--no-arpcache display arp cache and neighbors
-r|--routes|+r|--no-routes display routes
Example: netwox 1 #参考实例
Enter optional tool parameters and press Return key.
netwox 1

上述信息首先输出模块功能的简单介绍,以及功能的详细说明信息;然后输出的是该模块的语法格式和可用的选项参数,并给出了参考实例。

输出信息的最后一行是用户使用到的命令。我们要使用的模块为1,因此给出的命令信息为netwox 1。这里还可以输入可使用的选项。如果选项不是必须的,可以不输入选项。

(3)本例中,使用选项-i表示获取IP地址信息。在netwox 1后面输入-i然后回车,将执行模块功能。

运行结果如下:

netwox 1 -i
nu ip /netmask ppp point_to_point_with
1 127.0.0.1 /255.0.0.0 0
2 192.168.59.1 /255.255.255.0 0
5 192.168.12.102 /255.255.255.0 0
7 192.168.38.1 /255.255.255.0 0
13 192.168.12.102 /255.255.255.0 0
25 192.168.38.1 /255.255.255.0 0
26 192.168.59.1 /255.255.255.0 0
9 127.0.0.1 /255.0.0.0 0
Command returned 0 (OK)
Press 'r' or 'k' to run again this tool, or any other key to continue

以上输出信息显示了模块执行的结果。输出信息的最后一行表示,如果用户继续使用该模块,按快捷键r或k,将回到netwox 1使用模块的命令模式中;如果用户不再使用该模块,按任意键将返回主菜单界面。

提示: 在Windows系统中使用netwox工具,需要按照以上模式运行工具。在Linux系统中,用户可以直接在命令行中,使用netwox命令+模块编号方式来直接使用,无须进行菜单操作。例如,在Linux系统中使用编号为1的模块,直接执行如下命令:

netwox 1 -i

6、显示网络配置信息

为了了解当前网络的相关信息,netwox工具提供了编号为1的模块。它可以显示当前主机的网络接口信息、主机的IP地址信息,以及路由表等信息。

显示网络配置信息,执行命令如下:

root@daxueba:~# netwox 1

执行命令后将显示当前网络设备信息。由于信息较多,下面对每个部分进行讲解。

1. 显示网络设备接口列表信息

############################## Devices ###############################
nu dev ethernet_hwtype mtu real_device_name
1 Lo0 loopback 65536 lo
2 Eth0 00:0C:29:CA:E4:66 1500 eth0

以上输出信息中每列含义如下:

  • nu:设备编号。
  • dev:设备接口名称的简单形式。
  • ethernet_hwtype:以太网地址或硬件类型。
  • mtu:MTU值。
  • real_device_name:设备接口名称的真正形式。

2. 显示IP地址列表信息

################################# IP #################################
nu ip /netmask ppp point_to_point_with
1 127.0.0.1 /255.0.0.0 0
1 ::1/128 0
2 192.168.59.131 /255.255.255.0 0
2 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466/64 0
2 fe80::20c:29ff:feca:e466/64 0
2 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a/64 0

以上输出信息中每列含义如下:

  • nu:与此地址关联的设备编号。
  • ip:IP地址。
  • netmask:子网掩码。
  • ppp:点对点的地址。
  • point_to_point_with:远程端点的地址。

3. IP4 ARP缓存或IP6邻居信息

######################### ArpCache/Neighbor ##########################
nu ethernet ip
2 00:0C:29:C4:8A:DE 192.168.59.132
2 00:0C:29:CA:E4:66 192.168.59.131
2 00:0C:29:CA:E4:66 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466
2 00:0C:29:CA:E4:66 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a
2 00:0C:29:CA:E4:66 fe80::20c:29ff:feca:e466
2 00:50:56:EA:F3:A1 192.168.59.2
2 00:50:56:EA:F3:A1 fe80::250:56ff:fec0:2222
2 00:50:56:F0:69:32 192.168.59.254

以上输出信息中每列含义如下:

  • nu:与此条目关联的设备编号。
  • ethernet:计算机的以太网地址。
  • ip:计算机的IP地址。

4. 显示路由信息

############################## Routes ################################
nu destination /netmask source gateway metric
1 127.0.0.1 /255.255.255.255 local 0
2 192.168.59.131 /255.255.255.255 local 0
2 192.168.59.0 /255.255.255.0 192.168.59.131 100
1 127.0.0.0 /255.0.0.0 127.0.0.1 0
2 0.0.0.0 /0.0.0.0 192.168.59.131 192.168.59.2 100
1 ::1/128 local 0
2 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466/128 local 0
2 fe80::20c:29ff:feca:e466/128 local 0
2 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a/128 local 0
2 fd15:4ba5:5a2b:1008::/64 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466 0
2 fe80::/64 fe80::20c:29ff:feca:e466 0
2 fd15:4ba5:5a2b:1008::/64 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a 0
2 fd15:4ba5:5a2b:1008::/64 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466
fe80::250:56ff:fec0:2222 100
2 ::/0 fe80::20c:29ff:feca:e466 fe80::250:56ff:fec0:2222 100

以上输出信息中每列含义如下:

  • nu:与此条目关联的设备编号。
  • destination:目标地址。
  • netmask:掩码。
  • source:源IP地址或本地路由。
  • gateway:网关。
  • metric:路线度量。

7、显示网络调试信息

如果想了解更多的网络信息,netwox工具还提供了编号为2的模块,用于显示网络调试信息。

显示网络调试信息,执行命令如下:

root@daxueba:~# netwox 2

执行命令后可以看到,不仅显示了网络配置信息,还显示了调试信息:

Netwox toolbox version 5.39.0. #版本信息
Netwib library version 5.39.0.
####****####****####****####****####
NETWIBDEF_SYSNAME="Linux"
NETWIBDEF_SYSARCH="amd64"
NETWIBDEF_ARCH_ENDIAN=0
NETWIBDEF_ARCH_BITS=64
NETWIBDEF_ARCH_ALIGN=1
#省略其他信息
NETWIBDEF_HAVEVAR_SC_GETPW_R_SIZE_MAX=1
NETWIBDEF_HAVEVAR_SC_GETGR_R_SIZE_MAX=1
Error 0 : ok #0个错误
####****####****####****####****####
############################## Devices ################################
nu dev ethernet_hwtype mtu real_device_name
1 Lo0 loopback 65536 lo
2 Eth0 00:0C:29:CA:E4:66 1500 eth0
################################# IP ##################################
nu ip /netmask ppp point_to_point_with
1 127.0.0.1 /255.0.0.0 0
1 ::1/128 0
2 192.168.59.131 /255.255.255.0 0
2 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466/64 0
2 fe80::20c:29ff:feca:e466/64 0
2 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a/64 0
########################## ArpCache/Neighbor ##########################
nu ethernet ip
2 00:0C:29:C4:8A:DE 192.168.59.132
2 00:0C:29:CA:E4:66 192.168.59.131
2 00:0C:29:CA:E4:66 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466
2 00:0C:29:CA:E4:66 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a
2 00:0C:29:CA:E4:66 fe80::20c:29ff:feca:e466
2 00:50:56:EA:F3:A1 192.168.59.2
2 00:50:56:EA:F3:A1 fe80::250:56ff:fec0:2222
2 00:50:56:F0:69:32 192.168.59.254
############################## Routes #################################
nu destination /netmask source gateway metric
1 127.0.0.1 /255.255.255.255 local 0
2 192.168.59.131 /255.255.255.255 local 0
2 192.168.59.0 /255.255.255.0 192.168.59.131 100
1 127.0.0.0 /255.0.0.0 127.0.0.1 0
2 0.0.0.0 /0.0.0.0 192.168.59.131 192.168.59.2 100
1 ::1/128 local 0
2 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466/128 local 0
2 fe80::20c:29ff:feca:e466/128 local 0
2 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a/128 local 0
2 fd15:4ba5:5a2b:1008::/64 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466 0
2 fe80::/64 fe80::20c:29ff:feca:e466 0
2 fd15:4ba5:5a2b:1008::/64 fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a 0
2 fd15:4ba5:5a2b:1008::/64 fd15:4ba5:5a2b:1008:20c:29ff:feca:e466
fe80::250:56ff:fec0:2222 100
2 ::/0 fe80::20c:29ff:feca:e466 fe80::250:56ff:fec0:2222 100
Error 0 : ok
hint: errno = 19 = No such device
hint: this is not an IPv4 address: fe80::250:56ff:fec0:2222
####****####****####****####****####
:::: After devices_ioctl :::: # devices_ioctl信息
$$$ devices $$$
d=0,lo, m=65536 t=loopback
d=0,eth0, m=1500 t=ethernet>00:0C:29:CA:E4:66
d=0,lo, m=65536 t=loopback
d=0,eth0, m=1500 t=ethernet>00:0C:29:CA:E4:66
$$$ ip $$$
d=0,lo i=127.0.0.1/255.0.0.0 p=false
d=0,eth0 i=192.168.59.131/255.255.255.0 p=false
$$$ arpcache $$$
$$$ routes $$$
:::: After procnetifinet6 :::: # procnetifinet6信息
$$$ devices $$$
d=0,lo, m=65536 t=loopback
d=0,eth0, m=1500 t=ethernet>00:0C:29:CA:E4:66
d=0,lo, m=65536 t=loopback
d=0,eth0, m=1500 t=ethernet>00:0C:29:CA:E4:66
$$$ ip $$$
d=0,lo i=127.0.0.1/255.0.0.0 p=false
d=0,eth0 i=192.168.59.131/255.255.255.0 p=false
d=0,lo i=::1/128 p=false
d=0,eth0 i=fd15:4ba5:5a2b:1008:20c:29ff:feca:e466/64 p=false
d=0,eth0 i=fe80::20c:29ff:feca:e466/64 p=false
d=0,eth0 i=fd15:4ba5:5a2b:1008:4c3c:fda9:c3dc:499a/64 p=false
… #省略其他信息
$$$ routes $$$
d=1,lo i=127.0.0.1/255.255.255.255 s=false g=false m=0
d=2,eth0 i=192.168.59.131/255.255.255.255 s=false g=false m=0
d=2,eth0 i=192.168.59.0/255.255.255.0 s=true,192.168.59.131 g=false m=100
d=1,lo i=127.0.0.0/255.0.0.0 s=true,127.0.0.1 g=false m=0
d=2,eth0 i=::/0 s=true,fe80::20c:29ff:feca:e466 g=true,fe80::250:56ff:
fec0:2222 m=100
Error 0 : ok
hint: errno = 19 = No such device
hint: this is not an IPv4 address: fe80::250:56ff:fec0:2222
####****####****####****####****####
END

二、网络分析工具Wireshark入门

Wireshark(前身Ethereal)是一个网络包分析工具。该工具主要是用来捕获网络数据包,并自动解析数据包,为用户显示数据包的详细信息,供用户对数据包进行分析,它可以运行在Windows和Linux操作系统上。

1、下载及安装

Kali Linux系统自带Wireshark工具,而Windows系统中默认没有安装该工具。因此,我们介绍如何在Windows系统中安装Wireshark工具。

安装方法如下:

(1)打开网址http://www.wireshark.org ,进入Wireshark官网,如图所示。

网络工具Netwox和Wireshark详解

(2)单击图中的下载图标进入下载页面,如图所示。

网络工具Netwox和Wireshark详解

在Stable Release部分可以看到目前Wireshark的最新版本是2.6.5,并提供了Windows(32位和64位)、Mac OS和源码包的下载地址。用户可以根据自己的操作系统下载相应的软件包。 

(3)这里下载Windows 64位的安装包。单击Windows Installer(64-bit)链接,进行下载。下载后的文件名为Wireshark-win64-2.6.5.exe。

(4)双击下载的软件包进行安装。安装比较简单,只要使用默认值,单击Next按钮,即可安装成功。

(5)安装好以后,在Windows的“开始”菜单中会出现Wireshark图标,如图所示。

网络工具Netwox和Wireshark详解

2、菜单介绍

第一次打开Wireshark,界面如下:

网络工具Netwox和Wireshark详解

第一排,菜单,按照常用功能分类,点击会出现下拉显示。

第二排,常用工具条(快捷按钮),列出了在抓包和分析过程中最常见的功能按钮。

第三排,显示过滤器工具条,用来设置显示过滤器。

主体部分,直接显示了本地电脑上的所有网卡列表,以及通过时序图显示了哪些网卡上面有流量传输,以及流量传输的分布情况。

再往下面则是学习指导信息。

最后一栏,显示Wireshark状态信息。

按照功能分类,下拉显示功能内容。

网络工具Netwox和Wireshark详解

第一次抓包,除了直接选择主体中的网卡列表外,也可以选择捕获接口中网卡信息。 

主工具条最左边一组4个按钮都与抓包操作有关,其余按钮分别涉及文件操作、数据包选择操作、字体缩放操作、配色及自动滚屏抓包显示过滤器的调整及应用等。

网络工具Netwox和Wireshark详解

状态栏在不同的工作状况下,显示各不相同,主要显示数据包相关的状态和统计信息。

常见的状态栏信息有:

  • 选择为抓包文件添加注释信息;
  • 观察到抓包文件的名称(在抓包期间,抓包文件名由Wireshark软件临时分配);
  • 获知抓包文件中包含的数据包的数量、Wireshark实际显示出的数据包的数量,以及人为打上标记的数据包的数量。

网络工具Netwox和Wireshark详解

3、使用Wireshark抓包

安装好Wireshark以后,就可以运行它来捕获数据包了。

方法如下:

(1)在Windows的“开始”菜单中,单击Wireshark菜单,启动Wireshark,如图所示。

网络工具Netwox和Wireshark详解

该图为Wireshark的主界面,界面中显示了当前可使用的接口,例如,本地连接5、本地连接10等。要想捕获数据包,必须选择一个接口,表示捕获该接口上的数据包。

(2)在上图中,选择捕获“本地连接”接口上的数据包。选择“本地连接”选项,然后单击左上角的 按钮,将进行捕获网络数据,如下图所示。

网络工具Netwox和Wireshark详解

图中没有任何信息,表示没有捕获到任何数据包。这是因为目前“本地连接”上没有任何数据。只有在本地计算机上进行一些操作后才会产生数据,如浏览网站。

(3)当本地计算机浏览网站时,“本地连接”接口的数据将会被Wireshark捕获到,捕获的数据包如图所示。

网络工具Netwox和Wireshark详解

图中方框中显示了成功捕获到“本地连接”接口上的数据包。

Wireshark主窗口的设计使用了3个面板,主窗口的3个面板相互有着联系。

网络工具Netwox和Wireshark详解

如果希望在 Packet Details(数据包细节)面板中查看一个单独的数据包的具体内容,你必须现在Packet List(数据包列表)面板中单击选中那个数据包。

在你选中了数据包之后,你可以通过在Packet Details面板中选中数据包的某个字段,从而在 Packet Bytes(数据包细节)面板中查看相应字段的字节信息。

Packet List(数据包列表):最上面的面板用表格显示了当前捕获文件中的所有数据包,其中包括了数据包序号、数据包被捕获的相对时间、数据包的源地址和目标地址、数据包的协议以及在数据包中找到的概况信息等列。

Packet Details(数据包细节):中间的面板分层次地显示了一个数据包中的内容,并且可以通过展开或是收缩来显示这个数据包中所捕获到的全部内容。

Packet Bytes(数据包字节):最下面的面板可能是最令人困惑的,因为它显示了一个数据包未经处理的原始样子,也就是其在网络上传输时的样子。这些原始数据看上去一点都不容易理解。

(4)Wreshark将一直捕获“本地连接”上的数据。如果不需要再捕获,可以单击左上角的暂停按钮,停止捕获。

4、使用显示过滤器

默认情况下,Wireshark会捕获指定接口上的所有数据,并全部显示。这样会导致在分析这些数据包时,很难找到想要分析的那部分数据包。这时可以借助显示过滤器快速查找数据包。显示过滤器是基于协议、应用程序、字段名或特有值的过滤器,可以帮助用户在众多的数据包中快速地查找数据包,可以大大减少查找数据包时所需的时间。

使用显示过滤器,需要在Wireshark的数据包界面中输入显示过滤器并执行,如图所示。

网络工具Netwox和Wireshark详解

图中方框标注的部分为显示过滤器区域。用户可以在里面输入显示过滤器,进行数据查找,也可以根据协议过滤数据包。

用到的显示过滤器如下表所示:

网络工具Netwox和Wireshark详解

例如,要从捕获到的所有数据包中,过滤出DNS协议的数据包,这里使用dns显示过滤器,过滤结果如图所示。

网络工具Netwox和Wireshark详解

图中显示的所有数据包的协议都是DNS协议。

5、分析数据包层次结构

任何捕获的数据包都有它自己的层次结构,Wireshark会自动解析这些数据包,将数据包的层次结构显示出来,供用户进行分析。这些数据包及数据包对应的层次结构分布在Wireshark界面中的不同面板中。

下面介绍如何查看指定数据包的层次结构:

(1)使用Wireshark捕获数据包,界面如图所示。

网络工具Netwox和Wireshark详解

上图中所显示的信息从上到下分布在3个面板中,每个面板包含的信息含义如下:

  • Packet List面板:上面部分,显示Wireshark捕获到的所有数据包,这些数据包从1进行顺序编号。
  • Packet Details面板:中间部分,显示一个数据包的详细内容信息,并且以层次结构进行显示。这些层次结构默认是折叠起来的,用户可以展开查看详细的内容信息。
  • Packet Bytes面板:下面部分,显示一个数据包未经处理的原始样子,数据是以十六进制和ASCII格式进行显示。

(2)以HTTP协议数据包为例,了解该数据包的层次结构。在Packet List面板中找到一个HTTP协议数据包,如图所示。

网络工具Netwox和Wireshark详解

其中,编号21的数据包是一个HTTP协议数据包。此时在Packet Details面板上显示的信息就是该数据包的层次结构信息。

这里显示了5个层次,每个层次的含义如下:

  • Frame:该数据包物理层的数据帧概况。
  • Ethernet II:数据链路层以太网帧头部信息。
  • Internet Protocol Version 4:网际层IP包头部信息。
  • Transmission Control Protocol:传输层的数据段头部信息。
  • Hypertext Transfer Protocol:应用层的信息,此处是HTTP协议。

由此可见,Wireshark对HTTP协议数据包进行解析,显示了HTTP协议的层次结构。

(3)用户对数据包分析就是为了查看包的信息,展开每一层,可以查看对应的信息。

例如,查看数据链路层信息,展开Ethernet II层,显示信息如下: 

Ethernet II, Src: Tp-LinkT_46:70:ba (ec:17:2f:46:70:ba), Dst: Giga-Byt_17:
cf:21 (50:e5:49:17:cf:21)
Destination: Giga-Byt_17:cf:21 (50:e5:49:17:cf:21) #目标MAC地址
Source: Tp-LinkT_46:70:ba (ec:17:2f:46:70:ba) #源MAC地址
Type: IPv4 (0x0800)

显示的信息包括了该数据包的发送者和接收者的MAC地址(物理地址),可以以类似的方法分析其他数据包的层次结构。

三、数据包结构及分析工具

数据包分析工具不只有Wireshark,还有一大堆趁手的工具,可以在解决网络缓慢、网络安全等常规问题及分析无线网络问题时大显威力。

1、数据包分析工具

除了Wireshark之外,还有一些实用的数据包分析工具,介绍一些我认为最有用的。

1. Tcpdump和Windump

虽然Wireshark很流行,但它可能没有Tcpdump用得广泛。考虑到一些人群对数据包捕获和分析的实际需求,Tcpdump是完全基于文本的。

虽然Tcpdump缺少图形特性,但它处理海量数据时非常靠谱。因为你可以用管道将它的输出重定向输入给其他命令,比如Linux的sed和awk。随着对数据包分析的深入钻研,你会发现Wireshark和

Tcpdump都很有用。

Windump只是Tcpdump在Windows平台的发行版而已。

Tcpdump:Home | TCPDUMP & LIBPCAP
Windump :WinDump - Home

2. Cain & Abel

Cain & Abel是Windows平台上最好的ARP缓存中毒攻击工具之一。

Cain & Abel实际上是一个非常健壮的工具套件,你一定能发现其他用途。

官网:oxid.it

3. Scapy

Scapy是一个非常强大的Python库,允许使用基于命令行脚本的方法创建、修改数据包。简单地说,Scapy是一款强大、灵活的数据包操纵程序。

官网:Scapy

4. Netdude

如果你不需要像Scapy那样高级的工具,那么Netdude是Linux下的一个较好的替代品。

虽然Netdude功能有限,但它提供了图形用户界面,因而出于研究目的,需要创建、修改数据包时,它显得极其方便。

官网:Netdude

5. Colasoft Packet Builder

如果你是Windows用户,并且想要与Netdude类似的GUI,那么你可以考虑使用Colasoft Packet Builder,一款超棒的免费工具。

Colasoft还提供了一个简便的用于数据包创建和修改的GUI。

官网:网络分析,网络安全分析,网络业务性能分析 - 科来

6. CloudShark

CloudShark(由QA Café开发)是我很喜爱的一个工具,可以用它在线分享数据包捕获记录。

CloudShark网站可以在浏览器里以Wireshark的方式显示网络捕获文件。你可以上传捕获文件,并将链接发送给同事,以便共同分析。

官网:网络分析,网络安全分析,网络业务性能分析 - 科来

关于CloudShark,我最赞赏的是它不需要注册,并能通过URL直接链接获取。这意味着,当我在博客上发布一个PCAP文件的链接时,其他人只需要单击就能查看数据包,而不需要在下载文件后,再用Wireshark打开。

7. pcapr

pcapr是Mu Dynamics创建的一个非常健壮的用于分享PCAP文件的Web 2.0平台。在撰写本文时,pcapr包含了将近3000个PCAP文件,涉及400多种不同协议的例子。

官网:http://www.pcapr.net/

次要查找某种确定类型的通信样例时,我都是首先在pcapr上搜索。如果你在自己的试验中创建了大量不同的捕获文件,不要犹豫,请将它们上传到pcapr社区分享。

8. NetworkMiner

NetworkMiner是一款主要用于网络取证的工具,但我发现它在其他一些情形下也非常实用。虽然它也可以用来捕获数据包,但它的强项在于如何解析数据包。

NetworkMiner会检测PCAP文件中网络各端的操作系统类型,并将文件解析成主机间的会话。它甚至允许你直接从捕获记录中提取传输的文件。

官网:http://networkminer.sourceforge.net/

9. Tcpreplay

每当有一堆数据包需要在线路上重传以观察设备如何响应它们时,我就用Tcpreplay来执行这个任务。

Tcpreplay专门设计用来重传PCAP文件里的数据包。

官网:Syn Fin dot Net | Streaming Thoughts from Syn to Fin

10. ngrep

如果你熟悉Linux,毫无疑问,你肯定用过grep搜索数据。ngrep与它非常相似,允许你在PCAP数据上执行特定搜索。当捕获和显示过滤器都无法实现我的目标或者实现太复杂时,我就使用ngrep。

官网:https://ngrep.sourceforge.net/

11. Libpcap

如果你计划开发一款应用程序,来进行一些确实高级的数据包解析,或是创建处理数据包,那么你要对Libpcap非常熟悉。简言之,Libpcap是一个用于网络流量捕获的可移植的C/C++库。

Wireshark、Tcpdump,以及其他大部分数据包分析工具都在一定层次上依赖于Libpcap。

官网:Home | TCPDUMP & LIBPCAP

12. Hping

Hping是你武器库中应有的“瑞士军刀”之一。Hping是一个命令行的数据包操纵和传输工具。它支持各种各样的协议,反应非常快且直观。

官网:Hping - Active Network Security Tool

13. Domain Dossier

如果你需要查询域名或IP地址的注册信息,那么Domain Dossier正合你意。它快速、简单、有效。

官网:Domain Dossier - Investigate domains and IP addresses, get owner and registrar information, see whois and DNS records

14. Perl和Python

Perl和Python虽然不是工具,但却是值得留意的脚本语言。当你熟练于数据包分析时,你会遇到没有自动化工具满足要求的情况。

在那些情况下,首选Perl和Python语言编写工具,它们可以带你在数据包上做些有趣的事情。对于大部分应用程序,我通常使用Python,但这只是个人选择。

2、数据包分析资源

从Wireshark的主页到教程、博客,有很多可用的数据包分析资源。我将在此列出我最喜欢的一些。

1. Wireshark主页

与Wireshark有关的首要资源就是它的主页。主页包括软件文档、一个非常有用的包含了捕获文件样例的wiki,以及Wireshark邮件列表的注册信息。

官网:

Wireshark · Go Deep.

Chappell University | Wireshark Training

2. SANS安全入侵检测深入课程

该课程由我的两位数据包分析英雄Mike Poor和Judy Novak讲授。它每年提供好几次直播。若你的旅行经费有限,没关系,该课程也通过基于Web的按需格式在线讲授。

官网:Cyber Security Training | SANS Courses, Certifications & Research

3. IANA

互联网编号分配机构(Internet Assigned Numbers Authority,IANA)负责监督为北美分配IP地址和协议号码。

它的网站提供了一些有价值的参考工具,比如查找端口号、查看有关*域名的信息,以及浏览合作以网站查阅RFC文档。

四、常见的网络设备流量监听方式

1、网络协议

现代网络是由多种运行在不同平台上的异构系统所组成的。为了帮助它们之间相互通信,我们使用了一套共同的网络语言,并称之为协议。常见的网络协议包括传输控制协议(TCP)、互联网协议(IP)、地址解析协议(ARP)和动态主机配置协议(DHCP)。协议栈是由一组协同工作网络协议的逻辑组合而成的。 

网络协议是基于它们在行业标准OSI参考模型中的职能进行分层的。OSI模型将网络通信过程分为七个不同层次,如图所示。

网络工具Netwox和Wireshark详解

顶端的应用层表示用来访问网络资源的实际程序。底层则是物理层,通过它来进行实际的网络数据传播。每一层次上的网络协议共同合作,来确保通信数据在协议上层或下层中得到妥善处理。 

应用层(Application layer, 第7层):OSI参考模型的最上层,为用户访问网络资源提供一种手段。这通常是唯一一层能够由最终用户看到的协议,因为它提供的接口,是最终用户所有网络活动的基础。

表示层(Presentation layer, 第6层):这一层将接收到的数据转换成应用层可以读取的格式。在表示层完成的数据编码与解码取决于发送与接收数据的应用层协议。表示层同时进行用来保护数据的加密与解密等操作。

会话层(Session layer, 第5层):这一层管理两台计算机之间的对话(会话),负责在所有通信设备之间建立、管理和终止会话连接。会话层还负责以全双工或者半双工的方式来创建会话连接,在通信主机间关闭连接,而不是粗暴地直接丢弃。

传输层(Transport layer, 第4层):传输层的主要目的是为较低层提供可靠的数据传输服务。通过流量控制、分段/重组、差错控制等机制,传输层确保网络数据端到端的无差错传输。因为要确保可靠的数据传输其过程极为烦琐,所以OSI参考模型将其作为完整的一层。传输层同时提供了面向连接和无连接的网络协议。某些防火墙和代理服务器也在这一层工作。

网络层(Network layer, 第3层):这一层负责数据在物理网络中的路由转发,是最复杂的OSI层之一。它除了负责网络主机的逻辑寻址(例如通过一个IP地址),还处理数据包分片和一些情况下的错误检测。路由器在这一层上工作。

数据链路层(Data link layer, 第2层):这一层提供了通过物理网络传输数据的方法,其主要目的是提供一个寻址方案,可用于确定物理设备(例如MAC地址)。网桥和交换机是工作在数据链路层的物理设备。

物理层(Physical layer, 第1层):OSI参考模型的底层是传输网络数据的物理媒介。这一层定义了所有使用的网络硬件设备的物理和电气特性,包括电压、集线器、网络适配器、中继器和线缆规范等。

物理层建立和终止连接,并提供一种共享通信资源的方法,将数字信号转换成模拟信号传输,并反过来将接收模拟信号转换回数字信号。

2、数据流向

在网络上传输的初始数据首先从传输网络的应用层开始,沿着OSI参考模型的七层逐层向下,直到物理层。在这一层传输网络物理媒介会将数据发送到接收系统。接收系统从它的物理层获取到传输数据,然后向上逐层处理,直到最高的应用层。

OSI模型中的每层都只能直接与它的上层或下层协议通信。比如第二层只能从第一层和第三层中发送或接收数据。

在OSI模型任意层上,由不同协议提供的服务都不是多余的。例如,如果某层上的一个网络协议提供了一种服务,那么其他任何层上的协议都不会提供与之完全相同的服务。在不同层次的协议可能有类似目标的功能,但它们会是以不同的方式来实现。

在对应层次上,发送和接收的网络协议是相互配合的。比如,发送系统在第7层的某个协议负责对传输数据进行编码封装,那么往往在接收系统的第7层有着相应的网络协议,负责对网络数据进行解码读取。

网络工具Netwox和Wireshark详解

由图可知,通信数据会从一个通信端的顶部流向底部,然后当它到达另一通信端时,将反向从底部流向顶部。 

3、数据封装

OSI参考模型不同层次上的协议在数据封装的帮助下进行通信传输。协议栈中的每层协议都负责在传输数据上增加一个协议头部或尾部,其中包含了使协议栈之间能够进行通信的额外信息。

例如,当传输层从会话层接收数据时,它会在将数据传递到下一层之前,附上自己的头部信息数据。

数据封装过程将创建一个协议数据单元(PDU),其中包括正在发送的网络数据,以及所有增加的头部与尾部协议信息。随着网络数据沿着OSI参考模型向下流动,PDU逐渐变化、增长,各层协议均将其头部或尾部信息添加进去,直到物理层时达到其最终形式,并发送给目标计算机。接收计算机收到PDU后,沿着OSI参考模型往上处理时,逐层剥去协议头部和尾部,当PDU到达OSI参考模型的最上层时,将只剩下原始传输数据。

OSI参考模型使用特别的术语来描述每一层的数据。物理层叫比特,数据链路层叫帧,网络层叫数据包,传输层叫数据段。最上面的三层可以统称数据,但这些叫法实际上用得并不多,我们一般会使用报文来表示一个完整或部分PDU,该PDU从多个OSI参考层中包含了表头和表尾信息。

网络工具Netwox和Wireshark详解

我们通过一个实际的例子来理解数据的封装过程,这个例子描述了数据包是如何在OSI参考模型中被创建、传输和接收的。

假设这样一个情形:我们试着在计算机上浏览Google。在这个过程中,我们必须首先产生一个请求数据包,从客户端计算机传输到目标服务器上。

这里我们假设TCP/IP通信会话已经被建立,下图展示了此案例中的数据封装处理过程。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

我们从客户端计算机的应用层开始,在我们浏览一个网站时,所使用的应用层协议是HTTP,通过此协议发出请求命令,从Google下载index.html文件。

在实践中,浏览器会向网站的根目录文件发出请求,通常使用正斜杠(/)来表示。当Web服务器接收到该请求时,它会根据服务器的网页根目录设定对浏览器重定向。根目录文件名通常是index.html或index.php。

应用层协议发送出指令后,我们就开始关心数据包是如何被发送到目的地的。数据包中的应用层数据将沿着OSI参考模型的协议栈传递给传输层。HTTP是一个使用TCP(或在TCP协议之上)的应用层协议,因此传输层将使用TCP协议来确保数据包的可靠投递。

一个包括序列号和其他数据的TCP协议头部将被创建,并添加到PDU中,如上图所示。该TCP表头包含了序列号和其他信息,以确保数据包能够被正确交付。

我们常说一个协议在其他协议之上,是因为OSI参考模型的分层设计。例如HTTP等应用层协议提供了一个特定的服务,并依靠TCP协议来保证服务的可靠交付。正如你学习到的,DNS协议架构于UDP之上,而TCP架构在IP之上。

在完成这项工作之后,TCP协议将数据包交给IP协议,也就是在第3层上负责为数据包进行逻辑寻址的协议。IP协议创建一个包含有逻辑寻址信息的头部,并将数据包传递给数据链路层上的以太网协议,然后以太网物理地址会被添加并存储在以太网帧头中。现在数据包已经完全组装好并传递给物理层,在这里数据包通过0、1信号完成通过网络的传输。

封装好的数据包将穿越网络线缆,最终到达Google的Web服务器。 Web服务器开始从下往上读取数据包,这意味着它首先读取数据链路层,从中提取到所包含的物理以太网寻址信息,确定数据包是否是发往这台服务器的。一旦处理完这些信息,第2层头部与尾部的信息将被剥除,并进入到第3层的信息处理过程中。

第3层IP寻址信息会被读取,以便确认数据包被正确转发,以及数据包并未进行分片处理。这些信息也同样被剥除,并交到下一层进行处理。

第4层TCP协议信息现在被读取,以确保数据包是按序到达的。然后第4层报头信息被剥离,留下的只有应用层数据。这些数据会被传递到Web服务器应用程序。为了响应客户端发过来的这个数据包,服务器应该发回一个TCP确认数据包,使客户端知道它的请求已经被接收,并可以等待获取 index.html文件内容了。

网络工具Netwox和Wireshark详解

所有数据包都会以这个例子中描述的过程进行创建和处理,而无论使用的是哪种协议。

但同时,请牢记并非每个网络数据包都是从应用层协议产生的,所以你会进一步看到只包含第2层、第3层或第4层协议信息的数据包。

4、网络硬件

1. 集线器

因为集线器产生很多不必要的网络流量,并仅在半双工模式下运行(不能在同一时间发送和接收数据),所以你通常不会在现代或高密度的网络中再看到它们的身影了(用交换机来代替)。

一个集线器无非就是工作在OSI参考模型物理层上的转发设备。它从一个端口接收到数据包,然后将数据包传输(中继)到设备的每个端口上。

例如,如果一台计算机连接到一个4端口集线器的1号端口上,需要发送数据到连接在2号端口的计算机,那么集线器将会把数据发送给端口2、3、4。连接到3号端口与4号端口上的客户端计算机通过检查以太网帧头字段中的目标媒体访问控制(MAC)地址,判断出这些数据包并不是给它们的,便丢弃这些数据包。

从计算机A发送数据到计算机B的例子,当计算机A发送出数据时,所有连接到集线器的计算机都将接收到数据,但只有计算机B会实际将数据接收下来,而其他计算机则将丢弃它。

总之,集线器工作在半双工模式,即可能同时发送和接收数据,会将数据包广播到所有集线器端口,适合用于抓包。

2. 交换机

功能与集线器相同,都是用来转发数据包的。但与集线器不同的是,交换机并不是将数据广播到每一个端口,而是将数据发送到目的计算机所连接的端口上。

交换机在处理传输数据包时,经常会提供一些先进的功能。为了能够直接与一些特定设备进行通信,交换机必须能够通过MAC地址来唯一标识设备,这意味着它们必须工作在OSI参考模型的数据链路层上。

交换机将每个连接设备的2层地址都存储在一个CAM(Content Addressable Memory:内容寻址寄存器)表中,CAM表充当着一种类似交通警察的角色。当一个数据包被传输时,交换机读取数据包中的第2层协议头部信息,并使用CAM表作为参考,决定往哪个或哪些端口发送数据包。交换机仅仅将数据包发送到特定端口上,从而大大降低了网络流量。

计算机A发送数据到唯一的目标:计算机B,虽然同一时间里网络上可能有很多会话,但信息将会直接通过交换机和目标接收者进行传输,而不会被传递到交换机和所有连接计算机之间。

3. 路由器

路由器是一种比交换机或集线器具有更高层次功能的先进网络设备。一个路由器可以有许多种不同的形状和外形,但大多数路由器在正前方的面板上会有几个LED指示灯,在背板上会有一些网络端口,个数则取决于网络的大小。

路由器工作在OSI参考模型的第3层,它们负责在两个或多个网络之间转发数据包。路由器在网络间引导数据包的流向,这一过程被称为路由。几种不同类型的路由协议定义了不同目的的数据包如何被路由到其他网络。路由器通常使用第3层地址(如IP地址)来唯一标识网络上的设备。

为了更清楚地解释路由的概念,我们以一个拥有几条街道的街区进行类比。假设有一些房子,它们都有着自己的地址,就像网络上的计算机一样,而每条街道就如同网段。

从你所在街道上的某个房子,你可以很容易地与同一街道中居住的邻居进行沟通交流,这类似于交换机的操作,能够允许在同一网段中的所有计算机进行相互通信。然而,与其他街道上居住的邻居进行沟通交流,就像是与不同网段中的计算机进行通信,必须经由路由器路由到指定网络上,然后再经过连接目的网段的路由器,才可以到达目标网段。

网络上的路由器的数量与大小通常取决于网络的规模与功能。个人和家庭办公网络可能只需要一个放置在网络中心的小型路由器。而大型企业网络则可能有几个路由器分布在不同的部门,它们都连接到一个大型的*路由器或三层交换机上(具有内置功能,可以充当一台路由器的先进型交换机)。

当你开始查看越来越多的网络图时,就会更加了解网络数据流是如何流经这些不同类型的网络设备节点的,下图显示了路由网络中的一个很常见的布局形式。

网络工具Netwox和Wireshark详解

在这个例子中,两个单独的网络通过一个路由器进行连接。如果网络A上的计算机希望与网络B上计算机进行通信,则传输数据将必须通过路由器。

5、流量类型

网络流量可以分为3大类:广播、组播和单播。每个分类都具有不同的特点,决定着这一类的数据包该如何通过网络硬件进行处理。

1. 广播流量

广播数据包会被发送到一个网段上的所有端口,而不管这些端口连接在集线器还是交换机上。但并非所有的广播流量都是通过相同方式构建的,而是包括第2层广播流量和第3层广播流量两种主要形式。例如,在第2层,MAC地址FF:FF:FF:FF:FF:FF是保留的广播地址,任何发送到这一地址的流量都将会被广播到整个网段。第3层也有着一些特定的广播地址。

在一个IP网络范围中最大的IP地址是被保留作为广播地址使用的。例如,在一个配置了192.168.0.XXX的IP范围,子网掩码是255.255.255.0的地址网络中,广播IP地址是192.168.0.255。

在通过多个集线器或交换机连接多种媒介的大型网络中,广播数据包将从一个交换机一直被中继到另一交换机上,从而传输到网络连接的所有网段上。广播数据包能够到达的区域被称为“广播域”,也就是任意计算机可以不用经由路由器即可和其他计算机进行直接传输的网段范围。

下图显示了一个小型网络上存在两个广播域的例子。因为每个广播域会一直延伸到路由器,所以广播数据包只在它特定的广播域中流通。

网络工具Netwox和Wireshark详解

总之,广播包被发送到一个网段上所有端口,二层广播地址是 FF:FF:FF:FF:FF:FF,三层广
播地址是主机地址为 255 的 IP 地址;路由器可以分割广播域。 

2. 组播流量

组播是一种将单一来源数据包同时传输给多个目标的通信方式。组播的目的是简化这个过程,并使用尽可能少的网络带宽。组播流量通过避免数据包的大量复制来达到优化效果,而对组播流量的处置方式则高度依赖于不同网络协议的实现细节。

实施组播的主要方法是通过一种将数据包接收者加入组播组的编址方案实现的,这也是IP组播的工作原理。这种编址方案确保数据包不会被传送到未预期的目的地。事实上IP协议将一整段的地址都用于组播,如果你在网络上看到224.0.0.0~239.255.255.255的IP地址,那么它很有可能就是组播流量。

3. 单播流量

单播数据包会从一台计算机直接传输到另一台计算机。单播机制的具体实现方式取决于使用的协议。

例如,一台设备希望与一个Web服务器进行通信,这便是一个端到端的连接,所以通信过程将由客户端设备发送数据包到这台Web服务器开始,这种类型的通信就是单播流量的典型例子。

6、监听网络

进行高效的数据包分析的一个关键决策是在哪里放置数据包嗅探器,以恰当地捕捉网络数据。数据包分析师通常把这个过程称为监听网络线路。简而言之,这是将数据包嗅探器安置在网络上恰当物理位置的过程。

然而不幸的是,嗅探数据包并不像是将一台笔记本电脑连入网络那么简单。事实上,有些时候,在网络布线系统上放置一个数据包嗅探器,要比实际分析数据包更难一些。

安置嗅探器的挑战是要考虑到种类繁多的用来连接网络的硬件设备,由于网络上主要的3种设备(集线器、交换机、路由器)对网络流量的处理方式都不相同,因此你必须非常清楚你所分析网络使用的是哪些硬件设备。 

交换式网络环境中进行数据包嗅探的指导准则:

网络工具Netwox和Wireshark详解

捕获流量的最佳方法: 

网络工具Netwox和Wireshark详解

1. 混杂模式

 混杂模式是一种允许网卡能够查看到所有流经网络线路数据包的驱动模式。

 网络上有一类广播流量,因此对于客户端来说,接收到并非以它们的地址作为目标的数据包是很常见的。用来对给定IP地址解析对应MAC地址的ARP协议(在任何网络上都是一个关键组成部分)便是一个很好的例子,它能够说明有些网络流量并非是发送到指定的目标地址。为了找到对应的MAC地址,ARP协议会发送一个广播包发出到广播域中的每个设备,然后期望正确的客户端将做出回应。

一个广播域(也就是一个网络段,其中任何一台计算机都可以无须经过路由器,直接传送数据到另一台计算机)是由几台计算机组成的,但广播域中仅仅只有一台客户端应该对传输的ARP广播请求包感兴趣。而一旦网络上的每台计算机都处理和回应ARP广播包的话,那么网络的性能将变得非常的糟糕。

因此,其他网络设备上的网卡驱动会识别出这个数据包对于它们来说没有任何用处,于是选择将数据包丢弃,而不是传递给CPU进行处理。将目标不是这台接收主机的数据包进行丢弃可以显著地提高网络处理性能,但这对数据包分析师来说并不是个好消息。

我们通常需要看到线路上传输的每一个数据包,这样我们才不用担心会丢失掉任何关键的信息。我们可以使用网卡的混杂模式来确保能够捕获所有的网络流量。

一旦工作在混杂模式下,网卡将会把每一个它所看到的数据包都传递给主机的处理器,而无论数据包的目的地址是什么。一旦数据包到达CPU,它就可以被一个数据包嗅探软件捕获并进行分析。

现在的网卡一般都支持混杂模式,Wireshark软件包中也包含了libpcap / WinPcap驱动,这让你能够很方便地在Wireshark软件界面上就将网卡直接切换到混杂模式上。

7、监听集线器流量

流经集线器的所有网络数据包都会被发送到每一个集线器连接的端口。

网络工具Netwox和Wireshark详解

流经集线器的所有网络数据包都会被发送到每一个集线器连接的端口。因此,要想分析一台连接到集线器上的计算机的网络通信,你所需要做的所有事情就是将数据包嗅探器连接到集线器的任意一个空闲端口上。这样你就能看到所有从那台计算机流入流出的网络通信,以及其他接入集线器的所有计算机之间的通信。 

然而对我们来说不幸的消息是,集线器网络已经是非常罕见的了,因为它们曾经给网络管理员们带来了很大的困扰,而且已经被基本淘汰了。因为在集线器网络中,在任意时刻里,只有一个设备可以通信。因此,通过集线器连接的设备必须与其他设备进行竞争,才能取得带宽来进行通信,当两个或多个设备同时通信时,数据包就会产生冲突碰撞。

结果可能是丢包,然后通信设备需要承受重新传输数据包所带来的性能损失,而这又增加了网络拥塞和碰撞。当通信流量水平和碰撞概率增加时,设备需要传输每个数据包3次甚至4次,这大大降低了网络性能。因此很容易理解为什么现在各种规模的网络都已经转而使用交换机了。虽然在现代网络中你很难再碰到集线器了,但在一些支持老旧或特殊设备的网络里,比如工业控制系统(ICS)网络中,你仍有可能遇到它们。

要辨别一个网络中是否有集线器,一个简单的方法就是去机房观察网络机柜。当你认不出来的时候,只需在服务器机框最黑暗的角落寻找网络硬件,并且上面有一些积灰。

8、监听交换机流量

当将嗅探器连接到交换机上的一个端口时,你将只能看到广播数据包,及由你自己电脑传输与接收的数据包。

有四种监听方式:端口镜像、集线器输出(hubbing out)、使用网络分流器、ARP欺骗攻击。

网络工具Netwox和Wireshark详解

1. 端口镜像

端口镜像也许是在交换式网络中捕获一个目标设备所有网络通信最简单的方法了。为了使用端口镜像,你必须能够通过命令行或Web管理界面来访问目标设备所连接的交换机。此外,这个交换机还必须支持端口镜像的功能,并且有一个空闲的端口,让你可以插入你的嗅探器。

要启用端口镜像,你需要发出一个命令,来强制交换机将一个端口上的所有通信都镜像到另一端口上。例如,为了捕获交换机3号端口连接的一台设备发出的所有流量,你只需要简单地将你的嗅探分析器接入4号端口,然后将3号端口镜像复制到4号端口,这就可以让你看到目标设备所传输与接收的所有网络流量了。

网络工具Netwox和Wireshark详解

设置端口镜像的具体方法取决于不同的交换机制造商。对于大多数的交换机,你需要登录到命令行界面,然后输入端口镜像命令。设置连接的交换机的端口镜像功能,将交换机其他一个或多个端口的经过的数据包复制一份到嗅探器连接的端口上。

网络工具Netwox和Wireshark详解

在进行端口镜像时,需要留意被镜像端口的流量负载。有些交换机厂商允许你将多个端口的流量镜像到一个单独端口上,这在分析一个交换机上两个或多个设备的网络通信时,可能是非常有用的。然而,这是我们使用一些简单的算术来考虑会发生什么事情。

比如你有一个24端口交换机,你将23个全双工的100Mbit/s端口流量都镜像到一个端口上,那么在这个端口上可能会有4600Mbit/s的流量。由于这将会远远超出一个单独端口的物理承受能力,因此在网络流量达到一定级别后,将可能会导致数据包丢失,甚至网络速度变慢。在这种情况下,交换机会丢弃所有多余的数据包,或者甚至“暂停”内部交换电路,从而造成通信中断的情况。当你开始执行你的数据包捕获时,请务必小心,不要让这种情况在你的网络中发生。

在企业网络或有持续网络流量安全监控需求的场景里,端口镜像功能看起来是一个吸引人的、低成本的解决方案。但是,该方案对于一些应用通常并不靠谱。特别是在高吞吐量级别的环境下,端口镜像可能会产生不稳定的结果,并且造成无法追踪的数据丢失。对于这种情况,建议使用分流器。

2. 集线器输出

在目标设备和交换机间插接一个集线器,嗅探器也接在集线器上,在交换机不支持端口镜像时可使用此方法。

网络工具Netwox和Wireshark详解

许多人认为集线器输出根本就是一种作弊方法,不过,它在你不能进行端口镜像但仍对目标设备接入的交换机有着物理访问的时候,真的是一个完美的解决方案。为了进行集线器输出,你所需要的就是一个集线器和几根网线。

在你找齐了硬件之后,就可以按照如下操作步骤进行连接了:

  1. 找到目标设备所连接的交换机,并将目标设备连接网线从交换机上拔掉。
  2. 将目标设备的网线插入到你的集线器上。
  3. 使用另一根网线,将你的嗅探分析器也连接到集线器上。
  4. 从你的集线器连接一根网线到交换机上,将集线器连接到网络上。

现在你已经将目标设备和你的嗅探分析器连接到了同一个广播域中,所有从你的目标设备流入流出的网络流量都将在集线器中广播,从而让你的嗅探分析器可以捕获到这些数据包,如图所示。 

网络工具Netwox和Wireshark详解

在大多数情况下,集线器输出会将目标设备的全双工变成半双工。尽管这种方法并不是进行网络线路监听最彻底的方法,但在交换机不支持端口镜像时它可能是你唯一的选择。但是,请记住的是,你的集线器同样需要一个电源线连接,而某些情况下你却很难找到。

注意:

 当进行集线器输出时,你需要确保你使用的设备是一个真正的集线器,而不是虚假标记的交换机。有几家网络硬件厂商有着营销的坏习惯,会把一些低级别的交换机当作集线器进行出售。如果你使用的并不是一个可信的经过测试的集线器,那么你将只会看到你自己的流量,而不是目标设备的流量。

当你找到一个集线器时,需要对它进行测试,来确保它确实是一个集线器。如果是的话,它绝对是值得你收藏的了!确定一个设备是否真的是集线器的最好方法,就是连上两台电脑,然后看这两台电脑是否能嗅探对方与网络其他设备之间的网络通信。如果能监听到的话,那它就是一款真正的集线器了。

3. TAP

TAP(Test Access Point),常见称呼网络分流器,还有人叫它NPB (Network Packet Broker),或者汇聚分流器。其核心功能就是架设于生产网络镜像口和分析设备集群之间,将一台或者多台生产网络设备镜像出来的流量汇聚后,分发到一台或者多台数据分析设备。

网络分流器是一个硬件设备,你可以将它放置在网络布线系统的两个端点之间,来捕获这两个端点之间的数据包。与集线器输出类似,在网络上放置一个硬件,就可以捕获你所需要的数据包。所不同的是,这次你并不是使用集线器,而是使用一个专门为了网络分析而设计的特殊硬件。

网络分流器又分为2种基本类型:有聚合的和非聚合,都是安置在两个设备间来嗅探所有流经的网络通信,聚合的是三个端口,非聚合的是四个端口。 

网络工具Netwox和Wireshark详解

网络分流器通常还需要一个电源连接,但也有一些是带电池的,它们不需要插入电源插座就可以进行短暂的数据包嗅探。

1)聚合的网络分流器

聚合的网络分流器的使用方法是较简单的。它只有一个物理的流量监听口,来对双向通信进行嗅探。

为了使用聚合的网络分流器来捕获接入交换机的单台计算机的所有流量,你只需要按照如下步骤进行操作。

  1. 从交换机上拔下目标计算机的网线。
  2. 将连接目标计算机网线的另一端插入到网络分流器的“in”端口中。
  3. 将另一根网线的一端插入到网络分流器的“out”端口,并将另一端插入到网络交换机。 
  4. 将最后一根网线的一端插入网络分流器的“Monitor”端口,并将另一端插入到你作为嗅探器使用的电脑上。

聚合网络分流器的连接应该如图下所示的那样,一旦连好之后,你的嗅探器就能够捕获到你接入网络分流器的所有网络流量。

网络工具Netwox和Wireshark详解

2) 非聚合的网络分流器

非聚合的网络分流器比起聚合的稍微复杂一些,但它在进行流量捕获时有着更好的灵活性。与聚合网络分流器仅仅只有一个监听端口来嗅探双向通信流量不同的是,非聚合的网络分流器有着两个监听端口。一个监听端口用来嗅探流出方向的网络流量(从电脑连接到分流器的方向),另一个监听端口用来嗅探流入方向的网络流量(从分流器端口到电脑的方向)。

为了捕获连接交换机的计算机的所有网络流量,你则需要按照如下步骤进行配置。

  1. 从交换机上拔下计算机连接网线。
  2. 将网线的一端插入计算机,另一端插入到网络分流器的“in”端口上。
  3. 将另一根网线的一端插入到网络分流器的“out”端口,然后将另一端插入到网络交换机上。
  4. 将第三根网线插入到网络分流器的“Monitor A”端口,并将另一端插入到你作为嗅探器使用电脑的一块网卡接口上。
  5. 将最后一根网线插入到网络分流器的“Monitor B”端口,并将另一端插入到你作为嗅探器使用电脑的第二块网卡接口上。

非聚合网络分流器的连接方式如图所示:

网络工具Netwox和Wireshark详解

虽然以上的例子容易让你产生一种错觉,就好像你只能使用分流器监听一台设备,但实际上你可以通过合理的规划,把分流器放置在合适的位置,将其用来捕获多台设备的流量。

例如,如果想在因特网上监听两个网络之间的流量,你需要将集线器串联在所有设备相连的交换机和网络上层路由器之间。这样的放置方式可以让你收集到所有你想要的流量。这种策略常常在安全监控中用到。

3)选择一款网络分流器

网络分流器拥有两种不同的类型,那么哪种会更好一些呢?在大多数情况下,聚合的网络分流器是首选,因为它们需要较少的网线,同时在嗅探器计算机上也不需要两块网卡。然而,在你需要捕获高带宽的流量,或是只需要关注一个方向上的流量时,非聚合的网络分流器会更加适用。

业绩知名的TAP厂商有big switch、brocade、Gigamon、VSS等等,处理速率从1G和10 G逐渐上升到40G和100G。

当然,除了上述常见的几种跟数据包采集相关的硬件外,还有诸如分光器之类的其它硬件,这里不再一一列举和细述。

4. ARP欺骗

通过发送包含虚假 MAC 地址的 ARP 消息,劫持其他计算机流量的过程,它是交换式网络中进行监听的高级技术。它通常由攻击者使用,向客户端系统发送虚假地址的数据包,来截获特定的网络流量,或者对目标进行拒绝服务攻击(DoS)。然而,它也可以是一种在交换式网络中捕获目标系统数据包的方法。

网络工具Netwox和Wireshark详解

1)ARP查询过程

我们介绍了OSI参考模型中在第2层与第3层上数据包寻址的两种主要方式。这些第2层地址,或称为MAC地址,无论你在使用哪种第3层寻址方案,都会与之协同工作。

按照行业标准术语,我们将第3层寻址方案称为IP寻址系统。网络上的所有设备相互通信时在第3层上均使用IP地址。由于交换机在OSI模型的第2层上工作,它们只识别第2层上的MAC地址,因此网络设备必须在它们创建的数据包中包含这些信息。当这些设备在不知道通信对方的MAC地址时,必须要通过已知的第3层IP地址来进行查询,这样才可能通过交换机将流量传递给相应的设备。

这些翻译过程就是通过第2层上的ARP协议来实施的。连接到以太网网络上计算机的ARP查询过程,是从一台计算机想要与另一台进行通信时开始的。发起通信的计算机首先检查自己的ARP缓存,查看它是否已经有对方IP地址对应的MAC地址。

如果不存在,它将往数据链路层广播地址FF:FF:FF:FF:FF发送一个ARP广播请求包,作为一个广播数据包,它会被这个特定的以太网广播域上的每台计算机接收,这个请求包问道:“某某IP地址的MAC地址是什么?”

没有匹配到目标IP地址的计算机会简单地选择丢弃这个请求包。而目标计算机则选择答复这个数据包,通过ARP应答告知它的MAC地址。此时,发起通信的计算机就获取到了数据链路层的寻址信息,便可以利用它与远端计算机进行通信,同时将这些信息保存在ARP缓存中,来加速以后的网络访问。

 2)ARP欺骗是如何工作的

ARP缓存污染,有时也被称为ARP欺骗,是一种在交换网络中监听流量的高级方法。这种方法通过发送包含虚假MAC地址(第二层)的ARP消息,来劫持其他计算机的流量。

3)使用Cain&Abel软件进行ARP欺骗

当试图进行ARP缓存污染时,第一步你需要获得一些必要的工具来搜集相关信息。在我们的演示中,我们将使用一款流行的安全工具Cain & Abel,可以从oxid.it下载获得。这款软件也支持Windows系统。你可以根据网站上的指引,来下载和安装这款软件。

在使用Cain & Abel软件之前,你需要收集某些信息,包括嗅探分析器系统的IP地址,你所希望嗅探网络流量的远程计算机的IP地址,以及远程计算机所连接的上游路由器。

当第一次打开Cain & Abel软件时,你会发现在软件窗口的顶端有着一系列的标签页(ARP缓存污染攻击只是强大的Cain & Abel软件的其中一个功能)。

为了演示例子,我们将切换到“嗅探器”选项页上。当单击此选项卡时,你应该会看到一个空表,如图所示。

网络工具Netwox和Wireshark详解

要完成此表,你需要激活这款软件的内置嗅探器,扫描你的网络并找出活跃主机。

请按以下步骤进行操作以完成上述目标:

  1. 单击工具栏上左起第二个图标,类似网卡形状的那个。
  2. 你会被要求选择你希望进行嗅探的网络接口。这个接口应该连接到你所希望进行ARP缓存污染的网络。选择这个网络接口,然后点击OK按钮。(要确保按下这个按钮,以激活Cain & Abel软件内置的嗅探器。) 
  3. 要建立在你的网络上可用主机的列表,单击加号(+)图标。MAC地址扫描器对话框将会出现,如下图所示。请选择“All hosts in my subnet”圆形按钮(或者选择特定的地址范围),单击OK继续。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

一些Windows 10用户报告Cain & Abel无法确定他们的网络接口的IP地址,因此无法完成这个过程。如果您有这个问题,那么在配置网络接口时,您将看到接口的IP地址是0.0.0.0。

可采取以下步骤解决:

  1. 如果Cain & Abel是打开的,请关闭它。
  2. 在桌面搜索栏输入ncpa.cpl,打开网络连接对话框。
  3. 右键单击要嗅探的网络界面,并单击Properties。
  4. 双击Internet Protocol Version 4(TCP/IPv4)。
  5. 单击Advanced按钮并选择DNS选项卡。
  6. 选择Use this connection’ s DNS suffix in DNS registration旁边的复选框来激活它。
  7. 单击OK退出打开的对话框,重新启动Cain & Abel。

现在表格中应该填满了你所在网络中的所有主机的信息,包括它们的MAC地址、IP地址和供应商信息等。这是你开始进行ARP缓存污染的目标主机列表。

在程序窗口的底部,你应该会看到另一组选项卡,选择它们将带你到嗅探器标题下的其他窗口。现在,你已经创建了主机列表,接下来可以单击ARP选项卡切换至ARP窗口中。

在ARP窗口中,你会看到两个空的表格。当你完成下面的操作步骤之后,上方的表格中将显示出你的ARP缓存污染过程涉及的设备列表,而下方表格则会显示出在你进行中毒攻击的计算机之间的所有通信内容。

进行ARP缓存污染攻击,请按照下列步骤进行操作。

(1)在屏幕上方的空白区域中单击,然后单击程序标准工具栏中的加号( +)图标。

(2)出现的单窗口中会有两个选择栏。在左侧,你可以看到网络上的所有活跃主机的列表。单击你希望进行网络流量嗅探的目标系统IP地址,右边的选择栏中将会显示出网络中的所有主机列表,除了你所选择的目标主机IP地址。

(3)在右边的选择栏中,单击目标计算机的直接上游路由器(即网关)IP地址,如图所示,然后单击“OK”。这两个设备的IP地址现在应该会被显示在主程序窗口上方的表格中。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

(4)完成这个过程的最后一步,单击标准工具栏中黄黑相间的辐射符号,这个操作将激活Cain & Abel软件的ARP缓存污染功能。让你的嗅探分析器作为从目标系统到它的上游路由器之间所有通信的中间人。

这时就可以用 Wireshark 来抓包进行数据包分析了。当你完成流量捕获之后,只需再次单击黄黑相间的辐射图标,便可以停止ARP缓存污染过程。 

网络工具Netwox和Wireshark详解

注意:

作为ARP缓存污染过程的最后警示,你必须要非常清楚实施这个过程中每个系统的角色与作用。在目标设备拥有很高的网络利用流量时,比如说一台有着1Gbit/s联网线路的文件服务器,不要使用这项技术(尤其当你的嗅探分析系统只提供了一条100Mbit/s的链路)。

当你使用这个例子中演示的这项技术对网络流量进行重路由时,所有目标系统发送和接收的流量都必须先通过你的嗅探分析系统,因此,你的嗅探分析系统可能成为整个通信过程中的瓶颈。这种流量重路由会对你进行分析的系统造成一种拒绝服务攻击式的影响,将导致网络性能下降以及分析数据不完备。 

 可以使用一个被称为非对称路由的功能,来避免所有的网络流量经过你的嗅探分析器。

9、监听路由器流量

在处理涉及多个网段与路由器的问题时,需要将嗅探器移动到不同的位置上,才获得一个完整的网络拓朴。

在网络数据必须经过多个路由器的情况下,在各个路由器上分析网络流量是非常重要的。举例来说,考虑你很可能会遇到的一个场景,在网络中由几个路由器将几个网络分段连接在一起。在这个网络中,每个网段与上游网段进行通信,来获取和存储数据。

如图所示,我们要解决的一个故障问题:一个下游子网D,无法与网络A中的任何设备进行通信。

网络工具Netwox和Wireshark详解

如果在存在故障问题的网络D中嗅探流量,你可以清楚地看到数据包被传输到了其他网段,但你可能看不到回来的数据包所说的“一会儿回来”。如果你重新考虑你的嗅探器部署位置,在网络D的直接上游网段(网络B)中开始嗅探,那么你将会有一个关于故障更清晰的视图。

此时,你可能会发现,来自网络D的流量被丢弃了,或是被网络B的路由器错误地路由了。

终,这会导致路由器配置问题,如果得到纠正,那么便会解决掉你的大麻烦。虽然这个场景有点宽泛,但其中的精髓是,在处理涉及多个网段与路由器的问题时,可能需要将你的嗅探器移动到不同的位置上,才能获得一个完整的网络画面。

这是一个很好的例子,它说明了为什么往往需要在不同的网段中对多个设备流量进行嗅探,才能很快地诊断出故障的根本原因。

在关于网络布局的讨论中,我们已经研究了好几种不同的“网络地图”。“网络地图”,或称为网络拓扑图,是一个显示了网络中所有技术资源以及它们之间连接关系的图形表示。

在决定你的数据包嗅探器安置位置时,没有比拿着一张“网络地图”来进行分析更好的办法了。如果你有一张“网络地图”,请把它保留在手边,它在故障排除和分析过程中,都会是一份宝贵的资产。建议对你自己的网络画出一份详细的“网络地图”。请记住在大多数时候,排除故障一半以上的工作,都集中在收集正确的网络数据上。

10、企业级流量数据采集系统部署

​通常情况下,专业的网络流量分析设备部署在靠近监控的线路旁,监控方法是通过从交换机把流量镜像,然后把镜像的流量导入到设备里分析。

为实现全面的链路和应用监控,常见的数据采集方式有2种:

1. ​多层应用架构环境

用户环境由多个设备组成的多层架构应用环境中,数据源来自多台网络设备,需要汇聚数据,然后接入到性能分析设备。

网络工具Netwox和Wireshark详解

2. 单一应用架构环境

当应用架构较为集中时,数据源可从少量设备镜像获得,只需在对应设备进行镜像设置,然后将镜像流量接入性能分析设备。

网络工具Netwox和Wireshark详解

专业流量分析系统支持多种原始数据存储方式,针对不同的应用,可选择是全包存储,还是截取包头一部分存储。

同时,所有的分析数据以动态聚合的方式,长期保存在设备中。

五、数据包捕获与保存

当进行数据包分析的时候,你会发现很大一部分分析工作是在捕获数据包之后进行的。通常情况下,你会在不同时间进行多次捕获,将结果保存下来,然后一起进行分析,所以Wireshark允许你保存捕获文件,以便之后分析,你也可以将多个捕获文件进行合并。

1、保存和导出捕获文件

如果想要保存数据包的捕获,那么可以选择File->Save As,之后你应该能看见Save File As对话框。

网络工具Netwox和Wireshark详解

对话框会询问你想要保存的数据包捕获的位置,以及你希望保存的格式。

如果你不选择一个文件格式,那么Wireshark会默认使用pcapng文件格式。

Save File As对话框的一个更强大的功能是你可以指定需要保存的数据包范围,选择File->Export Specified Packets。这是一个让“胖”捕获文件变“瘦”的好方法。你可以选择只保存一定序号范围内的数据包、标记了的数据包,或者经过过滤器筛选后显示出来的数据包等(标记的数据包和过滤器后面讲解)。

你可以将你的Wireshark捕获数据导出到几种不同格式的文件中,以便于在其他媒体中查看,或是导入到其他的数据包分析工具中。这些格式包括文本文件、PostScript、逗号分隔值(CSV)和XML。如果想要导出你的数据包捕获,那么可以选择File->Export Packet Dissections,并选择你想要导出的文件格式。

2、合并捕获文件

某些类型的分析工作需要合并多个捕获文件,一般在比较两个数据流或者组合单独捕获的流量时比较常见。

如果想要合并捕获文件,那么应先打开一个你想要合并的文件,然后选择File->Merge,这时便会弹出Merge with Capture File的对话框,如图所示。

网络工具Netwox和Wireshark详解

选择一个你希望合并到当前文件的新文件,然后选择你希望进行合并的方式。你可以将选中的文件添加到当前打开的文件中,也可以按照它们时间戳的先后进行合并。 

六、数据包分析

1、查找数据包(Ctrl+F)

遇到处理大量数据包的情形。当这些数据包的数量达到上千甚至上万时,你需要更高效地在这些数据包中进行查找。出于这个目的,Wireshark允许你对符合一定条件的数据包进行标记,或者打印数据包以供参考。

如果想要找到符合特定条件的数据包,那么可以按Ctrl-F组合键打开Find Packet条形框,如图方框内所示。

网络工具Netwox和Wireshark详解

这个条形框应该在过滤框和包列表窗口之间,选项:

  1. Disply filter:通过表达式进行筛选,如: (not ip,ip.addr=xxx.xx.xx.xx,...)
  2. Hex value:十六进制数进行筛选,如: (ff:ff,...)
  3. String:字符串进行筛选,如:(response,...)
  4. 查找下一个匹配数据包(control + N),查找前一个匹配数据包(control + B)   

网络工具Netwox和Wireshark详解

在确定选项并在文本框中输入搜索关键词之后,单击Find,就会找到满足该关键词的第一个数据包。如果想要找到下一个匹配的数据包,则按Ctrl-N组合键;想要找到前一个,则按Ctrl-B组合键。 

2、标记数据包(Ctrl+M)

在找到那些符合搜索条件的数据包之后,你可以根据需要进行标记。举例来说,可能你希望将那些需要分开保存的数据包标记出来,或者根据颜色快速地查找它们。

网络工具Netwox和Wireshark详解

如图所示,被标记的数据包会以黑底白字显示(你也可以仅仅将标记了的数据包选择出来,然后将其作为数据包捕获保存下来)。

如果你想要标记一个数据包,那么可以右击Packet List面板,并在弹出的菜单中选择Mark Packet,或者在Packet List面板中选中一个数据包,然后按Ctrl-M组合键;如果想取消对一个数据包的标记,那么再按一次Ctrl-M组合键;就可以将其取消。

在一次捕获中,你想标记多少个数据包都可以;如果你想要在标记的数据包间前后切换,那么分别按Shift-Ctrl-N和Shift-Ctrl-B组合键即可。

3、打印数据包

虽然大多数分析都会在电脑屏幕前进行,但你可能仍然需要将捕获结果打印出来。我经常将数据包打印出来,并贴在我的桌子上,这样我在做其他分析的时候,就可以快速地参考这些内容了。特别是在做报告的时候,将数据包打印成一个PDF文件将是非常方便的。

如果需要打印捕获的数据包,那么可以在主菜单中选择File->Print打开Print对话框。

你可以在图中看到Print对话框的样子:

网络工具Netwox和Wireshark详解

在这个例子中,与Export Specified Packets对话框相似,你可以按一定范围打印数据包,比如被标记的数据包,或者作为过滤器筛选结果显示出来的数据包。对于每一个数据包,你也可以在Wireshark的3个主面板中选择打印对象。在你做好了这些选择之后,单击Print。 

4、设定时间显示格式和相对参考

时间在数据包的分析中格外重要。所有在网络上发生的事情都是与时间息息相关的,并且你几乎需要在每一个捕获文件中检查时间规律以及网络延迟。Wireshark意识到时间的重要性,并提供了一些相关的选项以供设定。

1)时间显示格式

Wireshark所捕获的每一个数据包都会由操作系统给予一个时间戳。Wireshark可以显示这个数据被捕获时的绝对时间戳,也可以是与上一个被捕获的数据包或是捕获开始及结束相关的相对时间戳。
与时间显示相关的选项可以在主菜单的View菜单中找到,如图所示,可以让你设置时间的精度。

网络工具Netwox和Wireshark详解

时间表示格式选项可以让你根据时间显示方式调整不同的设置。这包含了日期和时间、UTC日期和时间、自UNIX纪元起的秒数、自第一个包起的秒数(默认)、自上一个包起的秒数等。

格式选项允许你选择不同的格式,而精度选项允许你将精度设定为自动或者手动,比如秒、毫秒、微秒等。

注意:

从多个设备中比较包数据,一定要确认这些设备之间的时间是同步的,特别是当你做取证分析和检查问题时。你可以使用网络时间协议(NTP)来确保网络设备的时间是同步的。当包数据来自不同时区的设备时,请考虑使用统一的UTC时间来避免干扰。

2)数据包的相对时间参考(Ctrl+T)

数据包的相对时间参考,允许你以一个数据包作为基准,而之后的数据包都以此计算相对时间戳。当你检查在捕获文件之外的某个点触发的一系列连续事件时,这个功能会变得非常好用。

如果希望将某一个数据包设定为时间参考,那么可以在Packet List面板中选择作为相对参考的数据包,然后右键选择 Set/Unset Time Reference。如果希望取消一个数据包的相对时间参考,则重复刚才的操作即可。选择完参考数据包后,你也可以按下组合键Ctrl-T达到一样的效果。

在你将一个数据包设定为时间参考之后,Packet List面板中这个数据包的Time列就会显示为REF,如图所示。

网络工具Netwox和Wireshark详解

可以让一个数据包作为基准,而后的数据包以此计算相对时间戳。  

3)时间偏移(Ctrl+Shift+T)

有些时候你也许会遇到来自不同源的包数据,它们之间的时间是不同步的。当我们调查从不同地方捕获的相同流量时,这种情况尤为多见。

虽然大多数的管理员都会尽可能地保持网络上每一个设备的时间都是同步的,但例外情况时有发生。Wireshark 提供了一项时间偏移的功能,它通过把包的时间戳整体偏移调整,来减轻在分析中可能遇到的麻烦。

要对一个或多个包的时间戳进行偏移调整,只需选择 Edit->Time Shift或者按下组合键Ctrl-Shift-T。时间偏移窗口打开后,你就可以设定一个时间区间,来对所有包的时间进行调整,或者针对一个包设置时间戳了,比如把所有包的时间戳都加上2min5s。

5、设定捕获选项

Wireshark在Capture Options对话框中,提供了一些额外的捕获选项。要查看这些选项,只需选择Capture->Options。

Capture Options对话框提供了各种意想不到的选项,为的就是能在进行数据包捕获时给予你更多的灵活性。这些选项分为3个标签页:输入、输出和选项。下面将逐个予以说明。

1. 输入标签页

输入标签页的主要目的就是显示所有可以抓包的硬件接口和有关这些接口的基本信息。这些信息包括系统提供的接口名字、一个显示该接口吞吐量的流量图,以及一些例如混杂模式状态和缓冲区大小的额外选项,在最右列有一个捕获过滤器。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

在输入标签页区域,你可以直接双击来修改接口的大多数设置。例如,如果你想禁用一个接口的杂模式,那么只需要在那一行接口的混杂模式下拉菜单中选择disabled即可。

2. 输出标签页

与传统的先抓流量再存文件的方式不同的是,输出标签页允许你把所抓的流量包存成一个文件。

网络工具Netwox和Wireshark详解

这样做可以使管理捕获流量包的存储方式更具灵活性。你可以选择把流量包都存成一个文件、文件集或使用环状缓冲(我们待会儿就会讲到)来控制创建文件的个数。要开启这项功能,可以在文件文本框内输入一个完整的绝对路径和名字,你也可以通过使用 Browse 按钮来选择一个目录并给文件起名。

当你要捕获一个大流量或者进行长时间抓包时,文件集合是你的得力帮手。文件集合就是按照特定的条件组成的多个文件的分组。要保存成文件集合,请单击Create a new file automatically after... 选项。

Wireshark 使用多个不同的基于时间或文件大小的触发器,来管理保存为文件集合。要想开启其中的一个触发器,可以选中该触发器,用小箭头按钮调节比率大小并选择单位。你可以把触发器设置为每抓取1MB的流量就新存一个文件,或者每过1min就新存一个文件。

使用 ring buffer(环状缓冲)允许你指定一个特定的文件数量,一旦超过了这个数量,Wireshark就会用新数据覆盖最老的数据。虽然环状缓冲有多重含义,但在这里指的是一旦最后的文件被写满了,则第一个文件就会被覆盖。换句话说,这实现了一个先进先出(FIFO)的写入数据到文件的方式。你可以选中这个功能,然后设置一个你想要回写的文件的最大数量。

举例来说,如果你选择使用文件集合并且每隔1h创建一个新文件,并且你设置了环状缓冲值为6。一旦第6个文件被生成,则环状缓冲将循环返回并覆盖第一个文件,而不是新建第七个文件。这个机制保证了在不断有新文件写入的同时又不会持续增加文件的数量。

在输出标签页上你也可以设定最终文件保存的格式是否使用.pcapng。如果你有对该格式不兼容的第三方工具的话,则可以选择.pcap格式。

3. 选项标签页

选项标签页包含着一些其他的抓包设置,包括显示选项、解析名称和自动停止捕获,如图所示。

网络工具Netwox和Wireshark详解

1)显示选项

Display选项部分用来控制捕获的数据包如何进行显示。Update list of packets in real time选项的名字就一目了然了,并且它可以和Automatic scrolling in live capture一同使用。

在这两个选项启用之后,所有捕获的数据包都会显示在屏幕上,并且新捕获的数据包会立刻显示出来。

注意:

当Update list of packets in real time和Automatic scrolling in live capture选项都被选中并且捕获一定数量的数据包时,将会对处理器产生相当的负担。除非你必须要实时查看数据包,否则最好将这两个选项都取消掉。

Show extra capture info dialog选项允许你启用或屏蔽掉根据协议显示数据包数量和比率的小窗口。我喜欢打开这一选项把,因为我通常不喜欢在捕获流量的时候满屏滚动着数据包。

2)名称解析选项

Name Resolution选项允许你在捕获中,启用自动的数据链路层(第2层)、网络层(第3层)和传输层(第4层)的名称解析。

3)停止捕获选项

Stop capture选项允许你在满足一定的触发条件时停止正在进行的捕获。与多文件集中的情形类似,你可以使用文件大小、时间间隔或者数据包的数目作为触发条件。这些选项可以与之前介绍的多文件捕获一起使用。

6、命令行分析数据包

虽然使用GUI就能解决大部分问题,但是在有些时候需要使用命令行工具——TShark或Tcpdump。以下列举了可能需要使用命令行工具而不是Wireshark的一些情况。

  • Wireshark一次性提供了太多的信息。使用命令行工具可以限制打印出的信息,最后只显示相关数据,比如用单独一行来显示IP地址。
  • 命令行工具适用于过滤数据包捕获文件,并提供结果给另一个支持UNIX管道的工具。
  • 当处理大量的捕获文件时,Wireshark可能会挂掉,因为整个文件都要载入内存当中。先使用流来处理大型捕获文件,可以让你快速地过滤出相关数据包,来给文件瘦身。
  • 如果你在没有图形化界面的服务器上操作,则这时候你可能不得不依靠命令行工具了。

1. 安装TShark

TShark是基于终端的Wireshark,它是能够提供大量和Wireshark功能相同的数据包分析应用,但仅限于没有GUI的命令行界面。如果你安装了Wireshark,那么你应该也安装了TShark,除非你在Wireshark安装过程中明确反选了安装TShark。你可以按照以下步骤确认TShark是否安装。

(1)在Windows系统中打开一个命令提示窗口。单击开始菜单,输入cmd,然后单击命令行提示符。

(2)打开Wireshark的安装目录。如果选择默认安装,那么你可以在命令提示符里输入cd C:\Program Files\Wireshark。

(3)输入tshark -v来运行TShark并且打印出版本信息。如果没安装TShark,那么你会收到一个错误消息,提示你这个工具没有安装;如果TShark装好了,你会收到类似下面的版本信息:

C:\Program Files\Wireshark>tshark –v
TShark (Wireshark) 2.0.0 (v2.0.0-0-g9a73b82 from master-2.0--snip--

如果没安装TShark但你现在又想使用它,那么你可以直接回到Wireshark的安装向导重新安装,并确保默认的TShark安装选项被勾选。

如果想立马开始学习TShark的功能,那么你可以在命令后面加上-h参数。

C:\Program Files\Wireshark>tshark -h

TShark就像Wireshark那样可以在多种操作系统上运行。但是因为它不依赖于操作系统的图形库,所以不同操作系统的用户体验会更趋于一致。正因为如此,TShark在Windows、Linux和OS X上的操作基本相同。

然而Tshark在不同平台上的操作有时候也有不同,TShark主要被设计在Windows上工作。

2. 安装Tcpdump

如果说Wireshark是世界上最流行的图形化数据包分析应用,那么Tcpdump就是世界上最流行的命令行数据包分析应用。因为Tcpdump被设计在基于UNIX的系统上运行,所以它非常易于通过包管理器来安装,甚至可以预装在很多Linux发行版本中。

我们会用Ubuntu 14.04 LTS来演示。如果你想在Windows上使用Tcpdump,那么你可以下载安装WinDump。虽然Tcpdump和WinDump的使用体验不完全一样,但是它们的功能基本一样。

在WinDump中一些Tcpdump的功能可能会缺失甚至可能会有安全漏洞。

Ubuntu没有预装Tcpdump,但我们可以通过APT包管理系统来简单安装。

要安装Tcpdump,请按照以下步骤操作:

  1. 打开一个终端窗口并且运行sudo apt-get update,来确保你的软件仓库与最新的软件版本保持同步。
  2. 执行命令sudo apt-get install tcpdump。
  3. 你会被提示需要安装一些依赖才能够运行Tcpdump。按Y来允许这些依赖的安装,并且当提示时按回车键。
  4. 一旦安装完成,就可以运行命令Tcpdump -h来执行Tcpdump,并打印出当前版本信息。如果该命令执行成功,则说明你现在可以开始使用Tcpdump了。
sanders@ppa:~$ tcpdump -h
tcpdump version 4.5.1
libpcap version 1.5.3
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX#] [ -B size ] [ -c count ]
            [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
            [ -i interface ] [ -j tstamptype ] [ -M secret ]
            [ -Q metadata-filter-expression ]
            [ -r file ] [ -s snaplen ] [ -T type ] [ --version ] [ -V file ]
            [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z command ]
            [ -Z user ] [ expression ]

你可以通过调用man tcpdump,来查看Tcpdump所有可用的命令,就像这样:

sanders@ppa:~$ man tcpdump

3. 捕获和保存流量

首先要学习的是如何把当前流量捕获下来并把它们打印到屏幕上。要在TShark里捕获,仅需执行命令tshark。这条命令会从网卡开始抓取当前流量,并会在你的终端窗口上实时显示抓取的结果,如下所示:

C:\Program Files\Wireshark>tshark
  1   0.000000 172.16.16.128 -> 74.125.95.104 TCP 66 1606      80 [SYN]
Seq=0 Win=8192 Len=0 MSS=1460 WS=4 SACK_PERM=1
  2   0.030107 74.125.95.104 -> 172.16.16.128 TCP 66 80      1606 [SYN, ACK]
Seq=0 Ack=1 Win=5720 Len=0 MSS=1406 SACK_PERM=1 WS=64
  3   0.030182 172.16.16.128 -> 74.125.95.104 TCP 54 1606      80 [ACK]
Seq=1 Ack=1 Win=16872 Len=0
  4   0.030248 172.16.16.128 -> 74.125.95.104 HTTP 681 GET / HTTP/1.1
  5   0.079026 74.125.95.104 -> 172.16.16.128 TCP 60 80      1606 [ACK]
Seq=1 Ack=628 Win=6976 Len=0

要在Tcpdump里抓取流量,可执行tcpdump命令。一旦执行这条命令,你的终端窗口就会出现如下所示的内容:

sanders@ppa:~$ tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
21:18:39.618072 IP 172.16.16.128.slm-api > 74.125.95.104.http: Flags [S],
seq 2082691767, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK],
length 0
21:18:39.648179 IP 74.125.95.104.http > 172.16.16.128.slm-api:
Flags [S.], seq 2775577373, ack 2082691768, win 5720, options [mss
1406,nop,nop,sackOK,nop,wscale 6], length 0
21:18:39.648254 IP 172.16.16.128.slm-api > 74.125.95.104.http: Flags [.],
ack 1, win 4218, length 0
21:18:39.648320 IP 172.16.16.128.slm-api > 74.125.95.104.http: Flags [P.],
seq 1:628, ack 1, win 4218, length 627: HTTP: GET / HTTP/1.1
21:18:39.697098 IP 74.125.95.104.http > 172.16.16.128.slm-api: Flags [.],
ack 628, win 109, length 0

因为在UNIX系统里抓包需要管理员权限,所以你要以root账户运行Tcpdump,或者在命令前加上sudo。但在很多情况下,你在类UNIX系统上只有受限的普通用户权限。如果你遇到权限方面的问题,那么这可能就是原因所在。

根据你的系统配置,TShark和Tcpdump可能不会默认从你设想的网卡抓取流量。如果这种情况发生了,你就需要手动去明确它。你可以使用TShark的-D参数来列出当前所有可用的网卡,系统会以数字列表的形式打印出网卡信息,如下所示:

C:\Program Files\Wireshark>tshark -D
1.\Device\NPF_{1DE095C2-346D-47E6-B855-11917B74603A} (Local Area Connection*
2)
2.\Device\NPF_{1A494418-97D3-42E8-8C0B-78D79A1F7545} (Ethernet 2)

要使用其中一个网卡,可以在命令后面添加-i参数和上网卡的标号,如下所示:

C:\Program Files\Wireshark>tshark –i 1

这个命令会让TShark只抓取针对Local Area Connection 2网卡的流量,该网卡在列表里被标注为1号。我建议始终明确要从哪个网卡抓取流量,因为虚拟软件和VPN软件会在系统中添加自己的网卡,而且你也需要知道你捕获的网络流量来自哪里。

在Linux或者OS X系统运行Tcpdump的话,请使用ifconfig命令来列出可用的网卡。

sanders@ppa:~$ ifconfig
eth0      Link encap:Ethernet HWaddr 00:0c:29:1f:a7:55
          inet addr:172.16.16.139 Bcast:172.16.16.255 Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe1f:a755/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
          RX packets:5119 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3088 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:876746 (876.7 KB) TX bytes:538083 (538.0 KB)

指明网卡也是用-i参数实现:

sanders@ppa:~$ tcpdump –i eth0

这个命令会让Tcpdump只从eth0网卡中捕获流量。

一旦设置完成,你就可以开始捕获流量了。如果你监听的网卡非常繁忙,那么在你屏幕上所打出的信息可能会滚动得飞快,以至于你来不及去查看它们。这时候我们可以把抓取的包存成文件,然后只从文件中读取我们想要的数据包。

要把抓到的包存为文件,可使用-w参数加上要保存的文件名。抓包进程会持续进行,除非你按下Ctrl-C组合键。流量文件会直接保存到当前执行命令的目录下,除非另指明路径。

下面就是使用TShark命令的一个例子:

C:\Program Files\Wireshark>tshark –i 1 –w packets.pcap

这个命令会把从1号网卡捕获的流量全部写到以packets.pcap命名的文件中。

使用Tcpdump时,类似的命令如下:

sanders@ppa:~$ tcpdump –i eth0 –w packets.pcap

要想从保存的文件中回读数据包,可使用-r参数加上文件名:

C:\Program Files\Wireshark>tshark –r packets.pcap

这个命令会读取packets.pcap中的所有数据并把它们打印到屏幕上。

使用Tcpdump差不多是一样的命令。

sanders@ppa:~$ tcpdump –r packets.pcap

你也许会注意到,如果你要读取的文件包含了太多的数据包,那么你会遇到之前讲过的情况,一大堆的信息在屏幕飞快滚动以至于什么都看不清。这时你可以使用-c参数来限制在屏幕上显示的数据包数量。

比如,使用TShark下面的命令只会显示在捕获文件中最开始的10个包。

C:\Program Files\Wireshark>tshark –r packets.pcap –c10

在Tcpdump里用的是一样的参数:

sanders@ppa:~$ tcpdump –r packets.pcap –c10

抓包的时候也可以使用-c参数,这表明只会抓取前10个包。当和-w参数一起使用时,可以把结果存成文件。

下面是在TShark中此命令的示例:

C:\Program Files\Wireshark>tshark –i 1 –w packets.pcap –c10

还有Tcpdump下的类似命令:

sanders@ppa:~$ tcpdump –i eth0 –w packets.pcap –c10

4. 控制输出

使用命令行工具的另一个优点是可以自定义输出。一般GUI应用会把所有的信息都告诉你,然后你可以自行寻找所需的内容。命令行工具通常只会显示最简输出,并强制你使用额外的命令参数来挖掘更高级的用法,TShark和Tcpdump也不例外。默认情况下它们只会为一个数据包显示一行输出。如果你想看到协议细节或者单独字节这些更深的内容,就需要使用额外的命令参数了。

在TShark的输出里,每一行代表一个数据包,每一行输出的格式取决于数据包使用的协议类型。TShark底层使用和Wireshark一样的解析器来分析数据包,所以TShark的输出和Wireshark的包列表窗口很像。正因为TShark可以解析七层协议,所以它能够比Tcpdump提供更多的有关包头信息的内容。

Tcpdump中每行也代表一个数据包,根据不同的协议来规范每行的输出格式。因为Tcpdump不依赖于Wireshark的协议解析器,所以第7层的协议信息无法被解码。这也是Tcpdump的最大限制之一。

取而代之的是,Tcpdump单行数据包只会根据传输层协议(TCP或UDP)进行解码。

TCP包使用以下格式:

[Timestamp] [Layer 3 Protocol] [Source IP].[Source Port] > [Destination IP].
[Destination Port]: [TCP Flags], [TCP Sequence Number], [TCP Acknowledgement
Number], [TCP Windows Size], [Data Length]

UDP包使用以下格式:

[Timestamp] [Layer 3 Protocol] [Source IP].[Source Port] > [Destination IP].
[Destination Port]: [Layer 4 Protocol], [Data Length]

这种简单的单行总结对快速分析很有帮助,但最终你还是要对一个数据包进行深入分析。在Wireshark中,你会在包列表窗口里选择一个数据包,它将在下方的包细节和包字节窗口显示一些细节内容。使用命令行的命令也可以达到类似效果。

一个获取更多细节的简单方法是增加输出的冗余程度。

在TShark中,使用大写的V来增加冗余:

C:\Program Files\Wireshark>tshark –r packets.pcap –V

这会提供类似Wireshark打开packets.pcap后包细节窗口里的内容。这里展示了一具具有正常冗余(基本总结)和扩展冗余(使用-V参数获取)的包的示例。

首先正常输出:

C:\Program Files\Wireshark>tshark -r packets.pcap -c1
  1   0.000000 172.16.16.172 -> 4.2.2.1      ICMP Echo (ping) request
id=0x0001, seq=17/4352, ttl=128

现在使用更大的冗余选项来显示更多的内容:

C:\Program Files\Wireshark>tshark -r packets.pcap -V -c1
Frame 1: 74 bytes on wire (592 bits), 74 bytes captured (592 bits) on
interface 0
    Interface id: 0 (\Device\NPF_{C30671C1-579D-4F33-9CC0-73EFFFE85A54})
    Encapsulation type: Ethernet (1)
    Arrival Time: Dec 21, 2015 12:52:43.116551000 Eastern Standard Time
     [Time shift for this packet: 0.000000000 seconds]--snip--

在Tcpdump,小写的v是用来增加冗余的。这点跟TShark略有不同,Tcpdump允许每个数据包显示不同层级的冗余信息。你可以通过增加v参数的数量来增加显示层级,至多到第3层,如下所示:

sanders@ppa:~$ tcpdump –r packets.pcap –vvv

下面是在相同数据包下,Tcpdump使用默认冗余选项和更高一级的冗余选项之间的比较。即便使用最大冗余选项,输出的信息也很难达到TShark那样的丰富度。

sanders@ppa:~$ tcpdump -r packets.pcap -c1
reading from file packets.pcap, link-type EN10MB (Ethernet)
13:26:25.265937 IP 172.16.16.139 > a.resolvers.level3.net: ICMP echo request,
id 1759, seq 150, length 64
sanders@ppa:~$ tcpdump -r packets.pcap -c1 -v
reading from file packets.pcap, link-type EN10MB (Ethernet)
13:26:25.265937 IP (tos 0x0, ttl 64, id 37322, offset 0, flags [DF], proto
ICMP (1), length 84)
    172.16.16.139 > a.resolvers.level3.net: ICMP echo request, id 1759, seq
150, length 64

可以显示出多少细节取决于你当前分析数据包的协议类型。虽然高冗余级别是有用的,但是有时也很难让我们看清所有的内容。TShark和Tcpdump储存了每个包的所有内容,你可以以十六进制字节或它的ASCII表示形式来查看。

在TShark里,你可以使用-x参数来查看数据包的ASCII形式或十六进制字节形式,同时结合-r参数把捕获文件读取到TShark里并显示出来。

C:\Program Files\Wireshark>tshark –xr packets.pcap

显示结果很像Wireshark的包字节窗口,如图所示。

网络工具Netwox和Wireshark详解

类似地在Tcpdump里,你可以使用-X参数,来查看数据包的ASCII形式或十六进制字节形式,同时结合-r参数把捕获文件读取到Tcpdump里并显示出来,就像这样:

sanders@ppa:~$ tcpdump –Xr packets.pcap

 这条命令的输出结果如图所示:

网络工具Netwox和Wireshark详解

如果你需要的话,Tcpdump还允许你获得更多的粒度。你可以使用-x(小写)参数只查看十六进制输出或者使用-A参数只输出ASCII形式。

如果你添加了这些增加冗余的选项,则当数据输出在屏幕上飞快滚动时你会容易感到眼花缭乱。我以为,要做到最有效率的分析就要在命令行使用最少的信息显示你最关心的内容。我建议从默认的输出格式开始,当你有特别的包需要深入分析时,再使用更详细的输出选项。这种策略会避免你被大量数据所淹没。

5. 名称解析

类似Wireshark,TShark和Tcpdump也会尝试名称解析,即把地址和端口号转换为名称。如果你注意之前的例子,也许已经发现这一过程已默默地发生了。就像之前提到的,我通常会把它关掉来避免产生更多网络流量的可能。

你可以通过-n参数来禁用TShark的名称解析。这个参数可以和其他参数一起使用来增强可读性。

C:\Program Files\Wireshark>tshark –ni 1

你可以通过-N参数来启用或禁用一些名称解析的特定功能。如果使用-N参数,则所有的名称解析功能将会被禁用,除非你明确指定一些功能的启用。举例来说,下面的命令仅会启用传输层(端口服务名称)的解析。

C:\Program Files\Wireshark>tshark –i 1 –Nt

你可以结合多个值,下面这个命令会启用传输层和MAC层的解析。

C:\Program Files\Wireshark>tshark –i 1 -Ntm

当使用该选项时可能参考以下值。

  • m:MAC地址解析。
  • n:网络地址解析。
  • t:传输层(端口服务名称)解析。
  • N:使用外网解析服务。
  • C:使用当前DNS解析。

在Tcpdump下,使用-n会禁用IP名称解析,使用-nn也会禁用端口服务解析。

这个参数也可以和其他命令相结合使用,就像这样:

sanders@ppa:~$ tcpdump –nni eth1

下面的例子展示了一个捕获的数据包先启用端口解析,然后再禁用(-n)。

sanders@ppa:~$ tcpdump -r tcp_ports.pcap -c1
reading from file tcp_ports.pcap, link-type EN10MB (Ethernet)
14:38:34.341715 IP 172.16.16.128.2826 > 212.58.226.142.❶http: Flags [S], seq
3691127924, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
sanders@ppa:~$ tcpdump -nr tcp_ports.pcap -c1
reading from file tcp_ports.pcap, link-type EN10MB (Ethernet)
14:38:34.341715 IP 172.16.16.128.2826 > 212.58.226.142.❷80: Flags [S], seq
3691127924, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0

这些命令仅从捕获文件tcp_ports.pcap中读取了第一个包。在第一个命令里,80端口被解析为http。但在第二个命令,端口仅以数字形式表示。

6. 应用过滤器

TShark和Tcpdump的过滤器是非常灵活的,因为它们都遵从BPF捕获过滤器语法。TShark也可以使用Wireshark的显示过滤器表达式。就像Wireshark一样,TShark的捕获过滤器可以边捕获边过滤,也可以在捕获完成后过滤显示结果。我们从TShark的捕获过滤器开始讲起。

使用-f参数来应用捕获过滤器,在双引号内请遵从BPF的语法。下面这条命令仅会抓取和储存目的端口号是80的TCP流量:

C:\Program Files\Wireshark>tshark –ni 1 –w packets.pcap –f "tcp port 80"

使用-Y来应用显示捕获器,请在双引号内使用Wireshark的过滤器语法。在抓取流量的过程中,你可以使用像下面的命令:

C:\Program Files\Wireshark>tshark –ni 1 –w packets.pcap –Y "tcp.dstport == 80"

使用类似的命令显示过滤器可以应用在已经捕获的文件中。以下命令会显示packets.pcap中所有符合过滤表达式的包:

C:\Program Files\Wireshark>tshark –r packets.pcap –Y "tcp.dstport == 80"

在Tcpdump中你可以在单引号里构造过滤表达式,然后附到命令的最后。以下的命令依然会捕获和存储目的端口号是80的TCP流量:

sanders@ppa:~$ tcpdump –nni eth0 –w packets.pcap 'tcp dst port 80'

当读取捕获文件时你也可以构造过滤器。以下命令会显示packets.pcap中所有符合过滤表达式的包:

sanders@ppa:~$ tcpdump –r packets.pcap 'tcp dst port 80'

需要牢记的一点是,如果没有在抓包的时候指明过滤器,那么你的捕获文件里通常会含有其他数据包。读取这个捕获文件后,你仅仅在屏幕上限制了所打出来的内容。

那么如果你有一个包含大量各种类型数据包的捕获文件,而你又想把需要的数据包过滤出来另存为一个文件,这时候怎么办呢?你可以结合使用-w和-r参数来解决:

sanders@ppa:~$ tcpdump –r packets.pcap 'tcp dst port 80' –w http_packets.pcap

这个命令会先读取packets.pcap,过滤出目的TCP端口为80的数据包(http用的端口),最后把这些数据包写入一个名叫http_packets.pcap的新文件里。当你既想把大型原文件.pcap保存起来,又想在某时专注于分析其中一小部分时,这是个很常见的技巧。我经常使用这个技巧,特别是当我要把很大的捕获文件用Tcpdump切小,然后再放到Wireshark里分析时。毕竟小文件更加容易处理。

除了在一行命令后面直接加上过滤表达式,Tcpdump还允许你指定一个包含一系列过滤器的BPF文件。这在有些情况下十分方便,特别是当你要应用一个极其复杂的过滤器表达式,且长度不能和Tcpdump的命令保持在同一行时。你可以使用-F参数来指派一个BPF过滤器文件,就像这样:

sanders@ppa:~$ tcpdump –nni eth0 –F dns_servers.bpf

如果你的BPF文件太大,那么你也许会加一些注释,以帮助你理解每个部分的过滤表达式的功能和结构。值得注意的是,在BPF文件里直接加注释是非法的,如果不是BPF语法的话就会报错。但又因为注释对于解密大型BPF文件是非常有帮助的,所以我通常会使用两份BPF文件,一份不包含任何注释,是载入到tcpdump里的;另一份含有注释以供参考。

7. TShark里的时间显示格式

TShark里一个经常让新手们感到困惑的问题就是默认的时间戳。它显示从数据包捕获开始的相对时间戳。有些时候这种时间戳格式还比较有用,但在很多情况下你想看到的是包捕获的实际时间,而这是Tcpdump所使用的时间戳默认值。要想和Tcpdump的输出格式一样,你可以使用-t参数再加上值ad以显示绝对时间。

C:\Program Files\Wireshark>tshark –r packets.pcap –t ad

这里是一个基于同样的捕获文件使用默认的相对时间戳和绝对时间戳之间的比较:

C:\Program Files\Wireshark>tshark -r packets.pcap -c2
     1 0.000000 172.16.16.172 -> 4.2.2.1       ICMP Echo (ping)
   request id=0x0001, seq=17/4352, ttl=128
     2 0.024500 4.2.2.1 -> 172.16.16.172       ICMP Echo (ping)
   reply id=0x0001, seq=17/4352, ttl=54 (request in 1)
  C:\Program Files\Wireshark>tshark -r packets.pcap -t ad -c2
     1 2015-12-21 12:52:43.116551 172.16.16.172 -> 4.2.2.1 ICMP Echo (ping)
   request id=0x0001, seq=17/4352, ttl=128
     2 2015-12-21 12:52:43.141051 4.2.2.1 -> 172.16.16.172 ICMP Echo (ping)
   reply id=0x0001, seq=17/4352, ttl=54 (request in 1)

通过使用-t参数,你可以自定义时间显示格式,就像你在Wireshark里看到的那样。

这些格式值的含义都在下表中:

网络工具Netwox和Wireshark详解

然而Tcpdump不提供这样多层面时间戳格式的控制。

8. TShark中的总结统计

TShark的另一个有用的功能(也是比Tcpdump先进的功能),是它可以从捕获的文件中生成统计的一个子集。很多这些统计功能在Wireshark中都能找到影子,但是TShark提供了简单的命令方式来进行访问。使用-z参数加上输出的名字可以生成统计信息。你可以使用以下命令查看所有可用的统计: 

C:\Program Files\Wireshark>tshark –z help

很多我们之前学过的功能都可以用-z参数实现。这其中包括了输出端点和会话的命令:

C:\Program Files\Wireshark>tshark -r packets.pcap –z conv,ip

这个命令从packets.pcap中打印出了有关IP会话的信息的统计图表,如图所示。

网络工具Netwox和Wireshark详解

你也可以使用这个参数来查看特定协议的信息,如图6-4所示。你可以使用http, tree选项,以表的形式来分解HTTP的请求和返回数据包。

C:\Program Files\Wireshark>tshark -r packets.pcap –z http,tree

另一个非常有用的功能是查看已完成排序的输出流,就像之前我们在Wireshark里先右键单击一个数据包然后选择“跟随TCP流”一样。

要想获得这个输出,我们需要使用follow选项,并且指明流的类型、输出模式和我们想显示出的流。你可以通过会话统计最左列的序号来表示一段流,类似命令如下所示:

C:\Program Files\Wireshark>tshark -r http_google.pcap -z follow,tcp,ascii,0 

网络工具Netwox和Wireshark详解

这条命令还会以ASCII形式将http_google.pcap的0号TCP流打印到屏幕上。

这个命令的输出如下所示: 

C:\Program Files\Wireshark>tshark -r http_google.pcap -z
--snip--
===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 0
Node 0: 172.16.16.128:1606
Node 1: 74.125.95.104:80
627
GET / HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.7)
Gecko/20091221 Firefox/3.5.7
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: PREF=ID=257913a938e6c248:U=267c896b5f39fb0b:FF=4:LD=e
n:NR=10:TM=1260730654:LM=1265479336:GM=1:S=h1UBGonTuWU3D23L;
NID=31=Z-nhwMjUP63e0tYMTp-3T1igMSPnNS1eM1kN1_DUrnO2zW1cPM4JE3AJec9b_
vG-YFibFXszOApfbhBA1BOX4dKx4L8ZDdeiKwqekgP5_kzELtC2mUHx7RHx3PIttcuZ

        1406
HTTP/1.1 200 OK
Date: Tue, 09 Feb 2010 01:18:37 GMT
Expires: -1
 
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Content-Encoding: gzip
Server: gws
Content-Length: 4633
X-XSS-Protection: 0

你也可以通过提供地址细节,来指明想要查看哪个数据流。例如,下面的命令会获取一个指明端点和端口的UDP流:

C:\Program Files\Wireshark>tshark –r packets.pcap –z follow,udp,ascii,192.168.
1.5:23429,4.2.2.1:53

这条命令会打印packets.pcap中端口23429上的192.168.1.5端点和端口53上的4.2.2.1端点的UDP流。

以下是我个人最爱的统计选项:

  • ip_hosts,tree:在一段捕获中显示每个IP地址,并统计每个IP地址在所占流量的比率。
  • io, phs:分层级统计在捕获文件中找到的所有协议。
  • http,tree:显示关于HTTP请求和回应的统计。
  • http_req,tree:显示每个HTTP请求的统计。
  • smb,srt:显示关于Windows会话的SMB命令的统计。
  • endpoints,wlan:显示无线端点。
  • expert:从捕获中显示专家信息(对话、错误等)。

当你使用-z参数时会有很多有用的选项,把它们都描述一遍会占用大量的篇幅。但是如果你经常使用TShark,我还是建议你在官方文档上花点时间学习一下所有可用的选项。

9. TShark VS Tcpdump

这里介绍了两个基于命令行的数据包分析应用,它们都能很好地胜任分内的工作,而且无论其中哪一款都可以通过各种选项来完成你手头上的任何工作。这里列出两个工具的几点差别,可以让你根据需求选择最适合的那个。

操作系统:Tcpdump只能在基于UNIX的系统下运行,而TShark既可以工作在Windows下,又可以工作在基于UNIX的系统下。

协议支持:两个工具都支持常见的第3层和第4层的协议,但Tcpdump对第7层的协议支持不足。TShark提供了丰富的第7层协议支持,因为它在底层使用Wireshark的协议解析器。

分析功能:两个工具都必须依赖手工分析才能生成有价值的结果。但是TShark还提供了类似于Wireshark的强大统计分析功能,在GUI不可用时能够协助分析。

其实个人习惯和工具的可用性才是选择哪个应用的决定性因素。幸运的是,这些工具的使用方式都是类似的,学会其中一个就能很快上手另一个,正所谓技多不压身。

七、数据包过滤

过滤器允许你找出所希望进行分析的数据包。简单来说,一个过滤器就是定义了一定的条件,用来包含或者排除满足自定义条件的数据包的表达式。如果你不希望看到一些数据包,则可以写一个过滤器来屏蔽它们;如果你希望只看到某些数据包,则可以写一个过滤器来只显示出这些数据包。
Wireshark主要提供两种主要的过滤器。

  • 捕获过滤器:当进行数据包捕获时,只有那些满足给定的包含/排除表达式的数据包会被捕获。
  • 显示过滤器:该过滤器根据指定的表达式用于一个已捕获的数据包集合,它将隐藏不想显示的数据包,或者只显示那些需要的数据包。

我们先看一下捕获过滤器。

1、捕获过滤器

捕获过滤器用于进行数据包捕获的实际场合,使用它的一个主要原因就是性能。如果你并不需要分析某个类型的流量,则可以简单地使用捕获过滤器过滤掉它,从而节省那些会被用来捕获这些数据包的处理器资源。

当处理大量数据的时候,创建自定义的捕获过滤器是相当好用的。它可以让你专注于那些与你手头事情有关的数据包,从而加速分析过程。

举一个简单的例子,你在一台有多种角色的服务器上捕获流量时很可能会用到捕获过滤器,假设你正在解决一个运行于262端口网络服务的问题,如果你正在分析的那台服务器在许多端口运行了各种不同的网络服务,那么找到并分析只运行于262端口的流量本身可能就具有一定的工作量。

你可以通过前面讨论过的Capture Options对话框到达目的,步骤如下所示。

(1)选择Capture -> Options按钮打开捕获接口对话框。

(2)选择你想进行数据包捕获的设备,然后在最右列选中捕获过滤器。

(3)你可以单击该列以输入一个表达式来应用捕获过滤器。我们希望过滤器只显示出262端口的出站和入站流量,所以如图所示。

网络工具Netwox和Wireshark详解

输入port 262(我们将在后面仔细地讨论关于过滤表达式的问题)。如果你输入的表达式合法,那么方格里的字颜色应该会变绿;否则会变红色。

 (4)当你设定好过滤器之后,单击Start开始捕获。

当收集到足够多的样本之后,你应该只看见了端口262的流量,这样就能更有效率地分析这些数据了。

1. 捕获过滤器的BPF语法

捕获过滤器应用于libpcap/WinPcap,并使用Berkeley Packet Filter(BPF)语法。这个语法被广泛用于多种数据包嗅探软件,主要因为大部分数据包嗅探软件都依赖于使用BPF的libpcap/WinPcap库。掌握BPF语法对你在数据包级别更深入地探索网络来说,非常关键。

使用BPF语法创建的过滤器被称为expression(表达式),并且每个表达式包含一个或多个primitives(原语)。每个原语包含一个或多个qualifiers(限定词),然后跟着一个ID名字或者数字,如图所示。

网络工具Netwox和Wireshark详解

 网络工具Netwox和Wireshark详解

常用过滤选项:

ip.src == 1.1.1.1
ip.dst == 2.2.2.2
ip.addr == 3.3.3.3
tcp.port == 80
tcp.port <= 80
tcp.srcport == 80
tcp.dstport == 80
tcp.flags.syn == 1   //SYN置位报文
tcp.flags.rst == 1    //RST置位报文
tcp
!tcp
eth.dst == 00:11:22:33:44:55
eth.src == 00:11:22:33:44:55
eth.addr[0:3] == 00:11:22   //过滤指定位
ip.length == 100
ip.length >= 100
frame.number == 800  //显示标号800的报文
frame.len == 60       //显示总长度60的报文、

只对源地址是192.168.0.10和源端口或目标端口是80的流量进行捕获。 

src host 192.168.0.10 && port 80

假设你对一个正在和你网络中某个服务器进行交互的主机所产生的流量感兴趣,那么你可以在这台服务器上创建一个使用host限定词的过滤器,来捕获所有和那台主机IPv4地址相关的流量:

host 172.16.16.149

如果你在使用一个IPv6网络,则可能需要使用基于IPv6地址的host限定词,如下所示:

host 2001:db8:85a3:8a2e:370:7334

你同样可以使用基于一台设备的主机名host限定词,就像这样:

host testserver2

或者,如果你考虑到一台主机的IP地址可能会变化,则可以通过加入ether协议限定词,对它的MAC地址进行过滤:

ether host 00-1a-a0-52-e2-a0

传输方向限定词通常会和前面例子演示的那些过滤器一起使用,来捕获流向或者流出某台主机的流量。举例来说,如果想捕获来自某台主机的流量,则可以加入src限定词:

src host 172.16.16.149

如果只想捕获发往172.16.16.149服务器的流量,则可以使用dst限定词:

dst host 172.16.16.149

如果你在一个原语中没有指定一种类型限定符(host、net或者port),host限定词将作为默认选择。所以上面的那个例子也可以写成没有类型限定符的样子:

dst 172.16.16.149

不仅仅可以基于主机过滤,你还可以对基于每个数据包的端口进行过滤。端口过滤通常被用来过滤使用已知端口的服务和应用。举例来说,下面是一个只对8080端口进行流量捕获的简单过滤器的例子:

port 8080

如果想要捕获除8080端口外的所有流量,则如下所示:

!port 8080

端口过滤器可以和传输方向限定符一起使用。举例来说,如果希望只捕获访问标准HTTP80端口的Web服务器,则可以使用dst限定符:

dst port 80

协议过滤器允许你基于特定协议进行数据包过滤。这通常被用于那些非应用层的不能简单地使用特定端口进行定义的协议。所以如果你只想看一看ICMP流量,则可以使用下面这个过滤器:

icmp

如果你想看除了IPv6之外的所有流量,则下面这个方式能够满足要求。

!ip6

BPF语法提供给我们的一项强大的功能,就是可以通过检查协议头中的每一个字节来创建基于那些数据的特殊过滤器。我们将要讨论的这些高级的过滤器,通过它们你可以匹配一个数据包中从某一个特定位置开始的一定数量的字节。

举例来说,假设我们想要基于ICMP过滤器的类型域进行过滤,而类型域位于数据包的最开头也就是偏移量为0的位置,那么我们可以通过在协议限定符后输入由方括号括起的字节偏移量,在这个例子中就是icmp[0],来指定我们想在一个数据包内进行检查的位置。这样将返回一个1字节的整型值用于比较。如果只想要得到代表目标不可达(类型3)信息的ICMP数据包,则我们可在过滤器表达式中令其等于3,如下所示:

icmp[0]==3

如果只想要检查代表echo请求(类型8)或echo回复(类型0)的ICMP数据包,则可以使用带有OR运算符的两个原语:

icmp[0]==8||icmp[0]==0

虽然这些过滤器很好用,但是它们只能基于数据包头部的1个字节进行过滤。当然,你也可以在方括号中偏移值的后面以冒号分隔加上一个字节长度,来指定你希望返回给过滤器表达式的数据长度。

举例来说,假设我们要创建一个过滤器,该过滤器捕获所有ICMP目标——不可访问、主机不可达的数据包(类型3,代码1)。这些是1字节的字段,它们与偏移量为0的数据包头部相邻。为此,我们创建了一个过滤器,它检查从数据包头部的偏移量0处开始的2字节数据,并与十六进制值0301(类型3,代码1)进行比较,如下所示:

icmp[0:2]==0x0301

一个常用的场景就是只捕获带有RST标志的TCP数据包。这里只需要知道TCP数据包的标志位在偏移为13字节的地方。有趣的是,虽然整个标志位加在一起是1字节,但是这个字节中每一比特位都是一个标志。在一个TCP数据包中,多个标志可以被同时设置,因此多个值可能都代表RST位被设置,我们不能只通过一个tcp[13]的值来进行有效过滤。

我们必须通过在当前的原语中加入一个单一的&符号,来指定我们希望在这个字节中检查的比特位置。在这个字节中RST标志所在的比特位代表数字4,也就是说这个比特位被设置成4,就代表这个标志被设置了。

过滤器看上去是这个样子的:

tcp[13]&4==4

如果希望看到所有被设置了PSH标志(比特位代表数字8)的数据包,那么我们的过滤器应该会将其相应位置替换成这样:

tcp[13]&8==8

2、显示过滤器

显示过滤器应用于捕获文件,用来告诉Wireshark只显示那些符合过滤条件的数据包。你可以在Packet List面板上方的Filter文本框中,输入一个显示过滤器。

网络工具Netwox和Wireshark详解

显示过滤器比捕获过滤器更加常用,因为它可以让你对数据包进行过滤,却并不省略掉捕获文件中的其他数据。也就是说如果你想回到原先的捕获文件,则仅仅需要清空显示过滤表达式。

在有些时候,你可能会需要使用显示过滤器,来清理过滤文件中不相关的广播流量,比如清理掉Packet List面板中与当前的分析问题并没有什么联系的ARP广播,但是那些ARP广播之后可能会有用,所以最好是把他们暂时过滤掉,而不是删除它们。

如果想要过滤掉捕获窗口中所有的ARP数据包,那么将你的鼠标放到Packet List面板上方的Filter文本框中,然后输入!arp,就可以从Packet List面板中去掉所有的ARP数据包了。如果想要删除过滤器,则可单击X按钮;如果想要保存过滤器的话,则可单击(+)按钮。

应用显示过滤器有两种方法,一种是就像刚才的例子一样,直接键入合适的语法表达式;另一种是使用显示过滤器对话框来选择构建,这也是初学过滤器的一个简单方法。让我们来看一看这两种方法吧,首先从简单的开始。

1. 过滤器表达式对话框(简单方法)

过滤器表达式对话框,使得Wireshark的初学者也能很简单地创建捕获和显示过滤器。如果想要打开这个对话框,则可以先在Capture Option对话框中单击Caputre Filter按钮,然后单击Expression按钮。

如上图,对话框左边列出了所有可用的协议域,这些域指明了所有可能的过滤条件。如果想创建一个过滤器,则可以按照如下步骤操作。

(1)单击一个协议旁边的加号(+),以展开所有与这个协议相关可作为条件的域,找到你要在过滤器中使用的那一项,然后单击选中它。

(2)选择一个你想要在选中条件域和条件值之间建立的关系,比如等于、大于和小于等。

(3)通过输入一个和你选中条件域相关的条件值来创建过滤器表达式。你可以自己定义这个值,也可以从Wireshark预定义的值中选择一个。

(4)当你完成所有上述步骤时,单击OK就可以看到你的过滤器表达式的文本表示。

Filter Expression对话框对于初学者来说很好用,但在你熟悉了这一套规则之后,就会发现手动输入过滤器表达式更有效率。显示过滤器表达式的语法结构非常简单,但功能十分强大。

2. 过滤器表达式语法结构(高级方法)

在使用一段时间的Wireshark后,为了节约时间你希望在主窗口下直接使用显示过滤器的语法。幸运的是,显示过滤器的语法遵从一个标准的模式并且是易于导航。在大多数情况下,这个语法模式以具体协议为中心并且遵从protocol.feature.subfeature的格式,就像你在显示过滤器表达式对话框看到的一样。现在让我们来看一看具体的几个例子。

你会经常用到捕获或者显示过滤器来对某一个协议进行过滤。举例来说,如果你要解决一个TCP问题,那么你就只希望看到捕获文件中的TCP流量。一个简单的TCP过滤器就可以解决这个问题。
现在让我们看一看另外一些情况。假如为了解决你的TCP问题,你使用了很多ping功能,因此产生了很多ICMP流量。你可以通过!icmp这个过滤器表达式,将你捕获文件中的ICMP流量屏蔽掉。

比较操作符允许你进行值的比较。

网络工具Netwox和Wireshark详解

举例来说,当检查一个TCP/IP网络中的问题时,你可能经常需要检查和某一个IP地址相关的数据包。等于操作符可以让你创建一个只显示192.168.0.1这个IP地址相关数据包的过滤器:

ip.addr==192.168.0.1

现在假设你只需要查看那些长度小于128字节的数据包,那么你可以使用“小于或等于”操作符来完成这个要求,其过滤器表达式如下:

frame.len<=128

逻辑运算符可以让你将多个过滤器表达式合并到一个语句中,从而极大地提高过滤器的效率。

网络工具Netwox和Wireshark详解

举例来说,如果只想显示两个IP地址上的数据包,那么我们可以使用or操作符来创建一个表达式,只显示这两个IP地址的数据包,如下:

ip.addr==192.168.0.1 or ip.addr==192.168.0.2

3. 显示过滤器表达式实例

虽然编写过滤器表达式在概念上很简单,但是在解决不同问题时创建的过滤器,仍然需要许多特定的关键词与操作符。

下表给出了我经常使用的显示过滤器:

网络工具Netwox和Wireshark详解

3、保存过滤器规则

在创建了很多捕获和显示过滤器之后,你会发现其中有一些你使用得格外频繁。这时你并不需要在每次使用它们的时候都重新输入,Wireshark可以让你把常用的过滤器规则保存下来,供以后使用。

想要保存一个自定义的捕获过滤器规则,可以按照如下步骤操作:

  1. 选择Capture -> Capture Filters打开Capture Filter对话框。
  2. 在对话框的左边单击(+)按钮,创建一个新的过滤器。
  3. 在Filter Name框中给你的过滤器起一个名字。
  4. 在Filter String框中输入实际的过滤器表达式。
  5. 单击OK按钮,将你的过滤器表达式保存到列表中。

按照如下步骤保存一个自定义的显示过滤器规则:

  1. 在主窗口的过滤条栏里输入你的过滤表达式,然后单击左边的带状按钮。
  2. 单击保存这个过滤器选项,然后就会弹出一个有着之前保存过的所有显示过滤器列表的对话框。在这里你可以给你的过滤器起名,最后单击OK来保存。

网络工具Netwox和Wireshark详解

八、网络层流量分析

1、地址解析协议 ARP(Address Resolution Protocol)

网络上的通信会使用到逻辑地址和物理地址。逻辑地址允许不同网络以及间接相连的设备之间相互通信,物理地址则用于同一网段中直接使用交换机相互连接的设备之间进行的通信。在大多数情况下,正常通信需要这两种地址协同工作。

我们假设这样一个场景:你需要和网络中的一个设备进行通信,这个设备可能是某种服务器,或者只是你想与之共享文件的另一个工作站。你用来创建这个通信的应用已经得到了这个远程主机的IP地址,也意味着系统已经拥有了所有其需要的信息,用来构建它想要在第3层到第7层中传递的数据包。这时它所需要的唯一信息就是第2层包含有目标主机MAC地址的数据链路层数据。

之所以需要MAC地址,是因为网络中用于连接各个设备的交换机使用了内容寻址寄存器(CAM)。这个表列出了它在每一个端口的所有连接设备的MAC地址。当交换机收到了一个指向特定MAC地址的流量时,它会使用这个表来确定应该使用哪一个端口发送流量。如果目标的MAC地址是未知的,则这个传输设备会首先在它的缓存中查找这个地址,如果没有找到,那么这个地址就需要在网络上进行额外的通信来进行解析了。

TCP/IP网络(基于IPv4)中用来将IP地址解析为MAC地址的过程称为地址解析协议(Address Resolution Protocol, ARP)。这个协议在RFC826中进行了定义,它的解析过程只使用两种数据包:一个ARP请求与一个ARP响应。

这个传输计算机会发出一个ARP请求,基本上就是问“大家好,我的IP地址是192.168.0.101,MAC地址是f2: f2: f2: f2: f2: f2。我需要向那个IP地址是192.168.0.1的家伙发些东西,但我不知道它的硬件地址,你们谁有这个IP地址,可否回复给我你的MAC地址?”

这个数据包将被广播给网段中的所有设备。不是这个IP地址的设备将简单地丢弃这个数据包,而拥有这个IP地址的设备将发送一个ARP响应,就像是说:“你好,传输设备,我就是你要找的那个IP地址为192.168.0.101的目标设备。我的MAC地址是02:f2: 02:f2: 02:f2。”

一旦这个解析过程完成了,传输设备就会将这个目标设备的MAC和IP的对应关系更新进它的缓存,并且开始传输数据。

ARP头包含下列的几个域:

网络工具Netwox和Wireshark详解

硬件类型:数据链路层使用的类型数据。在大多数情况下,类型都是以太网(类型1)。

协议类型:ARP请求正在使用的高层协议。

硬件地址长度:正在使用的硬件地址的长度(八位组/字节)。

协议地址长度:对于指定协议类型所使用的逻辑地址的长度(八位组/字节)。

操作:ARP数据包的功能,1表示请求,2表示响应。

发送方硬件地址:发送者的硬件地址。

发送方协议地址 :发送者的IP协议地址。

目标硬件地址:目的接收方的硬件地址(ARP请求中为0)。

目标协议地址:目的接受方的高层协议地址。

现在打开pcap文件,就可以看到实际的解析过程。我们将对这个过程中的每个数据包单独进行分析。

网络工具Netwox和Wireshark详解

长度:8 位/字节,MAC 地址 48 位,即 6 字节,IP 地址 32 位,即 4 字节。 

ARP请求数据包:

网络工具Netwox和Wireshark详解

ARP响应数据包:

网络工具Netwox和Wireshark详解

无偿的 ARP:

在多数情况下,一个设备的IP地址是可以改变的。当这样的改变发生后,网络中主机缓存里的IP和MAC地址的映射就失效了。为了防止造成通信错误,Gratuitous ARP请求会被发送到网络中,强制所有收到它的设备去用新的IP和MAC地址映射更新缓存。

几个不同的情形都会产生Gratuitous ARP数据包,其中常见的就是IP地址的改变。打开pcap捕获文件,你就会看到一个实际例子。这个文件只包含一个数据包,如下图,因为这就是Gratuitous ARP数据包的全部了。

检查这个以太网报头,你会看见这个数据包以广播的形式发送,以便网络上的所有主机能够接收到它。这个ARP头看上去和ARP请求很像,除了发送方的IP地址和目标IP地址是相同的。在这个数据包被网络中的其他主机接收到之后,它会让这些主机使用新的IP地址和MAC地址关系来更新它们的ARP表。由于这个ARP数据包是未经请求的,却导致客户端更新ARP缓存,因此会称之为Gratuitous ARP。

网络工具Netwox和Wireshark详解

你会在一些不同的情形下注意到Gratuitous ARP数据包的存在。如上所示,设备IP地址的改变会生成它,并且一些操作系统也会在启动时进行无偿ARP的发送。此外,你可能会注意到,一些系统使用Gratuitous ARP数据包进行对流入流量的负载均衡。

2、IP协议

1. IPV4

要想明白IPv4的作用,你就需要知道流量是如何在不同网络之间传输的。IPv4是这一通信过程的“搬运工”,并且不管通信端点在哪,它最终都负责在设备之间携带数据。

如果网络中的所有设备仅使用集线器或者交换机进行连接,那么这个网络称为局域网(local area network, LAN)。如果想将两个局域网连接起来,那么你可以使用路由器做到这一点。在复杂的网络中,可能包含了成千上万的局域网,而这些局域网则是由世界各地成千上万的路由器连接起来的。互联网本身就是由无数局域网和路由器所组成的一个集合。

1)IPV4地址

IPv4地址是一个32位的地址,用来唯一标识连接到网络的设备。由于让人记住一串32位长的01字符确实比较困难,因此IP地址采用点分四组的表示法。

在点分四组表示法中,构成IP地址的四组1和0中的每一组都转换为以十进制并以A.B.C.D的格式表示0~255之间的数字。

网络工具Netwox和Wireshark详解

我们拿这样一个IP地址11000000 10101000 00000000 00000001举例,这个值显然不容易记忆或者表示,但如果采用点分四组的表示法,我们就可以将其表示为192.168.0.1。

IP地址之所以会被分成4个单独的部分,是因为每个IP地址都包含着两个部分:网络地址和主机地址。网络地址用来标识设备所连接到的局域网,而主机地址则标识这个网络中的设备本身。用来决定究竟IP地址哪部分属于网络或者主机的划分通常并不唯一。

这实际上是由另一组名为网络掩码(network mask)的地址信息所决定的,有时它也会被称为子网掩码(subnet mask)。

网络掩码用来标识IP地址中究竟哪一部分属于网络地址而哪一部分属于主机地址。网络掩码也是32位的,并且网络掩码使用1的部分都是网络地址,而剩下为0的部分则标识着主机地址。

我们以IP地址10.10.1.22为例,其二进制形式为00001010 00001010 00000001 00010110。为了能够区分出IP地址的每一个部分,我们将网络掩码应用其上。

在这个例子中,我们的网络掩码是11111111 11111111 00000000 00000000。这意味着IP地址的前一半(10.10或者00001010 00001010)是网络地址,而后一半(1.22或者00000001 00010110)标识着这个网络上的主机,如图所示。

网络工具Netwox和Wireshark详解

如图所示,网络掩码也可以写成点分四组的形式。比如网络掩码11111111 11111111 00000000 00000000可以被写成255.255.0.0。

为简便起见,IP地址和网络掩码通常会被写成无类型域间选路(Classless Inter-Domain Routing,CIDR)的形式。

在这个形式下,一个完整的IP地址后面会跟有一个左斜杠(/),斜杠右边的数字表示网络部分的位数。

举例来说,IP地址10.10.1.22和网络掩码255.255.0.0,在CIDR表示法下就会被写成10.10.1.22/16的形式。

2)IPv4头

IPv4头有着下列的几个字段:

网络工具Netwox和Wireshark详解

  • 版本号(Version):IP所使用的版本。
  • 首部长度(Header Length):IP头的长度。
  • 服务类型(Type of Service):优先级标志位和服务类型标志位,被路由器用来进行流量的优先排序。
  • 总长度(Total Length):IP头与数据包中数据的长度。
  • 标识符(Identification):一个唯一的标识数字,用来识别一个数据包或者被分片数据包的次序。
  • 标识(Flags):用来标识一个数据包是否是一组分片数据包的一部分。
  • 分片偏移(Fragment Offset):一个数据包是一个分片,这个域中的值就会被用来将数据包以正确的顺序重新组装。
  • 存活时间(Time to Live):用来定义数据包的生存周期,以经过路由器的跳数/秒数进行描述。
  • 协议(Protocol):用来识别在数据包序列中上层协议数据包的类型。
  • 首部校验和(Header Checksum):一个错误检测机制,用来确认IP头的内容没有被损坏或者篡改。
  • 源IP地址(Source IP Address):发出数据包的主机的IP地址。
  • 目的IP地址(Destination IP Address):数据包目的地的IP地址。
  • 选项(Options):保留作额外的IP选项。它包含着源站选路和时间戳的一些选项。
  • 数据(Data):使用IP传递的实际数据。

存活时间(TTL)值定义了在该数据包被丢弃之前所能经历的时间,或者能够经过的最大路由数目。TTL在数据包被创建时就会被定义,而且通常在每次被发往一个路由器的时候减1。

举例来说,如果一个数据包的存活时间是2,那么当它到达第一个路由器的时候,其TTL会被减为1,并被发向第二个路由。接着这个路由会将TTL减为0,这时如果这个数据包的最终目的地不在这个网络中,那么这个数据包就会被丢弃。

由于TTL的值在技术上还是基于时间的,因此一个非常繁忙的路由器可能会将TTL的值减掉不止1,但通常情况下,我们还是可以认为一个路由设备在多数情况下只会将TTL值减1。

为什么TTL的值会这样重要?我们通常所关心的一个数据包的生存周期,只是其从源前往目的地所花去的时间。但是考虑到一个数据包想要通过互联网发往一台主机需要经过数十个路由器,在这个数据包的路径上,它可能会碰到被错误配置的路由器,而失去其到达最终目的地的路径。

在这种情况下,这个路由器可能会做很多事情,其中一件就是将数据包发向一个网络,而产生一个死循环。

如果你有编程背景,那么你就会知道死循环会引发各种问题,一般来说它会导致一个程序或者整个操作系统的崩溃。

理论上,同样的事情也会以数据包的形式发生在网络上。数据包可能会在路由器之间持续循环。随着循环数据包的增多,网络中可用的带宽就会减少,直至拒绝服务(DoS)的情况出现。IP头中的TTL域就是为了防止出现这个潜在的问题。

让我们看一下Wireshark中的实例。文件pcap包含着两个ICMP数据包。ICMP利用IP传递数据包,我们可以通过在Packet Details面板中展开IP头区段看到。

你可以看到IP的版本号为4,IP头的长度是20字节,首部和载荷的总长度是60字节,并且TTL域的值是128。

ICMP ping的主要目的就是测试设备之间的通信。数据从一台主机发往另一个主机作为请求,而后接收主机会将那个数据作为响应发回。这个文件中,一台IP地址为10.10.0.3的设备将一个ICMP请求发向了地址为192.168.0.128的设备。这个原始的捕获文件是在源主机10.10.0.3上被创建的。

网络工具Netwox和Wireshark详解

现在打开pcap文件。在这个文件中,数据在目的主机192.168.0.128处被捕获。展开这个捕获中第一个数据包的IP头,来检查它的TTL值。 

网络工具Netwox和Wireshark详解

你可以立刻注意到TTL的值变为了127,比原先的TTL减少了1。即使不知道网络的结构,我们也可以知道这两台设备是由一台路由器隔开的,并且经过这台路由器的路径会将TTL值减1。 

3)IP分片

数据包分片将一个数据流分为更小的片段,它是IP用于解决跨越不同类型网络时可靠传输的一个特性。基于第 2 层数据链路协议所使用的最大传输单元 MTU(Maximum Transmission Unit)
的大小,默认是 1500 字节(不包含 14 字节的以太网头本身),当数据包大小大于 MTU 时
会被分片。

一个数据包的分片主要基于第2层数据链路协议所使用的最大传输单元(maximum transmission unit, MTU)的大小,以及使用这些第2层协议的设备配置情况。在多数情况下,第2层所使用的数据链路协议是以太网。以太网的默认MTU是1500,也就是说以太网的网络上所能传输的最大报文大小是1500字节(并不包括14字节的以太网头本身)。

虽然存在着标准的MTU设定,但是一个设备的MTU通常可以手工设定。MTU是基于接口进行设定的,其可以在Windows或者Linux系统上修改,也可以在托管路由器的界面上修改。

当一个设备准备传输一个IP数据包时,它将会比较这个数据包的大小,以及将要把这个数据包传送出去的网络接口MTU,用以决定是否需要将这个数据包分片。如果数据包大小大于MTU,那么这个数据包就会被分片。

将一个数据包分片包括下列的步骤:

  1. 设备将数据分为若干个将要接下来进行传输的数据包。
  2. 每个IP头的总长度字段会被设置为每个分片的片段长度。
  3. 除了最后一个分片数据包外,之前所有分片数据包的标志位都被标识为1。
  4. IP头中分片部分的分片偏移将会被设置。
  5. 数据包被发送出去。

下面的pcap文件是从地址为10.10.0.3的计算机上捕获而来的。它向一个地址为192.168.0.128的设备发送ping请求。

注意,在ICMP(ping)请求之后,Packet List面板的Info列中列出了两个被分段的IP数据包。

先检查数据包1的IP头:

网络工具Netwox和Wireshark详解

根据更多分片和分片偏移域,你可以断定这个数据包是分片数据包的一部分。被分片的数据包可能有一个大于0的分片偏移,或者设定了更多分片的标志位。在第一个数据包中,更多分片标志位被设定,意味着接收设备应该等待接收序列中的另一个数据包。分片偏移被设为0,意味着这个数据包是这一系列分片中的第一个。

第二个数据包的IP头,同样被设定了更多分片的标志位,但在这里分片偏移的值是1480。这里明显意味着1500字节的MTU,减去了IP头的20字节。 

网络工具Netwox和Wireshark详解

第三个数据包,并没有设定更多分片标志位,也就意味着它被标记为整个数据流中的最后一个分片。并且其分片偏移被设定为2960,也就是1480+(1500−20)的结果。这些分片可以被认为是同一个数据序列的一部分,因为它们在IP头中的标识位字段中拥有相同的值。 

网络工具Netwox和Wireshark详解

虽然网络上被分片的包不怎么常见,但明白数据包为什么会被分片是有用的,这样当遇到它们时,你就可以诊断问题所在或认出丢失的分片。

2. IPV6

当制定IPv4规范时,我们其实并不知道今天最终有多少个连接到互联网的设备。IPv4的最大地址空间仅允许有4.3亿个地址。但实际上减去特殊用途的预留地址,比如测试地址、广播地址、RFC1918内网地址等,实际可用的地址空间更加有限。尽管已经实施了一些延缓IPv4地址耗尽的措施,解决这一问题的唯一途径还是要再开发IP规范的新版本。

于是,IPv6的第一个版本——RFC 2460于1998年发布。这一版提供了一些性能上的改进,包括更大的地址空间。我们将介绍IPv6的报文结构和它不同以往的通信方式。

1)IPv6地址

IPv4地址被局限在32位,这意味着该长度只能提供亿级的地址空间。IPv6地址有128位,可以提供2的128次方的地址空间(万亿万亿万亿级别)。这一升级十分可观!

因为IPv6地址是128位的,所以用二进制表示就不太方便了。在大多数情况下,IPv6地址用8组2字节的十六进制数表示,每组用分号隔开。

举个简单的例子,一个IPv6地址就像这样:

1111:aaaa:2222:bbbb:3333:cccc:4444:dddd

当一眼扫过IPv6地址时,你的想法可能跟那些习惯于记忆IPv4地址的人一样:IPv6地址看起来不可能记住。这也是换取更大地址空间的不幸代价。

不过IPv6地址记法的一个特性是一些值为0的组可以省略。

比如,考虑以下的IPv6地址:

1111:0000:2222:0000:3333:4444:5555:6666

你可以省略掉其中全是0的一个组,让0不可见,就像这样:

1111::2222:0000:3333:4444:5555:6666

然而,你一次只能省略一个值为0的组,所以下面的地址是无效的:

1111::2222::3333:4444:5555:6666

还有一种简化的方法就是把IPv6地址前置的0都省略掉。考虑下面这个例子,第4组、第5组、第6组前面都有0:

1111:0000:2222:0333:0044:0005:ffff:ffff

你可以通过下面的方式更有效地表示地址:

1111::2222:333:44:5:ffff:ffff

这可能没有IPv4地址那么易用,但起码比更长的地址好处理得多。

一个IPv6地址分为网络部分和主机部分,分别称为网络前缀(network prefix)和接口标识符(interface identifier),这两个部分在地址上的分布取决于IPv6的通信类型。

IPv6通信有3种类别:单播(unicast)、任播(anycast)和多播(multicast)。

在大多数情况下,你应该会遇到本地连接之间的单播,就是在单一网络中的一个设备和另一个设备的通信。

单播本地连接的IPv6格式如图所示:

网络工具Netwox和Wireshark详解

在同一网络下和另一个设备通信需要用到本地连接地址。一个本地连接地址的前10个最高有效位被设置为1111111010,紧接着的54位被设置成0。

所以,当你看到一个地址的前半部分是fe80:0000:0000:0000时,你就可以认出这是一个本地连接地址。

本地连接IPv6地址的另一半是接口ID部分,它表明了在网络上唯一的一个主机端点。在以太网中,这是基于MAC地址而来的。然而,MAC地址只有48位。要把64位全部填满,MAC地址先被切成两半,然后值0xfffe在两边被当作补码附属上,组成一个唯一的标识符。

最后,反转第一个字节的第7位比特。这可能稍显复杂,但请看下图所示的接口ID。

网络工具Netwox和Wireshark详解

原设备的MAC地址是78:31:c1:cb:b2:56。字节0xfffe先被加到中间,然后通过反转8变成了a。

IPv6地址簇可以用CIDR的记法来表示,与IPv4地址簇记法相似。在本例中,64位的地址空间被表示为一个本地连接地址:

fe80:0000:0000:0000:/64

当单播流量在公网上传播时,IPv6地址的组成会发生变化。

网络工具Netwox和Wireshark详解

当使用这种方式时,全局单播通过将前3位设置为001,加上45位全局路由前缀来标识。全局路由前缀由互联网数字分配机构(IANA)分配,它可以唯一地标识一个组织的地址空间。接下来的16位是子网ID,它可以用来划分地址,类似于IPv4地址的子网掩码。最后64位被用来当作接口ID,类似于本地连接地址。路由前缀和子网ID可以依据大小而发生变化。

从视觉上区分IPv4和IPv6地址是很容易的,但是对于很多程序来说并没有那么简单。如果你需要指定一个IPv6地址,比如一些类似于浏览器和命令行工具的应用要求你在地址两旁加上中括号,类似[1111::2222:333:44:5:ffff]。

2)IPv6包结构

IPv6的报头在易读的设计理念下已经扩展到支持更多的特性。摒弃了报头要提供一个大小值的设计,IPv6报头现在被固定在40字节。额外的选项通过拓展报头来实现。这样设计有它的好处,大多数路由器转发数据包只需要处理40字节的报头。

IPv6报头分为以下部分:

网络工具Netwox和Wireshark详解

  • 版本号:IP协议的版本(这里IPv6值永远是6)。
  • 流量优先级:用于QoS(服务质量)中区分特定流量的优先级次序。
  • 流标签:源用来标识同一个流里面的报文,这个部分通常使用在QoS管理中来确认报文来自于同一路径的同一流。
  • 载荷长度:表明该IPv6包头部后包含的字节数,包含扩展头部。
  • 下一包报头:该字段用来指明报头后接的第4层的报文头部的类型,该部分替代了IPv4报头中的“协议”字段。
  • 跳数限制:定义了一个报文的生命周期,该字段替代了IPv4报头中的TTL,每次转发跳数减1,该字段达到0时包将会被丢弃。
  • 源地址:标识该报文的来源IP地址。
  • 目的地址:标识该报文的目的IP地址。

现在让我们通过一个pcapng文件来比较IPv4和IPv6报文之间的不同。在这个捕获文件里,一个Web服务器在同一台物理主机上同时监听IPv4和IPv6链接。一个同时具有IPv4和IPv6地址的客户端分别独自使用两种地址浏览服务器并使用curl应用通过HTTP下载index.php页面。 

网络工具Netwox和Wireshark详解

这里的含义与IPv4有很大的差别:

为什么要引入扩展头部这个概念,这里也是IPv6对IPv4改进的一个方面,用扩展头部取代了IPv4的可选项信息,精简了IPv6的头部,增强了IPv6的扩展性。有同学会不会有疑问,IPv6的分片数据报文怎么处理?其实就是使用了IPv6扩展头部。

我们来抓一个UDP分片报文来看看:

网络工具Netwox和Wireshark详解

  • 源IP和目的IP的格式不一样。
  • IPv4的报文总长60字节,大小总共74字节,包括IPv4报头和14字节的以太网报头。IPv6的报文总共96字节,包括一个40字节的IPv6载荷、另一个40字节的IPv6报头和14字节的以太网报头。IPv6为了有更大的地址空间而将报头设为40字节,是20字节IPv4报头的2倍。
  • IPv4通过“协议”字段来确定下一层的协议类型,而IPv6通过“下一包报头”字段(也可以用来指明拓展报头)。
  • IPv4有TTL值,而IPv6使用跳数限制来实现相同功能。
  • IPv4包含报头校验和值,而IPv6没有。
  • 该IPv4报文没有被分片,但是仍然包含设置这些选项的值。IPv6不会包含这些信息,因为如果有需要会在拓展报头里实现。 
  • 当IPv6数据报文承载的是上层协议ICMPv6、TCP、UDP等的时候,Next Header的值分别为58、6、17,这个时候和IPv4报文头部中的Protocol字段很类似;
  • 当不是以上3种协议类型的时候,IPv6报文头部紧接的是扩展头部。扩展头部是IPv6引入的一个新的概念,每个IPv6的数据报文可以承载0个或多个扩展头部,扩展头部通过链表的形式组织起来。当IPv6数据报文承载着扩展头部的时候,Next Header的数值为扩展头部的类型值。

当发送一个分片IPv6数据报文的时候,IPv6使用的是扩展头部的形式组织各个分片的信息,如图IPv6报文头部Next Header字段值为44表示存在扩展头部,扩展头部是IPv6分片数据信息。

对比IPv4,分片信息是记录在IPv4报文头部的分片字段中。

IPv6的扩展头部类型有很多种,除了上述的分片头部,还有路由头部、逐跳可选头部等,具体的可以参考RFC2460

 3)邻居请求和ARP

在之前讨论不同类型的流量时,我列出了单播、多播、任播却没有说广播。IPv6不支持广播流量,因为广播被认为是低效的传输机制。正是因为没有广播,所以主机之间互相寻找的ARP协议无法使用。那么,IPv6设备是怎么互相发现的呢?

答案取决于一个叫作邻居请求(neighbor solicitation)的新特性,它利用ICMP6来完成工作,是邻居发现协议(NDP)的一项功能。要完成这项工作,ICMP6使用多播。多播是指把信息同时传递给一组目的地址,只有订阅了数据流的主机才会收到和处理数据。多播流量很好辨认,因为它们有自己保留的IP空间(ff00::/8)。

尽管地址解析过程依赖于一个不同的协议,它依然使用非常简易的请求/回复模型。例如,让我们假设一种场景。在这个场景中一个IPv6地址是2001:db8:1:2::1003的主机想要和另一个地址为2001:db8:1:2::1000的主机通信。类似IPv4,因为在同一网络下通信,源设备必须要知道目的数据链路层的MAC地址。

这个过程如图所示:

网络工具Netwox和Wireshark详解

在这个过程中,主机2001:db8:1:2::1003通过多播发送一个邻居请求(ICMPv6 135类型)报文到每一个在网络上的设备,请求道:“IP地址是2001:db8:1:2::1000的设备的MAC地址是什么?我的MAC地址是00:0C:29:2f:80:31。”

拥有这个IP地址的设备会收到这个消息,并使用邻居通告(ICMPv6 136类型)回复源主机,回复道:“嗨!我的网络地址是2001:db8:1:2::1000,并且我的MAC地址是00:0c:29:1f:a7:55。”一旦这条消息被对方接收到,那么通信就可以开始了。

捕获的流量中包含我们讨论的这个例子:2001:db8:1:2::1003想要与2001:db8:1:2::1000通信。我们查看第一个包并在数据包细节窗口展开ICMPv6部分。我们可以看到这是ICMP 135类型的包,并且由2001:db8:1:2::1003发往多播地址ff02::1:ff00:1000。源主机提供了想要进行通信的目标IPv6地址,并跟随着自己第二层的MAC地址。

对该邻居请求的回复可以在这个捕获文件的第二个数据包中找到。在数据包细节窗口展开ICMPv6部分,显示这是ICMP 136类型的包,由2001:db8:1:2::1000回复至2001:db8:1:2::1003,并且包含着2001:db8:1:2::1000的MAC地址00:0c:29:1f:a7:55。

一旦这个过程完成,2001:db8:1:2::1003和2001:db8:1:2::1000就开始正常ICMP6会话了。你可以看到echo请求和echo回复流量,这意味着邻居请求和数据链路层的地址解析成功了。

4)IPv6分片

IPv4报头内置分片支持,因为协议要确认报文能够穿过所有MTU值不同的网络。在IPv6里,很少用到分片,所以这一选项没有包含在IPv6报头里。一个传输IPv6报文的设备在发送之前会执行一个叫作MTU探索的过程,该过程会决定报文的最大容量。一旦路由器收到了比下一层网络MTU还大的报文,路由器就会丢掉那个包,并且返回一个“报文太大”的ICMPv6消息给源主机。

如果上一层协议支持,则源主机收到消息后,会尝试对报文进行分片,然后重新发送。这个过程会一直重复,直到达到足够小的MTU或者载荷不能够再被分片下去。路由器是永远不会负责对报文进行分片的。源设备负责选择一个在传输路径中合适的MTU值,并对报文进行适当分片。

如果IPv6上层协议不能限制载荷的大小,那么就必须使用分片。要实现分片功能,会在IPv6报文上添加一个分片拓展报头。你会在pcapng捕获文件中找到IPv6分片的样例流量。

正因为接收端设备比发送端设备的MTU值小,所以在捕获文件里分别有两个被分片的报文,来表示每一个ICMP6 echo请求和回复。

数据包中的分片报头如图所示:

网络工具Netwox和Wireshark详解

8字节的拓展报头包含了和IPv4中分片一样的属性,例如分片偏移、更多分片标志、标志字段等。IPv6只会在需要分片的时候在报文后面加上这些,而不是加到每个报文中。这种机制更有效率,它允许接收系统重组分片。此外,如果有拓展报头,那么“下一个报文”域将会指向拓展报头,而不是它要封装的下一层协议。

5)IPv6转换协议

IPv6指出了一个非常现实的问题,但转换现有网络架构所需的代价导致其普及非常缓慢。要简化这种转换,就需要一些协议让IPv6会话可以在仅支持IPv4的网络中通过隧道传输。

在此,隧道意味着IPv6会话是封装在IPv4会话当中的,就像其他可以被IPv4封装的协议一样。

封装通常通过以下3种方式。

路由器到路由器:使用一个隧道来封装IPv6流量,使得来自一边网络的收发主机可以访问另一边的IPv4网络。这种方法可以让整个网络使用IPv6,网络内部有IPv4连接节点。

主机到路由器:在路由层封装用来传输从IPv6主机穿过IPv4网络的流量。这种方法允许在IPv4网络里单一支持IPv6的主机访问外部IPv6网络。

主机到主机:在两个端点之间封装IPv6流量。这个方法允许两个IPv6端点直接穿过IPv4网络通信。

下面列举了几个常见的协议。

6to4:也叫IPv6 over IPv4,这是一个可以让IPv6的包在IPv4网络中传输的协议。该协议给中继站或路由器提供路由器到路由器、主机到路由器、主机到主机的支持。

Teredo;当在IPv4网络中使用NAT(网络地址翻译)时,这个协议提供IPv6单播通信服务。该协议把IPv6报文封装到UDP传输协议里,最后通过IPv4发出去。

ISATAP:这个本地协议允许在同一网络下的仅支持IPv4或IPv6的主机和主机之间的通信。

3、ICMP协议

互联网控制消息协议(Internet Control Message Protocol, ICMP)是TCP/IP协议族中的一个功能协议,负责提供在TCP/IP网络上的设备、服务以及路由器可用性的信息。大多数网络检修技巧和工具都是基于常用的ICMP消息类型。ICMP在RFC792中定义。

1)ICMP头

ICMP是IP的一部分并依赖IP来传递消息,ICMP头相对较小并根据用途而改变。

网络工具Netwox和Wireshark详解

如图所示,ICMP头包含了以下几个字段。

网络工具Netwox和Wireshark详解

  • 类型(Type):ICMP消息基于RFC规范的类型或分类。
  • 代码(Code):ICMP消息基于RFC规范的子类型。
  • 校验和(Checksum):用来保证ICMP头和数据在抵达目的地时的完整性。
  • 可变域(Variable):依赖于类型和代码域的部分。 

2)ICMP类型和消息

正如刚才所说,ICMP数据包的结构取决于由Type和Code域中的值所定义的用途。

你可以将ICMP的类型域作为数据包的分类,而Code域作为它的子类。

举例来说,Type域的值为3时意味着目标不可达(Destination Unreachable)。但只有这个信息可能不足以发现问题,当数据包在Code域中指明值为3,也就是端口不可达(Port Unreachable)时,你就可以知道这应该是你试图进行通信的端口的问题。

ICMP 类型和代码:

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解网络工具Netwox和Wireshark详解

具体请参考官网:Internet Control Message Protocol (ICMP) Parameters

3)Echo请求与响应

ICMP因为ping工具而广为人知。ping用来检测一个设备的可连接性。大多数信息技术专家都对ping很熟悉。

在命令行中输入ping <ip地址>,其中将<ip地址>替换为网络上的一个实际IP地址,就可以使用ping了。如果目标设备在线,你的计算机有到达目标的通路,并且没有防火墙隔离通信的话,你将能够看到你的ping命令的响应。

在下图的例子中,给出了4个成功显示了大小、RTT和TTL的响应。Windows还会提供一个总结信息,告诉你有多少数据包被发送、接收或者丢失。如果通信失败,会有一条信息告诉你原因。

网络工具Netwox和Wireshark详解

基本上来说,ping命令每次向一个设备发送一个数据包,并等待回复,以确定是否存在连接 。

虽然ping对于IT业必不可少,但当部署了基于主机的防火墙时,它的结果就可能具有欺骗性了。现在的很多防火墙都限制了设备去响应ICMP数据包。

这样对于安全性是有帮助的,因为潜在的攻击者可能会在使用ping来判断主机是否可达时,放弃进一步的行动。但这样故障排除也变得困难了起来——当知道你可以和一台设备通信时,使用ping检测连接却收不到任何响应会让你很抓狂。

ping功能在实际中是简单ICMP通信的一个很好的例子。下面的pcap文件中的数据包会告诉你在运行ping时都发生了什么。

第一个数据包显示主机192.168.100.138在给192.168.100.1发送数据包。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

当你展开这个数据包的ICMP区段时,可通过查看类型和代码域,判断ICMP数据包的类型。在这个例子中,数据包的类型是8,代码是0,意味着这是一个echo请求(Wireshark会告诉你所显示的类型/代码究竟是什么意思)。这个echo(ping)请求是整个过程的前一半。

这是一个简单的ICMP数据包,它使用IP发送,包含了很少的数据。除了指定类型、代码以及校验和,我们还会有一个序列号用来匹配请求和响应,另外,在ICMP数据包可变域还有一串随机文本字符。

echo和ping经常会被混用,但记住,ping实际上是一个工具的名字。ping工具用来发送ICMP的echo请求数据包。

这个序列的第二个数据包是对我们请求的响应。这个数据包的ICMP区段类型是0,代码是0,表示这是一个echo响应。

网络工具Netwox和Wireshark详解

由于第二个数据包的序列号与第一个相匹配,因此我们可以知道这个echo响应包对应着之前的那个echo请求数据包。这个响应数据包中有着和初始请求中传输的32位字符串一样的内容。在第二个数据包被192.168.100.138成功接收到之后,ping就会报告成功。

你还可以使用ping的选项来增加它的数据填充,这样在检测不同类型的网络时,就可以强制将数据包分片。这在检测具有较小分片大小的网络时会用到。

ICMP的echo请求使用的随机文本可能会引起潜在攻击者的兴趣。攻击者可能会用这段填充的内容,来推测设备所使用的操作系统。并且攻击者可能会在这个域中放置一些数据位,作为反向连接的手段。

4)路由跟踪

路由跟踪功能用来识别一个设备到另一个设备的通路。在一个简单的网络上,这个通路可能只经过一个路由器,甚至一个都不经过。但在复杂的网络中,数据包可能要经过数十个路由器才会到达最终目的地。确定数据包从一个目的地到另一个目的地的实际路径,对于通信检修十分重要。  

通过使用ICMP(在IP协议的帮助下),路由跟踪可以画出数据包的路径。举例来说,pcap文件中的第一个数据包,和我们前面看到的echo请求很类似。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

乍看起来,这个数据包就是一个从192.168.100.138到4.2.2.1的简单echo请求,并且ICMP中的每一个部分都与echo请求数据包相同。但是当展开这个数据包的IP头时,你可以注意到一个奇怪的数字。这个数据包的TTL被设为了1,也就意味着这个数据包会在它遇到的第一个路由器处被丢掉。

因为目标地址4.2.2.1是一个互联网地址,我们就会知道源设备和目的设备之前至少会有一个路由器,所以这个数据包不会到达目的地。这对我们来说是个好事,因为路由跟踪正是需要这个数据包只到达它传输的第一个路由器。

第二个数据包正如所期望的那样,是前往目的地路径上第一个路由器发回的响应。在数据包到达192.168.100.1这个设备后,它的TTL减为0,所以它不能继续传输,于是路由器回复了一个ICMP响应。

这个数据包的类型是11,代码是0,也就是告诉我们由于数据包的TTL在传输过程中超时,因此目的不可达。

网络工具Netwox和Wireshark详解

这个ICMP数据包有时候被叫作双头包,因为这个ICMP的结尾部分包含了原先echo请求的IP头和ICMP数据的副本。这个信息被证明在网络检修的时候非常有用。

在第7个数据包前,这种发送TTL自增数据包的过程又出现了两次。在这里,除了IP头的TTL值被设为了2,从而保证这个数据包会在被丢弃前到达第二跳路由,你还可以看到和第一个数据包相同的东西。

和我们所期望的一样,我们从下一跳的路由12.180.241.1接到了一个有着同样ICMP目的不可达和TTL超时的响应消息。这种将TTL自增1的过程,一直持续到数据包到达目的地址4.2.2.1。

总结来说,路由跟踪要与路径上的每一个路由器进行通信,从而画出前往目的地的路由图,如图所示。

网络工具Netwox和Wireshark详解

路由跟踪将 TTL 自加 1 的过程一直持续直到到达目的地 4.2.2.1,与路径上每一个路由器进行通信,从而画出前往目的地的路由图。

5)ICMP数据包的抓取

最后我们再来研究一下ICMP数据包的抓取。最常用的,是使用ping工具进行捕获,也可以尝试使用tracert来尝试抓取。

在虚拟机中,打开命令提示符,输入tracert加上目标IP地址(主机IP):

tracert 172.21.79.153

然后看一下Wireshark的抓取结果:

6)ICMPv6

新版的IPv6协议依赖ICMP来进行邻居请求和路径探索,就像之前演示的几个例子那样。ICMPv6随RFC4443而建立,它用来支持IPv6的特性,还有其他一些额外增强。

ICMPv6,它使用和ICMP一样的报文结构。ICMPv6报文一般被归类为错误消息或报告消息。你可以在IANA上查找到全部可用的类型以及对应的代码。

九、传输层流量分析

传输控制协议(Transmission Control Protocol, TCP)的最终目的是为数据提供可靠的端到端传输。TCP在RFC793中定义,它能够处理数据的顺序并恢复错误,并且最终保证数据能够到达目的地。TCP被认为是一个面向连接的协议。

因为它在传输数据之前会事先发起一个正式的连接,用来追踪数据包的递送。当传输要结束时,它会尝试正式地关闭会话通道。很多普遍使用的应用层协议都依赖于TCP和IP将数据包传输到最终目的地。

1、传输控制协议TCP(Transmission Control Protocol)

1. TCP报头

TCP提供了许多功能,并且反映在了其头部的复杂性上面。

如图所示,是TCP报头的字段。

网络工具Netwox和Wireshark详解

源端口(Source Port):用来传输数据包的端口。

目的端口(Destination Port):数据包将要被发送到的端口。

序号(Sequence Number):这个数字用来表示一个TCP片段,这个域用来保证数据流中的部分没有缺失。

确认号(Acknowledgment Number):这个数字是在通信中希望从另一个设备中得到的下一个数据包的序号。

标志(Flags):URG ACK PSH RST SYN和FIN标志都用来表示所传输的TCP数据包的类型。

窗口大小(Window Size):TCP接收者缓冲的字节大小。

校验和(Checksum):用来保证TCP头和数据的内容在抵达目的地时的完整性。 

紧急指针(Urgent Pointer):如果设置了URG位,则这个域将被检查作为额外的指令,告诉CPU从数据包的哪里开始读取数据。

选项(Options):各种可选项,可以在TCP数据包中进行指定。

2. TCP端口

所有TCP通信都会使用源端口和目的端口,而这些可以在每个TCP头中找到。端口就像是老式电话总机上的插口。一个总机操作员会监视着一个面板上的指示灯和插头,当指示灯亮起的时候,他就会连接这个呼叫者,问她想要和谁通话,然后插一根电缆将她和她的目的位置连接起来。每次呼叫都需要有一个源端口(呼叫者)和一个目的端口(接收者)。TCP端口大概就是这样工作的。

为了能够将数据传输到远程服务器或设备的特定应用中去,TCP数据包必须知道远程服务所监听的端口。如果你想要试着连接其他端口,那么这个通信就会失败。

这个序列中的源端口并不十分重要,所以可以随机选择。远程服务器也可以很轻易地从发送过来的原始数据包中得到这个端口。

在使用TCP进行通信的时候,我们有65535个端口可供使用,并通常将这些端口分成两个部分。

1~1023是标准端口组(忽略掉被预留的0),特定服务会用到这些通常位于标准端口分组中的标准端口。

1024~65535是临时端口组(尽管一些操作系统对此有着不同的定义),当一个服务想在任何时间使用端口进行通信的时候,现代操作系统都会随机地选择一个源端口,让通信使用唯一源端口。这些源端口通常就位于临时端口组。

让我们打开pcapng文件,看一下一些不同的TCP数据包,并识别出它们所使用的端口号。在这个文件中,我们会看到一个客户端在浏览两个网站时产生的HTTP通信。正如前面所提到的HTTP使用TCP进行通信,这将是一个非常典型的TCP流量案例。

在这个文件中的第一个数据包中,一开始的两个值代表着这个数据包的源端口和目的端口。这个数据包从172.16.16.128发往212.58.226.142,它的源端口是属于临时端口组的2826(需要记住的是,源端口是由操作系统随机选取的,尽管它们可能会在随机选择的过程中选择递增策略)。目的端口是一个标准端口——80端口。这个标准端口正是提供给使用HTTP的Web服务器使用的。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

你可能会注意到Wireshark将这些端口打上了slc-systemlog(2826)和http(80)的标签。

Wireshark会维护一个端口的列表,并记录它们普遍的应用。虽然列表还是以标准端口为主,但很多临时端口也关联着常用的服务。这些端口的标签可能会让人迷惑,所以一般来说最好通过关闭传输名称解析来禁用它。

选择Edit -> Preference -> Name Resolution,然后取消勾选Enable Transport Name Resolution就可以将其禁用了。如果你希望保留开启这个功能但改变Wireshark对于每一个端口的识别,则可以通过改变Wireshark程序目录下的Services文件来实现。

这个文件是根据互联网数字分配机构(Internet Assigned Numbers Authority, IANA)的通用端口列表编写的。

第二个数据包是由212.58.226.142发往172.16.16.128的。除了IP地址之外,源端口和目的端口也同样有所改变。 

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

所有基于TCP的通信都以相同的方式工作:选择一个随机的源端口与一个已知的目的端口进行通信。在发出初始数据包之后,远程设备就会与源设备使用建立起的端口进行通信。

在这个样例捕获文件中还有另外一个通信流,你可以试着找出它通信时使用的端口。 

3. TCP的三次握手

所有基于TCP的通信都需要从两台主机的握手开始。这个握手过程主要希望能达到这样一些目的。

  • 保证传输主机可以确定目的主机在线并且进行通信。
  • 让传输主机确定目标主机在监听传输主机试图连接的端口。
  • 允许传输主机向目标主机发送它的起始序列号,使得两台主机可以将这一会话保持得井然有序。

TCP握手分为3个步骤,在第一步中,主动发起通信的设备(主机A)向目标(主机B)发送了一个TCP数据包。这个初始数据包除了底层协议头之外不包含任何数据。这个数据包的TCP头设置了SYN标志,并包含了在通信过程中会用到的初始序列号和最大分段大小(MSS)。

网络工具Netwox和Wireshark详解

主机B对于这个数据包回复了一个类似的设置了SYN和ACK标志以及包含了它初始序列号的数据包。最后,主机A向主机B发送最后一个仅设置了ACK标志的数据包。在这个过程完成之后,双方设备应该已经具有了开始正常通信所需的信息。

TCP数据包在称呼上通常会被其设置的标志所代表。比如,对于设置了SYN标志的TCP数据包,我们将会简称其为SYN包。因此TCP握手过程中使用的数据包会被称为SYN包、SYN/ACK包和 ACK包。

打开pcapng文件,可以更直观地看到这个过程。Wireshark为了分析的简便,引入了一个特性,可以将TCP数据包的序列号替换为相对值。

但在这里,我们将这个功能关闭,以便于能看到实际的序列号值。选择Edit -> Preferences,展开Protocols并选择TCP,然后取消勾选Relative Sequence Numbers and Window Scaling框,并单击OK就可以禁用了。

网络工具Netwox和Wireshark详解

这个捕获中的第一个数据包是我们的初始SYN数据包。

这个数据包从172.16.16.128的2826端口发往212.58.226.142的80端口。我们可以看到这里传输的序列号是3691127924。

网络工具Netwox和Wireshark详解

握手中第二个数据包是从212.58.226.142发出的SYN/ACK响应。这个数据包也包含着这台主机的初始序列号(233779340)以及一个确认号(2691127925)。这个确认号比之前的那个数据包序列号大1,因为这个域是用来表示主机所期望得到的下一个序列号的值的。 

网络工具Netwox和Wireshark详解

最后的数据包是从172.16.16.128 发出的ACK数据包。这个数据包正如所期望的那样,包含着之前数据包确认号域所定义的序列号3691127925。 

网络工具Netwox和Wireshark详解

握手发生在每个TCP的通信序列之前。当在一个繁忙的捕获文件中搜索通信序列的开头时,序列SYN、SYN/ACK、ACK是一个很好的标志。 

4. TCP的四次挥手

所有的问候最终都会有一句再见,在TCP中,每一个握手和终止使得连接有始有终。TCP终止用来在两台设备完成通信后正常地结束连接。这个过程包含4个数据包,并且用一个FIN标志来表明连接的终结。

在一个终止序列中,主机A通过发送一个设置了FIN和ACK标志的TCP数据包,告诉主机B通信完成。主机B以一个ACK数据包响应,并传输自己的FIN/ACK数据包。主机A响应一个ACK数据包,然后结束通信过程。这个过程如图所示。

网络工具Netwox和Wireshark详解

打开pcapng文件可以在Wireshark中看到这个过程。在序列的第一个数据包,你可以看到位于67.228.110.120的设备通过发送有着FIN和ACK标志的数据包,来开始终止过程。 

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

在这个数据包被发出去之后,172.16.16.128使用了一个ACK数据包进行响应,来确认第一个数据包的接收,然后发送了一个FIN/ACK数据包。整个过程在67.228.110.120发送了最终的ACK之后结束。这时,这两个设备的通信便已经结束,如果想要再次开始通信就必须完成新的TCP握手。

5. TCP重置

在理想情况下,每一个连接都会以TCP终止来正常结束。但在现实中,连接经常会突然断掉。举例来说,这可能是由于一个潜在的攻击者正在进行端口扫描,或者仅仅是主机配置错误所导致。在这些情况下,就需要使用设置了RST标志的TCP数据包。RST标志用来指出连接被异常中止,或拒绝连接请求。

以下pcapng文件给出了一个包含有RST数据包网络流量的例子。这个文件中的第一个数据包来自192.168.100.138,其尝试与192.168.100.1的80端口进行通信。这个主机不知道192.168.100.1并没有在监听80端口,因为那是一个思科路由器,并且并没有配置Web接口,也就是说并没有服务监听80端口的连接。

为了响应这个连接请求,192.168.100.1向192.168.100.138发送了一个数据包,告诉它其对于80端口的通信无效。下图中展示了在第二个数据包的TCP头中这个连接尝试突然终止的情况。RST数据包除了包含RST和ACK标志外,没有任何其他的东西,之后也并没有额外的通信。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

RST数据包会在尝试通信序列的开始(就像这个例子一样)或者在主机通信的中途,来终止通信。 

2、用户数据报协议UDP(User Datagram Protocol)

户数据报协议(User Datagram Protocol, UDP)是在现代网络中较常使用的另外一种第4层协议。如果说TCP是为了满足带有内在错误检测的可靠数据传输,那么UDP主要是为了提供高速的传输。出于这个原因,UDP是一种尽力服务,通常会被称为无连接协议。一个无连接协议并不会正式地建立和结束主机之间的连接,也不会像TCP那样存在握手和终止过程。

无连接协议也就意味着不提供可靠性服务,这么看上去UDP流量一点都不稳定。事实上也正是如此,但依赖于UDP的协议通常都会有其自己内置的可靠性服务,或者使用ICMP的一些功能,来保证连接更可靠一些。举例来说,应用层协议DNS和DHCP高度依赖于数据包在网络上传输的速度,虽然使用了UDP作为它们的传输层协议,但还是它们自己进行错误检查以及重传计时。

1. UDP报头结构

UDP头比TCP头要小得多,也简单得多。

以下是UDP报头的字段:

网络工具Netwox和Wireshark详解

源端口:用来传输数据包的端口。

目标端口:数据包将要被传输到的端口。

数据包长度:数据包的字节长度。

校验和:用来确保UDP头和数据到达时的完整性。

pcapng文件中包含有一个数据包,这个数据包是一个使用UDP的DNS请求。当展开这个数据包的UDP头时,你可以看到4个域。

网络工具Netwox和Wireshark详解

需要记住的是,UDP并不关心传输的可靠性,所以任何使用UDP的应用在必要的时候都需要采取特殊的步骤,保证可靠的传输。这一点和TCP相反,TCP有自己的一套连接正式发起和结束的程序,也有自己的一些机制来校验数据包的成功传输。

不像网络层协议,TCP和UDP是日常在绝大多数网络上交互的核心,因此能否掌握有效分析它们的能力将会决定你能否成为一位数据包分析大师。

十、应用层流量分析

1、动态主机配置协议DHCP

在网络时代的早期,当一台设备想要在网络上通信时,它需要被手动分配一个地址。随着网络的发展,这样的手动过程很快就变得烦琐起来。为了解决这个问题,BOOTP协议(Bootstrap Protocol)问世,它主要的作用是给连接到网络的设备自动分配地址。BOOTP后来被更加复杂的动态主机配置协议DHCP(Dynamic Host Configuration Protocol)所取代。

DHCP是一个应用层协议,负责让设备能够自动获取IP地址(以及其他重要的网络资源,比如DNS服务器和路由网关的地址)。今天大多数的DHCP服务器都向客户端提供其他的一些参数,比如网络上的默认网关和DNS服务器的地址。

1. DHCP头结构

DHCP数据包会为客户端带来很多信息。如图所示,以下字段都会在DHCP数据包中出现。

网络工具Netwox和Wireshark详解

操作码(OpCode):用来指出这个数据包是DHCP请求还是DHCP回复。

硬件类型(Hardware Type):硬件地址类型(10MB以太网、IEEE802、ATM以及其他)。

硬件地址长度(Hardware Length):硬件地址的长度。

跳数(Hops):中继代理用以帮助寻找DHCP服务器。

事务ID(Transaction ID):用来匹配请求和响应的一个随机数。 

消耗时间(Seconds Elapsed):从客户端第一次向DHCP服务器发出地址请求到获得响应所需要的时间。

标志(Flags):DHCP客户端能够接收的流量类型(单播、广播以及其他)。

客户端IP地址(Client IP Address):客户端的IP地址(由“你的”IP地址域派生)。

“你的”IP地址(Your IP Address):DHCP服务器提供的IP地址(最终成为客户端IP地址域的值)。

服务器IP地址(Server IP Address):DHCP服务器的IP地址。

网关IP地址(Gateway IP Address):网络默认网关的IP地址。

客户端硬件地址(Client Hardware Address):客户端的MAC地址。

服务器主机名(Server Host Name):服务器的主机名(可选)。

启动文件(Boot File):DHCP所使用的启动文件(可选)。

选项(Options):用来对DHCP数据包进行扩展,以提供更多功能。

2. DHCP续租过程

DHCP的主要任务就是在续租过程中向客户端分配IP地址。续租过程在一个客户端和DHCP服务器之间进行。

DHCP的续租过程通常被称为DORA过程,因为它使用了4种类型的DHCP数据包:发现(Discover)、提供(Offer)、请求(Request)和确认(Acknowledgement),如图所示。

网络工具Netwox和Wireshark详解

在这里,我们将对DORA数据包的每种类型进行逐一介绍。 

1)发现数据包

正如在引用的捕获文件中看到的那样,第一个数据包从0.0.0.0的68端口发往255.255.255.255的67端口。客户端使用0.0.0.0,是因为它目前还没有IP地址。数据包被发往255.255.255.255,是因为这是一个独立于网络的广播地址,从而确保这个数据包会被发往网络上的每台设备。因为这台设备并不知道DHCP服务器的地址,所以它的第一个数据包是为了寻找正在监听的DHCP服务器。

在Packet Details面板中,我们第一眼就可以看到DHCP是基于UDP作为传输层协议的。DHCP对于客户端得到其所请求信息的速度有很高的要求。由于DHCP有其内置的保证可靠性的方法,因此也就意味着UDP是比较适合的协议。

你可以在第一个数据包的Packet Details面板的DHCP部分,查看发现过程的细节,如图所示。

网络工具Netwox和Wireshark详解

由于Wireshark在处理DHCP时,仍然会引用BOOTP,因此你会在Packets Detail面板中看到BOOTP协议,而不是DHCP。

这是一个请求数据包,在消息类型域中标识为1。发现数据包中的大多数字段或者为空(就像是IP地址域);或者根据前面所列出的DHCP字段,就已经解释的很清楚了。这个数据包的主要内容是这4个字段。

DHCP消息类型:这里的选项类型为53(t=53),长度为1,它的值为1。这些值表明这是一个DHCP发现数据包。

客户端标识符:这里提供了客户端请求IP地址的额外信息。

所请求IP地址:这里提供了客户端希望得到的IP地址(通常是之前用过的IP地址)。

请求参数列表:这里列出了客户端希望从DHCP服务器接收到的不同配置项(其他重要网络设备的IP地址)。 

2)提供数据包

这个文件的第二个数据包在IP头中列出了可用的IP地址,显示这个数据包从192.168.0.1发往192.168.0.10,如下图所示。

因为客户端实际上还没有192.168.0.10这个地址,所以服务器会首先尝试使用由ARP提供的客户端硬件地址与之通信。如果通信失败,那么它将会直接将提供(Offer)广播出去,进行通信。

第二个数据包的DHCP部分,称为提供数据包,表明这是一个响应的消息类型。这个数据包包含了和前一个数据包相同的事务ID,也就是告诉我们这个响应与我们原先的请求相对应。

该提供数据包由DHCP服务器发出,用以向客户端提供其服务。它提供了关于其自身的信息,以及它想要给客户端提供的地址。

网络工具Netwox和Wireshark详解

图中,在“你的”(客户端)IP地址字段中的IP地址192.168.0.10就是要提供给客户端的。下一个服务器IP地址(Next Server IP Address)域中的值192.168.0.1表明我们的DHCP服务器与默认网关共享一个IP地址。 

列出的第一个选项指明这个数据包是一台DHCP服务器提供的。服务器所提供的接下来的这些选项和客户端的IP地址,一起给出了它所能提供的额外信息。

你可以看到它给出了如下信息:

  • 子网掩码是255.255.255.0
  • 续租时间是30min
  • 重新绑定时间的值是52min30s
  • IP地址的租期是1h
  • DHCP服务器的标识符是192.168.0.1

3)请求数据包

在客户端接收到DHCP服务器的提供数据包之后,它将以一个DHCP请求数据包作为接收确认,如图所示。

网络工具Netwox和Wireshark详解

这个捕获文件中的第三个数据包仍然从IP地址0.0.0.0处发出,因为我们还没有完成获取IP地址的过程。但数据包现在知道了它所要通信的DHCP服务器。

消息类型字段显示这是一个请求数据包。虽然这个捕获文件上的每个数据包都属于同一个续租过程,但因为这是一个新的请求/响应过程,所以它有了一个新的事务ID。这个数据包与发现数据包相似,其所有的IP地址信息都是空的。

在最后的选项域,我们看到这是一个DHCP请求。值得注意的是,这个所要请求的IP地址不再是空,并且DHCP服务器标识符域也填有IP地址。

4)确认数据包

这个过程的最后一步就是DHCP在确认数据包中给客户端发送其所请求的IP地址,并在其数据库中记录相关信息,如图所示。 

网络工具Netwox和Wireshark详解

这时客户端就有了一个IP地址,并且可以用它在网络上通信。 

3. DHCP租约内续租

当DHCP给一台设备分配了一个IP地址时,它同时也给客户端定下了一个租约。也就是说客户端在有限的时间之内只用这个IP地址,否则就必须续租。我们刚刚介绍的DORA过程是出现在客户端第一次获取IP地址或者其租约时间已经过期的情况下。在这两种情况下,这台设备都会被视为租约过期。

当一个拥有IP地址的客户端在租约内重新启动时,它必须进行一次精简版的DORA过程,来重新认领它的IP地址。这个过程被称为租约内续租。

在租约内续租时,发现和提供数据包就变得没有必要了。将租约内续租看作是租约过期续租中使用的同种DORA过程,可以发现在租约内续租并不需要那么做,而只需完成请求和确认两个步骤就可以了。

4. DHCP选项和消息类型

DHCP依赖于其可选项来提供真正的灵活性。正如你所看到的那样,数据包的DHCP选项在大小和内容上都可以变化。数据包的整体大小则取决于其所使用的选项。

所有DHCP数据包都需要的唯一选项就是消息类型选项(选项53)。这个选项标识着DHCP客户端或者服务器将如何处理数据包中的信息。

下表中给出了所定义的8种消息类型:

网络工具Netwox和Wireshark详解

5. DHCP Version6 (DHCPv6)

如果按照上表对DHCP数据包结构的定义,你会发现结构体中没有为IPv6地址提供足够的空间。为了解决这一问题,同时又不对DHCP协议进行改动,在RFC3315中提出了DHCPv6协议。

由于DHCPv6不是基于BOOTP协议(DHCP协议的前身)设计的,因此DHCPv6的数据包结构要比DHCP协议精简很多。

网络工具Netwox和Wireshark详解

上图中,DHCPv6数据包结构仅包含2个固定字段,其作用与DHCP中的类似字段相同。数据包的其他部分取决于位于第一个字节的消息类型。在选项部分,每个选项由一个2字节的选项码和一个长度为2字节的选项值字段组成。

DHCPv6实现了和DHCP相同的功能,但要理解DHCPv6通信,我们必须把DORA(Discover—Offer—Request—Acknowledgment)替换为SARR(Solicit—Advertise—Request—Reply)。这一过程如图所示,描述了客户端的续租流程。 

网络工具Netwox和Wireshark详解

SARR过程包括以下4个步骤:

  1. 发起(Solicit):客户端向一个特定的组播地址(ff02::1:2)发送一个初始化数据包,尝试在网络上发现可用的DHCPv6服务器。
  2. 公告(Advertise):一个可用的DHCPv6服务器直接回复客户端,表明此服务器能够提供地址分配和设置服务。
  3. 请求(Request):客户端通过组播方式向服务器发起地址配置信息请求。
  4. (回复(Reply):服务器向客户端直接发送其请求的所有配置信息,SARR过程完成。

CVM首次接入腾讯云 IPv6 网络,通过 DHCPv6 自动获取 IPv6 地址的交互报文如下所示:

1)发现阶段

客户端CVM(云服务器)发送Solicit报文来发现 DHCPv6 服务器,并请求DHCPv6 服务器(腾讯云虚拟组件)为其分配 IPv6 地址和网络配置参数。

由于CVM不知道 DHCPv6 服务器的 IPv6 地址,所以CVM用组播地址:FF02::1:2向同一链路范围内的所有DHCPv6服务器发送Solicit报文。

Solicit报文中携带了客户端的DUID、需要请求的非临时地址、以及其他网络配置参数等信息。

网络工具Netwox和Wireshark详解

2)提供阶段

DHCPv6 服务器接收到Solicit报文后,选择按照 IPv6 地址从小到大的顺序采用循环查找方式,选择最新找到的可供分配的 IPv6 地址,然后通过Advertise报文以单播方式回应给CVM。

Advertise报文里面携带了服务器的DUID、客户端的DUID、分配给客户端的IPv6地址及租期等信息。

网络工具Netwox和Wireshark详解

3)选择阶段

因为Solicit报文是组播发送的,所以如果同一链路范围内存在多个 DHCPv6 服务器,则接收到Solicit报文的服务器都会回应Advertise报文。

如果有多个 DHCPv6 服务器向DHCPv6客户端回应Advertise报文,则 DHCPv6 客户端选择服务器优先级最高的Advertise报文(DHCPv6 服务器可以在Advertise消息中包含Preference选项,以便控制客户端对服务器的选择),然后客户端以组播方式向同一链路范围内的所有 DHCPv6 服务器发送Request报文,该报文中包含客户端选择的 DHCPv6 服务器(高优先级)的DUID、客户端的DUID、客户端IPv6地址。

网络工具Netwox和Wireshark详解

4)确认阶段

当 DHCPv6 服务器收到Request报文后,对报文中携带的服务端DUID信息进行判断:

  • 若报文中携带的服务端DUID不是本服务端的DUID,则对该Request报文不回应,同时将Request报文中请求的IPv6地址进行回收。
  • 若报文中携带的服务端DUID是本服务端的DUID,则以单播方式回应Reply报文,确认Request报文中请求的IPv6地址分配给客户端使用。

网络工具Netwox和Wireshark详解

5)客户端CVM处理阶段

客户端CVM收到Reply报文后会发送地址冲突探测报文(Neighbor Solicitation),检查本链路范围内是否有其他客户端使用相同的IPv6地址,如果在指定时间内没有收到回应,表示客户端可以使用此地址。

网络工具Netwox和Wireshark详解

注意事项:如果发的地址冲突探测报文(Neighbor Solicitation)收到了回应,说明有其他客户端使用了此地址,CVM会以单播方式向服务端发送Decline(声明地址冲突)报文,并重新发送Solicit报文请求新的可用IPv6地址。服务端收到Decline报文后,会将报文中携带的IPv6地址列为冲突地址。 

CVM非首次接入腾讯云IPv6网络,通过 DHCPv6 自动获取 IPv6 地址的交互报文如下所示:

第一步,当客户端CVM(云服务器)非首次接入 IPv6 网络时(比如重启、网卡禁用后再启用等),CVM会通过组播地址:FF02::1:2,发送Confirm报文确认该CVM之前的IPv6地址是否仍然可用。

网络工具Netwox和Wireshark详解

第二步,DHCPv6 服务器(腾讯云虚拟组件)收到Confirm报文后,确认Confirm报文中所有的地址是否适用于该CVM。

若Confirm报文中所有的IPv6地址都通过了确认,服务器回应确认成功的Reply报文(如果客户端收到确认失败的Reply报文,则发送Solicit报文,重新请求IPv6地址;)。

网络工具Netwox和Wireshark详解

第三步,客户端CVM收到确认成功的Reply报文后会发送地址冲突探测报文(Neighbor Solicitation),检查本链路范围内是否有其他客户端使用相同的IPv6地址,如果在指定时间内没有收到回应,表示该CVM可以使用此地址。 

网络工具Netwox和Wireshark详解

总的来说,DHCPv6和DHCP的数据包结构有很大区别,但是在功能实现思路上是一致的。这个过程仍然包括DHCP服务器发现步骤和正式的配置信息获取步骤。这些事件通过客户端和服务器之间交互数据包中的事务ID进行关联。

传统的DHCP机制不支持IPv6地址分配,因此,如果你的设备能够从网络中的某个服务器自动获取IPv6地址,则这表明你的网络中已经在运行DHCPv6服务。如果你想要进一步比较DHCP和DHCPv6,我们建议你使用抓包工具在客户端和服务器端逐步进行分析。 

2、域名系统 DNS(Domain Name System)

域名系统(Domain Name System, DNS)是最重要的互联网协议之一,因为它是众所周知的黏合剂。DNS将例如Google的域名和74.125.159.99的IP地址捆绑起来。当我们想要和一台网络设备通信却不知道它的IP地址时,就可以使用它的DNS名字来进行访问。

DNS服务器存储了一个有着IP地址和DNS名字映射资源记录的数据库,并将其和客户端以及其他DNS服务器共享。由于DNS服务器的结构很复杂,因此我们只关注于通常类型的DNS流量。

1. DNS数据包结构

如图所示,DNS数据包和我们之前所看到的数据包类型结构有所不同。DNS数据包中会出现下面的一些域。

网络工具Netwox和Wireshark详解

DNS ID号(DNS ID Number):用来对应DNS查询和DNS响应。

查询/响应(Query/Response, QR):用来指明这个数据包是DNS查询还是响应。

操作码(OpCode):用来定义消息中请求的类型。

权威应答(Authoritative Answer, AA):如果响应数据包中设定了这个值,则说明这个响应是由域内权威域名服务器发出的。

截断(Truncation, TC):用来指明这个响应由于太长,无法装入数据包而被截断。

期望递归(Recursion Desired, RD):如果在请求中设定了这个值,则说明DNS客户端在目标域名服务器不含有所请求信息的情况下,要求进行递归查询。

可用递归(Recursion Available, RA):如果响应中设定了这个值,则说明域名服务器支持递归查询。

保留(Z):在RFC1035的规定中被设为全0,但有时会被用来作为RCode域的扩展。

响应码(Response Code):在DNS响应中用来指明错误。

问题计数(Question Count):在问题区段中的条目数。

回答计数(Answer Count):在回答区段中的条目数。

域名服务器计数(Name Server Count):在权威区段的域名资源记录数。

额外记录计数(Additional Records Count):在额外信息区段中的其他资源记录数。

问题区段(Question section):大小可变、包含要被发送到DNS服务器的一条或多条的信息查询的部分。

回答区段(Answer section):大小可变、包含用来回答查询的一条或多条资源记录。

权威区段(Authority section):大小可变、包含指向权威域名服务器的资源记录,用以继续解析过程。

额外信息区段(Additional Information section):大小可变、包含与查询有关的额外信息,但对于回答查询这并不是绝对必要的资源记录。 

2. 一次简单的DNS查询过程

DNS以查询/响应的模式工作。当一个客户端想要将一个DNS名字解析成IP地址时,它会向DNS服务器发送一个查询,然后服务器在响应中提供所请求的信息。在较简单的情形下,这个过程包含着两个数据包,正如在捕获的pcap文件中所看到的那样。

第一个数据包如图所示,是由192.168.0.114的客户端通过DNS的标准25端口发向205.152.37.23的服务器的DNS查询。

网络工具Netwox和Wireshark详解

当检查这个数据包的头部时,你会发现DNS也是基于UDP协议的。

在数据包的DNS区段,你可以看到数据包开头的一些较小域都被Wireshark合并成为了一个标志区段(Flags section)。展开这个区段,你会看到这个消息是一个典型的请求:没有被截断并且期望递归查询(我们随后将介绍递归查询)。在展开查询区段时,里面也仅有一个问题。

这个问题是查询名字为wireshark.org的主机类型(type A)互联网(IN)地址。这个数据包基本就是在问:“哪个IP地址对应着wireshark.org域?”

数据包2响应了这个请求,如图所示。

网络工具Netwox和Wireshark详解

因为这个数据包拥有唯一的标识码,所以我们知道这里包含着对于原始查询的正确响应。 

标志区段可以确保这是一个响应并且允许必要的递归。这个数据包仅包含一个问题和一个资源记录,因为它将原问题和回答连接了起来。

展开回答区段可以看到对于查询的回答:wireshark.org的地址是128.121.50.122。有了这个信息,客户端就可以开始构建IP数据包,并与wireshark.org进行通信了。

3. DNS问题类型

DNS查询和响应中所使用的类型域,指明了这个查询或者响应的资源记录类型。下表列出了一些常用的消息/资源记录类型。

在正常流量你将会看到这些类型:

网络工具Netwox和Wireshark详解

详情,请见官网:Domain Name System (DNS) Parameters 

4. DNS递归

由于互联网的DNS结构是层级式的,因此为了能够回答客户端提交的查询,DNS服务器必须能够彼此通信。我们的内部DNS服务器知道本地局域网服务器的名字和IP地址的映射,但不太可能知道Google或者Dell的IP地址。

当DNS服务器需要查找一个IP地址时,它会代表发出请求的客户端向另一个DNS服务器进行查询。实际上,这个DNS服务器与客户端的行为相同。这个过程叫作递归查询。

打开pcap文件,可以分别看到DNS客户端和服务器视角的递归查询过程。这个文件包含了捕获客户端DNS流量文件的两个数据包。第一个数据包是从DNS客户端172.16.0.8发往DNS服务器172.16.0.102的初始查询,如图所示。

网络工具Netwox和Wireshark详解

 内部 DNS 服务器 102 设置了期望递归查询:

网络工具Netwox和Wireshark详解

当你展开这个数据包的DNS区段时,可以看到这是一个用以查找DNS名称www.nostarch.com的A类型记录的标准查询。展开标志区段,可以了解更多关于这个数据包的信息,你可以看到期望递归的标志。

第二个数据包是我们所希望看到的对于初始数据包的响应,这个数据包的事务ID和我们的查询相匹配,也没有列出错误,所以我们就得到了www.nostarch.com所对应的A类型资源记录。 

如果我们想要知道查询是否被递归应答,唯一的方法就是当进行递归查询时监听DNS服务器的流量,正如下面的pcap文件中所示的那样。这个文件显示了查询进行时本地DNS服务器流量的捕获,如图所示。

网络工具Netwox和Wireshark详解

第一个数据包和我们前一个捕获文件中的初始查询相同。这时,DNS服务器接到了这个查询,在其本地数据包检查后,发现它并不知道关于DNS域名(nostarch.com)所对应IP地址这个问题的答案。

由于这个数据包发送时设置了期望递归,困此你会在第二个数据包中看到,这个DNS服务器为了得到答案向其他DNS服务器询问这个问题。

在第二个数据包中,位于172.16.0.102的DNS服务器向4.2.2.1,也就是其所设定的要转发上行请求的服务器,发送了一个新的查询,如图所示。这个请求是原始的镜像,并将DNS服务器变成一个客户端。

网络工具Netwox和Wireshark详解

由于这个事务ID与之前捕获文件中的事务ID不同,因此我们可以将它作为一个新的查询。在这个数据包被服务器4.2.2.1接收之后,本地DNS服务器就接到了响应。

接到了这个响应后,本地DNS服务器就可以将第四个,也就是最后一个带有请求信息的数据包传递给DNS客户端。

虽然这个例子只展示了一层的递归,但对一个DNS请求来说递归查询可能会发生很多次。这里我们接到了来自DNS服务器4.2.2.1的回答,但那个服务器可能为了寻找答案也向其他服务器进行了递归查询。一个简单查询在其得到最终响应之前可能遍历了全世界。

5. DNS区域传送

DNS区域是一个DNS服务器所授权管理的名字空间(或是一组DNS名称)。举例来说,Emma’s Diner这个网站可能由一个DNS服务器对emmasdiner.com负责。

这样,无论是Emma’s Diner内部或者外部的设备,如果希望将emmasdiner.com解析成IP地址,都需要和这个区域的权威,也就是这个DNS服务器联系。如果Emma’s Diner发展壮大了,它可能会增加一个DNS服务器,专门用来处理其名字空间的email部分,比如mail.emmasdiner.com,那么这个服务器,就成为这个邮件子区域的权威。

如果必要的话,还可以为子域名添加更多的 DNS 服务器,如图所示。

网络工具Netwox和Wireshark详解

区域传送指的是通常出于冗余备份的需要,在两台设备之间传送区域数据。举例来说,在拥有多个DNS服务器的组织中,管理员通常都会配置一台备用DNS服务器,用来维护一份主服务器DNS信息的副本,以防止主DNS服务器不可用。主要存在两种区域传送。

  • 完整区域传送(AXFR):这个类型的传送将整个区域在设备间进行传送。
  • 增量区域传送(IXFR):这个类型的传送仅传送区域信息的一部分。

pcap文件包含了一个主机172.16.16.164和172.16.16.139之间进行完整区域传送的例子。
当第一眼看这个文件时,你可能会怀疑是否开错了文件,因为你所见到的是TCP数据包而不是UDP数据包。虽然DNS基于UDP协议,但它在比如区域传送的一些任务中也会使用TCP协议,因为TCP对于规模数据的传输更加可靠。这个捕获文件中的前3个数据包是TCP的三次握手。

第四个数据包开始在172.16.16.164和172.16.16.139之间进行实际的区域传送。这个数据包并不包含任何DNS信息。由于区域传送请求的数据包中的数据由多个数据包所发送,因此这个数据包被标记为重组装PDU的TCP分片。数据包4和6包含了数据包的数据。数据包5是对于数据包4被成功接收的确认。这些数据包以这种方式显示出来是因为 Wireshark 出于可读性的考虑将TCP数据包如此解析并呈现。

这里我们可以将数据包6作为完整的DNS区域传送请求,如图所示。

DNS 在一些如区域传送的任务中仍会使用 TCP 协议:

网络工具Netwox和Wireshark详解

前三个包是 TCP 三次握手,第 4 个包是 164 和 139 间进行区域传送,不包含 DNS 信息,请求数据由多个包发送,因此第 4 包标记了“重组装 PDU 的 TCP 分片”,包 5 是对数据包4 的接收确认,包 6 为 DNS 完整区域传送请求。

网络工具Netwox和Wireshark详解

区域传送请求是典型的查询,但它请求的是AXFR类型而不是单一记录类型,这意味着它希望从服务器接收全部DNS区域。服务器在数据包7中回复了区域记录,如图所示。

网络工具Netwox和Wireshark详解

正如你所见到的那样,区域传送包含了相当多的数据,并且这还是一个很简单的例子!在区域传送完成之后,捕获文件以TCP连接的终止过程作为结束。

区域传送的数据如果落入他人手中可能会很危险。举例来说,通过枚举一个DNS服务器,你可以绘出整个网络的基础结构。

3、超文本传输协议 HTTP(Hypertext Transfer Protocol)

超文本传输协议(Hypertext Transfer Protocol, HTTP)是万维网(World Wide Web)的传输机制,允许浏览器通过连接Web服务器浏览网页。

1. 使用HTTP浏览

HTTP常被用来浏览Web服务器上使用浏览器访问的网页。捕获的pcap文件就给出了这样一个使用TCP作为传输层协议的HTTP传输的例子。通信以客户端172.16.16.128和Google的Web服务器74.125.95.104的三次握手开始。

在建立了连接之后,第一个被标为HTTP的数据包从客户端发往服务器,如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

HTTP数据包通过TCP被传输到服务器的80端口,也就是HTTP通信的标准端口(8080端口也常被使用)。

HTTP数据包会被确定为8种不同请求方法中的一种(根据HTTP规范版本1.1的定义)。这些请求方法指明了数据包发送者想要对接收者采取的动作。

如上图所示,这个数据包的方法是GET,它请求/作为通用资源标识符(Uniform Resource Indicator),并且请求版本是HTTP/1.1。这些信息告诉我们这个客户端请求使用HTTP的1.1版本,下载Web服务器的根目录(/)。

接下来,主机向Web服务器发送关于自己的信息。这些信息包含了正在使用的用户代理(浏览器)、浏览器接受的语言(Accept Languages)和Cookie信息(位于捕获的底部)。为保证兼容性,服务器可以利用这些信息,决定返回给客户端的数据。

当服务器接收到了HTTP请求时,它会响应一个TCP ACK,用以确认数据包,并在后续数据包中传输所请求的数据。HTTP只被用来解决客户端和服务器的应用层命令。当进行数据传输时,除了数据流的开始和结束就看不到应用层的控制信息了。

虽然HTTP仍然负责这些传输,但所有这些数据包在Wireshark中都被显示为TCP分片而不是HTTP数据包。在数据传输结束后,数据的重组装流就已经被发送完了,如图所示。

网络工具Netwox和Wireshark详解

在许多情况下,当浏览包列表时,你无法看到可读的HTML数据,因为这些数据被gzip压缩以提高带宽效率,这是由Web服务器的HTTP响应中的内容偏码字段表示的。只有查看完整的流时,数据才能被解码并易于读取。

HTTP使用了一些预定义的相应码,来表示请求方法的结果。在这个例子中,我们看到一个带有200响应码的数据包,表示一次成功的请求方法。这个数据包同样包含一个时间戳,以及一些关于Web服务器内容编码和配置参数的额外信息。当客户端接收到这个数据包后,这次处理便完成了。

2. 使用HTTP传送数据

我们看过了从Web服务器下载数据的过程,现在将注意力转向上传数据。pcap文件包含了一个非常简单的上传的例子:一个用户在一个网站发表评论。在初始的三次握手之后,客户端(172.16.16.128)向Web服务器(69.163.176.56)发送了一个HTTP数据包,如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

这个数据包使用POST方法,来向Web服务器上传数据以供处理。这里使用的POST方法指明了URI /wp-comments-post.php以及HTTP 1.1请求版本。

如果想看上传数据的内容,可以展开这个数据包的Line-based Text Data部分。

网络工具Netwox和Wireshark详解

在这个POST的数据传输完成之后,服务器会发送一个ACK数据包。比如服务器在数据包中传输了一个响应码302(代表“找到”)作为响应。 

302相应码是HTTP世界的一个常用的重定向手段。这个数据包的Location域指明了客户端被重定向的位置。在这里,这个地方便是评论所发表的原始Web网页。最后,服务器传送一个状态码200,并且这个页面的内容会在接下来的一些数据包中进行发送,从而完成传输。

十一、无线网络数据包分析

与传统有线网络相比,无线网络稍微有些不同。虽然我们仍然在处理TCP、IP等常见的通信协议,但是当移到OSI模型最底层时,游戏便发生了一点变化。在这里,由于无线网络和物理层的本质属性,数据链路层变得尤为重要。这给我们捕获和访问数据增加了新的限制。

1、物理因素

在无线网络中捕获和分析传输数据,首先考虑的是物理传输介质。到目前为止,我们都没有考虑物理层,因为我们一直在物理的线缆上通信。现在我们通过不可见的无线电波通信,数据包就从我们身边飞过。

当从无线局域网(Wireless Local Area Network,WLAN)捕获流量时,最特殊的莫过于无线频谱是共享介质。不像有线网络的每个客户端都有它自己的网线连接到交换机,无线通信的介质是客户端共享的空域。单个WLAN只占用802.11频谱的一部分。这允许同一个物理空间的多个系统在频谱不同的部分进行操作。

无线网络的基础是美国电子和电气工程师协会(Institute of Electrical and Electronics Engineers,IEEE)开发的802.11标准。这里涉及的“无线网络”“WLAN”等术语均指802.11标准中的网络。

空间上的分离是通过将频谱划分为不同信道实现的。一个信道只是802.11无线频谱的一部分。在美国,有11个信道可用(有些国家允许使用更多的信道)。这是很重要的,因为WLAN同时只能操作一个信道,就意味着我们只能同时嗅探一个信道。所以,如果你要处理信道6的WLAN,就必须将系统配置成捕获信道6的流量。

传统的无线嗅探只能同时处理一个信道,但有一个例外:某些无线扫描应用程序使用“跳频”技术,可以迅速改变监听信道以收集更多数据。其中一个很流行的工具是Kismet可以每秒跳跃10个信道,从而高效地嗅探多个信道。

详情参考:Kismet - Kismet

当有其他因素干扰信号时,无线通信不能保证空气中传输的数据是完整的。无线网络有一定的抗干扰特性,但并不完全可靠。因此,当从无线网络捕获数据包时,你必须注意周边环境,确保没有大的干扰源,比如大型反射面、大块坚硬物体、微波炉、2.4GHz无绳电话、厚墙面,以及高密度表面等。这些可能导致数据包丢失、重复数据包或数据包损坏。

同时你还要考虑信道间干扰。虽然同一时刻只能嗅探一个信道,但还是有些小小的忠告:无线频谱被分为多个不同的传输信道,但因为频谱空间有限,所以信道间有些许重叠,如图所示。

网络工具Netwox和Wireshark详解

这意味着,如果信道4和信道5上都有流量,那么当你在其中一个信道上嗅探时,会捕获到另一个信道上的数据包。通常,同一地域上的多个网络被设置成使用1、6和11这3个不重叠信道,所以你可能不会遇到这个问题,但以防万一,你还是要了解这是怎么回事。

无线信号干扰的问题不是在Wireshark上观察数据包就能解决的。如果你致力于维护WLAN,那么就应该定期检测信号干扰。这可以用频谱分析器来完成,它可以显示频谱上的数据或干扰。
商业的频谱分析器价格昂贵,价格甚至高达数千美元,但对于日常使用则有更好的方案。

MetaGeek开发了一个叫Wi-Spy的产品,这是一个USB硬件设备,用于监测整个802.11频谱上的干扰。与MetaGeek的Chanalyzer软件搭配后,这个硬件可以输出图形化频谱,有助于解决无线网络的问题。

2、无线网卡模式

在开始嗅探无线数据包之前,我们需要了解无线网卡的不同工作模式。

无线网卡一共有4种工作模式:

被管理模式(Managed mode):当你的无线客户端直接与无线接入点(Wireless Access Point,WAP)连接时,就可以使用这个模式。在这个模式中,无线网卡的驱动程序依赖WAP管理整个通信过程。

网络工具Netwox和Wireshark详解

Ad-hoc模式:当你的网络由互相直连的设备组成时,就可以使用这个模式。在这个模式中,无线通信双方共同承担WAP的职责。

网络工具Netwox和Wireshark详解

主模式(Master mode):一些高端无线网卡还支持主模式。这个模式允许无线网卡使用特制的驱动程序和软件工作,作为其他设备的WAP。

网络工具Netwox和Wireshark详解

监听模式(Monitor mode):就我们的用途而言,这是一个重要的模式。当你希望无线客户端停止收发数据,专心监听空气中的数据包时,就可以使用监听模式。要使Wireshark捕获无线数据包,你的无线网卡和配套驱动程序必须支持监听模式(也叫RFMON模式)。

网络工具Netwox和Wireshark详解

大部分用户只使用无线网卡的被管理模式或Ad-hoc模式。 

推荐自己使用的ALFA 1000mW USB无线适配器。这是市场上最好的产品之一,它能确保你捕获到每一个可能的数据包。大部分在线计算机硬件零售商都销售此款产品。

3、在Windows上嗅探无线网络

即使你有支持监听模式的无线网卡,大部分基于Windows的无线网卡驱动也不允许你切换到这个模式(WinPcap也不支持这么做)。你需要一些额外的硬件来完成工作。

1. 配置AirPcap

AirPcap(现在是Riverbed旗下CACE Technologies公司的产品)被设计用来突破Windows强加给无线数据包分析的限制。AirPcap像U盘一样小巧,用于捕获无线流量。

AirPcap的配置程序很简单,只有一些配置选项。

网络工具Netwox和Wireshark详解

AirPcap控制面板提供了以下几个选项:

Interface:你可以在这里选择要捕获的设备。一些高级的分析场景会要求你使用多个AirPcap设备,同步嗅探多个信道。

Blink Led:勾选这个复选框会使AirPcap设备上的LED指示灯闪烁。当存在多个AirPcap设备时,这可用来识别正在使用的适配器。

Channel:在这个下拉菜单里,你可以选择希望AirPcap监听的信道。

Include 802.11 FCS in Frames:默认情况下,一些系统会抛弃无线数据包的最后4个校验和比特。这个被称为帧校验序列(Frame Check Sequence,FCS)的校验和用来确保数据包在传输过程中没有被破坏。除非你有特别的理由,否则请勾选这个复选框(包含FCS校验和)。

Capture Type:这里有两个选项——802.11 Only和802.11 + Radio。802.11 Only选项包含标准的802.11数据包头。802.11 + Radio选项包含这个包头以及前端的radiotap头部,因而包含额外信息,比如数据率、频率、信号等级和噪声等级。选择802.11 + Radio以观察所有可用的数据信息。

FCS Filter:即便你没有选择Include 802.11 FCS in Frames,这个选项也可以过滤FCS认为已经被损坏的数据包。使用Valid Frames选项可以只显示FCS认为成功接收的那些数据包。

WEP Configuration:这个区域(在AirPcap Control Panel的Keys选项卡可见)允许你输入所嗅探网络的WEP密码。为了能解密WEP加密的数据,你需要在这里填入正确的WEP密码。

2. 使用AirPcap捕获流量

安装并配置好AirPcap后,你应该对捕获过程很熟悉了。只需要启动Wireshark并选择Capture->Options。

接着,在Interface下拉框中选择AirPcap设备,如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

除了Wireless Settings按钮外,屏幕上的一切都很熟悉。AirPcap是完全嵌入Wireshark的,因此所有配置都可以在Wireshark中修改。 

一切都配置好之后,就可以单击Start按钮开始捕获数据包了。

网络工具Netwox和Wireshark详解

4、在Linux上嗅探无线网络

在Linux系统嗅探只需要简单地启用无线网卡的监听模式,然后启动Wireshark即可。然而,不同型号的无线网卡启用监听模式的流程各不相同,所以在这里我不能给出明确提示。实际上,有些无线网卡并不要求你启用监听模式。你最好Google一下你的网卡型号,确定是否需要启用它,以及如何启用。

在Linux系统中,通过内置的无线扩展程序启用监听模式是常用的办法之一。你可以用iwconfig命令打开无线扩展程序。如果你在控制台上键入iwconfig,应该会看到这样的结果:

$ iwconfig
eth0  no wireless extensions
lo0   no wireless extensions
eth1  IEEE 802.11g     ESSID:"Tesla Wireless Network"
      Mode:Managed  Frequency:2.462 GHz  Access Point:00:02:2D:8B:70:2E
      Bit Rate:54 Mb/s  Tx-Power-20 dBm  Sensitivity=8/0
      Retry Limit:7  RTS thr: off  Fragment thr: off
      Power Management: off
      Link Quality=75/100  Signal level=-71 dBm  Noise level=-86 dBm
      Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
      Tx excessive retries:0  Invalid misc:0  Missed beacon:2

iwconfig命令的输出显示eth1接口可以进行无线配置。这是显然的,因为它显示了与802.11g协议有关的数据,反观eth0和lo0,它们只返回了“no wireless extensions”。

这个命令提供了许多无线配置信息,仔细看一下,有无线扩展服务设置ID(Extended Service Set ID,ESSID)、频率等。我们注意到“eth1”下面一行显示,模式已经被设置为“被管理”,这也就是我们想改动的地方。

要将eth1改成监听模式,你必须以root用户身份登录。可以直接登录或用切换用户(su)命令,如下所示:

$ su
Password:

在你成为root用户后,就可以键入命令来配置无线网卡选项了。输入以下命令可以将eth1配置成监听模式:

# iwconfig eth1 mode monitor

网卡进入监听模式后,再次运行iwconfig命令应该能反映出变化。输入以下命令,以确保eth1接口可以工作:

# iwconfig eth1 up

我们也将使用iwconfig命令改变监听信道,输入以下命令,改变eth1接口的信道为信道3:

# iwconfig eth1 channel 3

你可以在捕获数据包的过程中随意修改信道,所以随便改吧,没问题!也可以将iwconfig命令脚本化以简化过程。

完成这些配置后,请启动Wireshark开始你的数据包捕获之旅!

5、802.11数据包结构

无线数据包与有线数据包的主要不同在于额外的802.11头部。这是一个第2层的头部,包含与数据包和传输介质有关的额外信息。802.11分组有3种类型。

管理:这些分组用于在主机之间建立2层连接。管理分组还有一些重要的子类型,包括认证(authentication)、关联(association)和信号(beacon)分组。

控制:控制分组允许管理分组和数据分组的发送,并与拥塞管理有关。常见的子类型包括请求发送(request-to-send)和准予发送(clear-to-send)分组。

数据:这些分组含有真正的数据,也是唯一可以从无线网络转发到有线网络的数据包。

一个无线数据包的类型和子类型决定了它的结构,因此各种数据包结构可能不计其数。我们将考察其中一种结构,请看下面的pcap文件里的单个数据包。这个文件包含一种叫beacon的管理数据包的例子,如图所示。

网络工具Netwox和Wireshark详解

beacon是你能找到的最有信息量的无线数据包之一。它作为一个广播数据包由WAP发送,穿过无线信道通知所有无线客户端存在这个可用的WAP,并定义了连接它必须设置的一些参数。在我们的示例文件中,你可以看到这个数据包在802.11头部的Type/Subtype域被定义为beacon。

在802.11管理帧头部发现了其他信息,包括以下几点。

  • Timestamp:发送数据包的时间戳。
  • Beacon Interval:beacon数据包重传间隔。
  • Capability Information:WAP的硬件容量信息。
  • SSID Parameter Set:WAP广播的SSID(网络名称)。
  • Supported Rates:WAP支持的数据传输率。
  • DS Parameter:WAP广播使用的信道。

这个头部也包含了来源和目的地址以及厂商信息。

在这些知识的基础上,我们可以了解到示例文件中发送beacon的WAP的很多信息。显然这是一台D-Link设备,使用802.11b标准(B),在信道11上工作。

虽然802.11管理数据包的具体内容和用途不一样,但总体结构跟这个例子相差不大。 

6、增加无线专用列

如你所见,Wireshark通常在Packet List面板显示6个不同的列。分析无线数据包之前,让我们在Packet List面板增加3个新列。

RSSI(for Received Signal Strength Indication)列,显示捕获数据包的射频信号强度。
TX Rate(for Transmission Rate)列,显示捕获数据包的数据率。
Frequency/Channel 列,显示捕获数据包的频率和信道。

当处理无线连接时,这些提示信息将会非常受用。例如,即使你的无线客户端软件告诉你信号强度很棒,捕获数据包并检查这些列时,也许会得到与该声明不符的数字。

按照以下步骤,在Packet List面板增加这些列:

  1. 选择Edit->Preferences。
  2. 到Columns部分,并单击Add。
  3. 在Title域键入RSSI,并在域类型下拉列表中选择IEEE 802.11 RSSI。
  4. 为TX Rate和Frequency/Channel列重复此过程,为它们取个恰当的Title,并在Field type下拉列表选择IEEE 802.11 TX Rate和Channel/Frequency。

添加三列之后,Preferences窗口应该像图一样。

网络工具Netwox和Wireshark详解

重启Wireshark以显示新列。

7、无线专用过滤器

有线网络中筛选流量要容易得多,因为每个设备有它自己的专用线缆。然而,在无线网络中,所有无线客户端产生的流量都同时存在于共享信道中,这意味着捕获任意一个信道,都将包含几十个客户端的流量。

1. 筛选特定BSS ID的流量

网络上每一个WAP都有它自己的识别名,叫作“基础服务设备识别码”(Basic Service Set Identifier,BSS ID)。接入点发送的每一个管理分组和数据分组都包含这个名称。

一旦你明确了想要查看的BSS ID名称,那么你需要做的就只是找到那个WAP发送的数据包而已。Wireshark在Packet List面板的Info列里显示了WAP,因此找到这个信息易如反掌。

为了找到感兴趣的WAP所传输的数据包,你需要在802.11头部中找它的BSS ID域。过滤器就基于这个地址来编写。

找到BSS ID MAC地址后,你可以使用这个过滤器:

wlan.bssid == 00:11:22:33:44:55

这样你就只能看见流经该特定WAP的流量了。

2. 筛选特定的无线数据包类型

我们曾讨论过你可能在网络上看见的无线数据包类型,你通常需要基于这些类型和子类型来筛选数据包。对于特定类型,可以用过滤器wlan.fc.type来实现;对于特定类型或子类型的组合,可以用过滤器wc.fc.type_ subtype来实现。

例如,为了过滤一个NULL数据分组(在十六进制中是类型2,子类型4),你可以使用wlan.fc.type_subtype eq 0x24这个过滤器。

下表提供了802.11分组类型和子类型的简要参考:

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

3. 筛选特定频率

如果你在查看来自多个信道的流量,那么基于信道的筛选就非常有用。例如,如果你本来只期待在信道1和6出现流量,那么可以输入一个过滤器显示信道11的流量。如果发现有流量,那么你就知道一定是哪里弄错了——或许是配置错误,或许有钓鱼无线设备。

使用这个过滤器语法,可以筛选特定频率:

wlan_radio.channel == 11

这将显示信道11的所有流量。你可以将2462值替换成想筛选的信道对应的频率。

下表列出了信道和频率的对应表格:

网络工具Netwox和Wireshark详解

另外还有数百个实用的无线网络流量过滤器,你可以在Wireshark wiki上查看它们。 

8、保存无线分析配置

在进行无线数据包分析时,预配置工作很麻烦——包括添加特定的栏目,编辑过滤器设置。为了避免每次都对栏目和过滤器进行重新配置,你可以将设置保存为配置文件,以便于在有线和无线分析配置之间切换。

在保存配置文件之前,先根据需要设置栏目和过滤器。之后,在屏幕右下角的当前配置列表上右击,并单击New。将配置文件命名为Wireless,最后单击OK。

十二、网络问题定位与排查

作为一名网络管理员,你将花费很多时间用于修复运行缓慢的计算机和服务。但是人们抱怨网络缓慢,并不意味着就是网络的问题。

在开始处理网络缓慢的问题之前,你首先要确定网络是否真的很慢。

首先,我们会讨论TCP的错误恢复和流量控制机制。然后,我们会探索如何检测网络缓慢的根源。最后,我们会讨论用基线测试网络以及网络上运行的设备与服务的方法。这回让你在识别、诊断和解决慢速网络方面,应该会有非常大的进步。 

很多技术都可以用来排除网络缓慢故障。问题主要集中在TCP,因为在大多数时间你只需要面对它。TCP允许你执行被动地回溯分析,而不用生成额外的流量(比如ICMP)。

1、TCP 的错误恢复特性

TCP的错误恢复特性是我们定位、诊断并最终修复网络高延迟的最好工具。在计算机网络中,“延迟”是数据包传输与接收时间差的衡量参数。

延迟可以被测量为单程延迟(从单个来源到一个目的地)或往返延迟(从来源到达目的地并返回来源)。当设备间通信很快,并且数据包从一个端点到另一端点所花时间很少时,就说通信是低时延的。相反,当数据包在来源和目的地间传输要花费大量时间时,就说通信是高时延的。高时延是所有珍视自己声誉(以及工作)的网络管理员们的头号敌人。

1. TCP重传

重传数据包是TCP最基本的错误恢复特性之一,它被设计用来对付数据包丢失。

数据包丢失可能有很多原因,包括出故障的应用程序、流量负载沉重的路由器或者临时性的服务中断。数据包层次上的移动速度非常快,而且数据包丢失通常是暂时的,因此TCP能否检测到数据包丢失并从中恢复显得至关重要。

决定是否有必要重传数据包的主要机制叫作重传计时器。这个计时器负责维护一个叫重传超时(Retransmission timeout,RTO)的值。每当使用TCP传输一个数据包时,就启动重传计时器。当收到这个数据包的ACK时,计时器就会停止。从发送数据包到接收ACK确认之间的时间被称为往返时间(Round-trip time,RTT)。将若干个这样的时间平均下来,可算出最终的RTO值。

在最终算出RTO值之前,传输操作系统将一直依赖于默认配置的RTT值。此项设定用于主机间的初始通信,并基于接收到的数据包RTT进行调整,以形成真正的RTO。

一旦RTO值确定下来,重传定时器就被用于每个传输的数据包,以确定数据包是否丢失。

下图阐述了TCP重传过程:

网络工具Netwox和Wireshark详解

当数据包被发送出去,但接收方没有发送TCP ACK数据包时,传输主机就假设原来的数据包丢失了,并重传它。重传之后,RTO值翻倍。如果在到达那个值之前一直没有接收到ACK数据包,则将发生另一次重传。如果下一次重传还是没有收到ACK,那么RTO值将翻倍。每次重传,RTO值都将翻倍,这个过程会持续到收到一个ACK数据包,或者发送方达到配置的最大重传次数为止。
最大重传次数取决于传输操作系统上的配置。默认情况下,Windows主机最多重传5次,大部分Linux主机则默认重传15次。这个选项在两个操作系统中都是可配置的。

下图TCP重传的例子,它包含了6个数据包。

第一个数据包如图所示:

网络工具Netwox和Wireshark详解

这是一个TCP PSH/ACK数据包,包含648字节的数据,从10.3.30.1发送到10.3.71.7。这是一个典型的数据包。

在正常条件下,你会期待在发送第一个数据包之后,很快就能看到响应的TCP ACK数据包。然而,在这个例子中,下一个数据包是一次重传。通过在Packet List面板中查看这个数据包,你就能得出这个结论。Info列明确表明了[TCP Retransmission],并且这个数据包以黑底红字出现。

下图显示了Packet List面板中列出的重传例子:

网络工具Netwox和Wireshark详解

如下图所示,你也可以通过查看Packet Details和Packet Bytes面板确定它是否是重传数据包。

网络工具Netwox和Wireshark详解

注意,除了IP identification和Checksum域之外,这个数据包与最初的数据包完全一致。为了验证这个结论,可在Packet Bytes面板中比较这个重传数据包和最初的数据包。

在Packet Details面板中,注意到重传数据包的SEQ/ACK Analysis标题下有一些额外的信息。这个有用的信息是由Wireshark提供的,实际上并不包含在数据包里。SEQ/ACK analysis告诉我们这确实是一个重传,RTO值0.206s是基于与数据包1的时间差值算出来的。

查看剩下的数据包应该是类似的结果,唯一的不同在于IP identification、Checksum域以及RTO值。为了显示每个数据包之间的时间间隔,可以查看Packet List面板的Time列。在这里,你看到每一次重传后RTO值翻倍,时间呈指数增长。

2. TCP重复确认和快速重传

当接收方收到乱序数据包时,就发送重复的TCP ACK数据包。TCP在其头部使用序号和确认号域,以确保数据被可靠接收并以发送顺序重组。

“TCP数据包”的准确术语其实应该是“TCP区段”,但大多数人倾向于把它们称为“数据包”。
建立一个新的TCP连接时,初始序号(Initial sequence number,ISN)是握手过程中交换的最重要信息之一。一旦设置好连接两端的ISN,接下来传输的每一个数据包都将按照数据载荷的大小增长序号。

举个例子,一台主机的ISN是5000,它发送一个500字节的数据包给接收方。一旦接收到此数据包,接收方就会根据以下规则响应一个包含确认号5500的TCP ACK数据包:
接收数据的序号+接收数据的字节数=发出的确认号

在这个运算中,返回到发送方的确认号实际上就是接收方期待下次接收的数据包序号。

下图可以看到一个这样的例子:

TCP 序号与确认号:

网络工具Netwox和Wireshark详解

序列号使数据接收方检测数据包丢失成为可能。当接收方追踪正在接收的序号时,如遇到不合顺序的序号,它就知道数据包丢失了。

当接收方收到一个预料之外的序号时,它会假设有一个数据包在传输中丢失了。为了正确重组数据,接收方必须要得到丢失的数据包,因此它重新发送一个包含丢失数据包的序号的ACK数据包,以通知发送方重传该数据包。

当传输主机收到3个来自接收方的重复ACK时,它就假设这个数据包确实在传输中丢失了,并立刻发送一个快速重传。一旦触发快速重传,其他所有正在传输的数据包都要靠边,直到把快速重传数据包发送出去为止。

下图描述了这个过程:

快速重传:

网络工具Netwox和Wireshark详解

你将在该pcap文件中发现重复ACK和快速重传的例子。

捕获记录中的第一个数据包,如图所示。 

网络工具Netwox和Wireshark详解

在网络中这个TCP ACK数据包从数据接收方(172.31.136.85)去往发送方(195.81.202.68),包含了一个对捕获文件之前的数据包的确认。 

默认情况下,Wireshark使用相对序号来简化对这些数字的分析。使用如下方法可关闭此项功能,选择Edit->Preferences,在Preferences窗口中选择Protocols,然后选择TCP区段,最后取消Relative sequence numbers和window scaling旁边的复选框。

如下图所示,此数据包中的确认号是1310973186,这应该是接收的下一个数据包的序号。

网络工具Netwox和Wireshark详解

很遗憾,下一个数据包的序号是1310984130 ,并非是我们所期待的。这表明期待的数据包在传输中莫名其妙地丢失了。

如图所示,接收主机注意到这个数据包的序号不符,就在捕获记录的第三个数据包中发送一个重复的ACK。

网络工具Netwox和Wireshark详解

通过查看以下信息的其中一个,你就可以确定这是一个重复的ACK数据包。

  • Packet Details面板中的Info列。这个数据包以黑底红字呈现。
  • SEQ/ACK Analysis heading下的Packet Details面板。若展开此标题,你会发现这个数据包被列为数据包1的重复ACK。 

如图所示,接下来的几个数据包继续这个过程。

网络工具Netwox和Wireshark详解

  • 数据包 4 是发送方以错误序号发送的另一个数据区块。
  • 数据包 5 是接收方主机发送第二个重复 ACK。
  • 数据包 6 是接收方又收到一个情有错误序号数据包。
  • 数据包 7 是第三个也是最后一个重复 ACK。
  • 数据包 8 是快速重传数据包。
  • 数据包 9 是确认收到快速重传的 ACK。

捕获文件的第4个数据包是发送主机以错误序号发送的另一个数据区块。因此,接收主机发送第二个重复ACK。接收方又收到一个包含错误序号的数据包。这导致它传输第三个、也是最后一个重复ACK。

发送方收到来自接收方的第三个重复ACK之后,就强制停止所有的数据包传输,并重新发送丢失的数据包。

下图显示了丢失数据包的快速重传:

网络工具Netwox和Wireshark详解

在Packet List面板的Info列中再次出现了重传数据包。正如前面的例子,数据包被清楚地标记为黑底红字。

这个数据包的SEQ/ACK分析部分告诉我们这有可能是一次快速重传(再次注意,数据包的快速重传标记信息并非数据包本身的值,而是Wireshark的功能)。捕获记录的最后一个数据包是确认收到快速重传的ACK数据包。 

当发生数据包丢失时,可能影响TCP通信数据流的功能是选择性确认(Selective Acknowledgement)。在上面的捕获记录里,通信双方已经在三次握手过程中协商开启了选择性ACK。

因此,一旦数据包丢失并收到重复ACK,即使在丢失数据包之后还是成功接收了其他数据包,也只需要重传丢失的数据包。如果不启用选择性ACK,那就必须重新传输丢失数据包之后的每一个数据包。选择性ACK使得数据丢失的恢复更加高效。由于大部分现代TCP/IP协议栈的实现都支持选择性ACK,因此你会发现这个功能通常都会被启用。

 2、TCP 流量控制

重传和重复ACK都是TCP反应性的功能,被设计用来从数据包丢失中恢复。如果TCP没有包含某些形式的用于预防数据包丢失的前瞻性功能,那么它将是一个糟糕的协议,但幸好它做到了。

TCP实现了滑动窗口机制,用于检测何时发生了数据包丢失,并调整数据传输速率加以避免。滑动窗口机制利用数据接收方的接收窗口来控制数据流。

接收窗口是数据接收方指定的值,存储在TCP头部(以字节为单位),它告诉发送设备自己希望在TCP缓冲空间中存储多少数据。这个缓冲空间是数据在可以向上传递到等待处理数据的应用层协议之前的临时存储空间。因此,发送方一次只能发送窗口大小域指定的数据量。为了传输更多的数据,接收方必须发送确认,以告知之前的数据已经接收到了。它也必须要处理占用TCP缓冲空间的数据,以清空缓冲区。

下图阐明了接收窗口是如何工作的:

网络工具Netwox和Wireshark详解

在图中,客户端正在向接收窗口大小为5000字节的服务器发送数据。客户端发送了2500字节,将服务器的可用缓冲空间减少到2500字节,然后再发送2000字节,进而将可用缓冲区减少到500字节。然后服务器送出这些数据的确认,它处理缓冲区的数据,得到可用的空缓冲区。这个过程不断重复,客户端又发送了3000字节和另外1000字节,将服务器的可用缓冲区减少到1000字节。客户端再次确认这些数据,并处理缓冲区的内容。

1. 调整窗口大小

调整窗口大小的过程相当明确,但有时候它也不尽如人意。每当接收到数据时,TCP栈就生成并发送一个确认作为响应,但是接收方不可能总是迅速地处理缓冲区的数据。

当一台繁忙的服务器处理来自多个客户端的数据包时,服务器可能会因缓慢地清空缓冲区,而腾不出空间来接收新数据。如果没有流量控制,这将导致数据包丢失和数据损坏。幸好,当服务器太繁忙,以致不能以宣告的接收窗口的速率处理数据时,它可以调整接收窗口的大小。它通过减小向发送方返回的ACK数据包的TCP头部窗口大小值达到这个目的。

下图展示了这样的例子:

网络工具Netwox和Wireshark详解

在图中,服务器一开始声明的窗口大小是5000字节。客户端发送了2000字节,紧接着再发送2000字节,只留下1000字节的可用缓冲空间。服务器意识到它的缓冲区很快就要被塞满了。它知道如果按此速率传输数据,那数据包很快就会丢失。为了校正这个问题,服务器向客户端发送一个确认,包含更新的窗口大小为1000字节。因而,客户端会发送较少的数据,服务端可以按照能接受的速率处理缓冲区的内容,从而允许数据恒定流动。

窗口重设过程是双向工作的。当服务器能更快地处理数据时,它可以发送一个ACK数据包,指明更大的窗口大小。

2. 用零窗口通知停止数据流

某些情况下,服务器可能无法处理客户端发送的数据。这可能是因为内存不足、缺少处理能力或者其他问题。这可能导致数据包中止、通信过程停止,但接收窗口能够将负面影响最小化。

当出现这种情况时,服务器可以发送一个数据包,指明窗口大小是零。当客户端收到这个数据包时,它会停止所有数据传输,但仍通过传输“保活数据包(keep-alive packets)”保持与服务器的连接。客户端周期性地发送保活数据包,以检查服务器接收窗口的状态。一旦服务器能再次处理数据,它就会响应一个非零的窗口大小,这时通信恢复。

下图显示了零窗口通知的例子:

网络工具Netwox和Wireshark详解

3. TCP滑动窗口实战 

看完TCP滑动窗口的理论之后,我们将在捕获的pcap文件中探究它。

在这个文件中,我们从192.168.0.20发送给192.168.0.30的几个TCP ACK数据包开始。我们主要对Windows Size域感兴趣,可以在Packet List面板的Info列以及Packet Details面板的TCP头部看到它。从图中可以立即发现,在前面的3个数据包中,这个域的值不断减小。

网络工具Netwox和Wireshark详解

这个值从第一个数据包的8760字节减少到第二个数据包的5840字节,接着又减为第三个数据包的2920字节。窗口大小值递减是主机延迟增加的典型指标。注意一下Time列的信息,这是在极短的时间内发生的。

当窗口大小像这样快速减小时,它很可能会减至零,如图所示,数据包4正是这样的情形。 

网络工具Netwox和Wireshark详解

第4个数据包也是从192.168.0.20发往192.168.0.30的,但它的目的是告诉192.168.0.30它不能再接收任何数据。在TCP头部就可以看到这个数值0,而且Wireshark也在Packet List面板的Info列以及TCP头部SEQ/ACK Analysis部分,告诉我们这是一个零窗口数据包。

一旦收到零窗口数据包,192.168.0.30这个设备就不再发送任何数据,直到它从192.168.0.20收到一个窗口更新,通知它窗口大小已经增长了为止。幸好,在这个捕获文件里,导致零窗口的问题是暂时的。

因此,如图所示,发送的下一个数据包就是窗口更新。 

网络工具Netwox和Wireshark详解

在这个例子中,窗口大小增长到了非常健康的64240字节。Wireshark再一次在SEQ/ACK Analysis标题下面告诉我们,这是一个窗口更新。 

一旦收到这个更新数据包,192.168.0.30主机就可以再次发送数据,如数据包6和7所示。这个过程非常迅速。就算它只是多持续一点点时间,也可能会引起网络“打嗝”,导致数据传输变慢或失败。

最后再看滑动窗口,查看一下pcap文件。捕获记录中的第一个数据包是从195.81.202.68发送到172.31.136.85的正常HTTP流量,紧接着就是一个从172.31.136.85返回的零窗口数据包。

这看起来跟之前零窗口数据包非常相似,但结果却很不相同。

在图中,我们并没有看到172.31.136.85主机发送使通信恢复的窗口更新,而是看到一个保活数据包。

网络工具Netwox和Wireshark详解

Wireshark在Packet Details面板中TCP头部的SEQ/ACK Analysis标题下,将这个数据包标记为保活数据包。我们从Time列可得知,在收到上一个数据包3.4s后,出现了这个数据包。

如图所示,这个过程又持续了几次:一台主机发送零窗口数据包,另一台则发送保活数据包。 

网络工具Netwox和Wireshark详解

这些保活数据包以3.4s、6.8s、13.5s的间隔出现。这

个过程可能会持续相当长的时间,这取决于通信设备采用了哪个操作系统。在这个例子中,你可以发现,随着Time列数值的增长,连接暂停了将近25s。想象一下,尝试向域控制器认证或 者从网上下载文件时,25s的延迟真是难以接受!

3、TCP错误控制和流量控制总结

让我们具体看一下重传、重复ACK和滑动窗口机制。下面是处理延迟问题的一些注意事项。

1. 重传数据包

发生重传是因为客户端检测到服务器没有接收到它发送的数据。因此,能否看到重传取决于你在分析通信的哪一端。如果你从服务器那端捕获数据,并且它确实没有接收到客户端发送、重传的数据包,那你将被蒙在鼓里,因为你看不到重传的数据包。如果你怀疑服务器那端受到了数据包丢失的影响,(可能的话)你应该考虑在客户端那边捕获流量以观察是否有重传数据包。

2. 重复ACK数据包

我倾向于把重复ACK看作重传的表面对立词(pseudo-opposite),因为当服务器检测到来自客户端的数据包丢失时就发送它。在多数情况下,你可以在通信两端捕获到重复ACK的流量。记住,当接收到乱序数据包时才触发重复ACK。

例如,如果服务器只接收到了第1个和第3个数据包,就会发送一个重复ACK以引发第2个数据包的快速重传。由于你已经接收到第1个和第3个数据包,那不管什么情况导致第2个数据包丢失,都可能只是暂时的,因此在大部分情况下,你可以成功发送并接收重复ACK。当然,有时候这个情况也未必成立。因此,当你在服务器端怀疑有数据包丢失却没有看到任何重复ACK时,可以考虑在通信的客户端捕获数据包。

3. 零窗口和保活数据包

滑动窗口与服务器接收、处理数据的故障直接相关。服务器的某些问题可以直接导致窗口大小减少或达到零窗口状态,因此如果你发现这样的情况,就应该集中调查那里。通常你会在网络通信的两端看见窗口更新数据包。

4、定位高延迟原因

有时候,数据包丢失并不是延迟的原因。也许你会发现,当两台主机间通信很慢时,并没有TCP重传或重复ACK这样的常见特征。在这些情况下,你需要采用其他技术来定位高延迟的原因。

在这里,最有效的办法之一是查看初始连接握手以及接下来的两个数据包。例如,考虑客户端和Web服务器之间的一个简单连接,客户端尝试浏览托管在服务器上的一个站点。我们关注通信序列里的前6个数据包,包括TCP握手、初始HTTP GET请求、对这个GET请求的确认,以及从服务器发往客户端的第一个数据包。

请确保你已经在Wireshark中设置了恰当的时间显示格式,在Wireshark中选择View -> Time Display Format -> Seconds Since Previous Displayed Packet。

1. 正常通信

目前,只知道你需要一个正常通信的基线,并与高延迟的情况作比较。由于我们已经讨论过了TCP握手和HTTP通信的细节,因此在这里我们将跳过它们。

实际上,我们根本不需要再看Packet Details面板。

如图所示,我们只关心Time列:

网络工具Netwox和Wireshark详解

这个通信序列是相当快的,全过程花了不到0.1s。

接下来我们查看的几个捕获文件将包含相同的流量模式,只是在数据包时序上有些许不同。

2. 慢速通信——线路延迟

如图所示,注意,除了时间值之外,所有数据包都和上一个文件中的相同。

网络工具Netwox和Wireshark详解

当我们开始逐个查看这6个数据包时,会很快遇到延迟的第一个标志。客户端(172.16.16.128)发送初始SYN数据包,开始TCP握手。在收到服务端(74.125.95.104)返回的SYN/ACK数据包之前有0.87s的延迟。这是我们受到线路延迟影响的第一个迹象,这是客户端和服务器之间的设备导致的。

由于数据包传输的特性,我们可以确定这是线路延迟的问题。当服务器收到一个SYN数据包时,由于不涉及任何传输层以上的处理,因此发送一个响应只需要非常小的处理量。即使服务器正承受巨大的流量负载,通常它也会迅速地向SYN数据包响应一个SYN/ACK。这排除了服务器导致高延迟的可能性。

客户端的可能性也被排除了,因为它在此时除了接收SYN/ACK数据包以外什么也没干。排除了客户端和服务器的原因,那么网络缓慢的原因应该在捕获记录的前两个数据包里。

继续看,我们发现完成三次握手的ACK数据包传输很快,客户端发送的HTTP GET请求也同样如此。产生这两个数据包的处理过程是收到SYN/ACK后在客户端本地发生的,所以只要客户端没有沉重的处理负载,这两个数据包应该立刻就能发出去。

在数据包5,我们看到它的时间值也高得令人难以置信。看来,我们发送初始HTTP GET请求之后,经过1.15s才收到从服务器返回的ACK数据包。收到HTTP GET请求后,服务器在发送数据之前先发送了一个TCP ACK,同样这也不需要服务器耗费太多处理资源。这是线路延迟的另一个标志。

每次遇上线路延迟,你几乎都会在通信过程中初始握手的SYN/ACK以及其他ACK数据包中看到这样的情景。虽然这个信息并没有告诉你网络高延迟的确切原因,但它起码告诉你不是客户端或服务器的问题,所以你能意识到延迟是因为中间的一些设备出了问题。

此刻,你可以开始检查受影响主机之间的防火墙、路由器、代理服务器等设备,以确定问题所在。 

3. 通信缓慢——客户端延迟

我们查看的下一个延迟情景包,如图所示。

网络工具Netwox和Wireshark详解

 刚开始这个捕获记录很正常,迅速完成了TCP握手,没有任何延迟。但握手完成之后,数据包4的HTTP GET请求出现了问题。该数据包继上一个数据包有1.34s的延迟。

我们应该查看数据包3和4之间到底发生了什么,以找到延迟的原因。数据包3是TCP握手过程中客户端发往服务器的最后一个ACK,数据包4则是客户端发往服务器的GET请求。它们的共同点在于都是客户端发送的,与服务器无关。发送完ACK之后本应该很快就发送GET请求,因为所有动作都是以客户端为中心的。

不幸的是,ACK并没有快速切换到GET请求。创建和传输GET数据包确实需要应用层的处理,而这个处理过程的延迟表明客户端无法及时执行该动作。这意味着通信高延迟的根源在于客户端。

4. 通信缓慢——服务器延迟

如图所示,这是服务器延迟的一个例子。

网络工具Netwox和Wireshark详解

在这个捕获记录中,两台主机间的TCP握手过程很快就顺利完成了,这是个很好的开端。下一对数据包带来了更好的消息,初始GET请求和响应的ACK数据包也很快传输完毕。直到最后一个数据包,我们才发现了高延迟的迹象。

第6个数据包是服务器响应客户端GET请求的第一个HTTP数据包,但它竟然在服务器为GET请求发送TCP ACK之后延迟了0.98s。数据包5到6的切换情况与我们在上一个情景中看见的握手ACK与GET请求之间的切换很相似。然而,在这个例子中,服务器才是我们关注的焦点。

数据包5是服务器响应客户端GET请求的ACK。一旦发送这个数据包,服务器就应该立即开始发送数据。这个数据包中的数据访问、打包和传输是由HTTP协议完成的,由于这是一个应用层协议,因此需要服务器作一些处理。延迟收到这个数据包表明服务器不能及时处理这个数据,最终把延迟的根源指向了它。 

5. 延迟定位框架

我们使用6个数据包成功地定位了从客户端到服务器的网络高延迟的原因。这些场景看起来也许有点复杂,但下图应该能帮你更快地解决延迟问题。这些原则几乎可应用于任何基于TCP的通信。

我们还没有讨论UDP延迟。因为UDP的设计目标是快速但不可靠,所以它没有内置任何延迟检测并从中恢复的功能。相反,它依赖于应用层协议(和ICMP)来解决数据可靠传输的问题。

网络工具Netwox和Wireshark详解

5、网络基线

当所有的努力都失败时,网络基线将成为检修网络缓慢故障最关键的数据之一。对我们的目的而言,网络基线包含来自网络不同端点的流量样本,包括大量我们认可的“正常”网络流量。网络基线的作用是在网络或设备工作不正常时作为比较的基准。

例如,考虑一个场景,网络上几个客户反映登录某个本地Web应用服务器时反应迟钝。如果你捕获这些流量并与网络基线对照,就会发现Web服务器一切正常,但嵌入到Web应用中的外部内容引发了额外的外部DNS请求,而这些请求比正常速度慢两倍。

也许不靠网络基线的帮助,你也能注意到异常的外部DNS服务器,但当你处理微妙的变化时,就不一定了。10个DNS请求都比正常情况多耗费0.1s,这跟一个DNS请求比正常多耗费1s一样糟糕,但没有网络基线的话,检测前者要难得多。

由于网络各不相同,因此网络基线的组件将有很大差异。接下来的我们提供了网络基线组件的几个例子。你也许会发现所有这些条目都能应用到你的网络基础设施,或只是很少一部分能适用。不管怎样,你应该把你的基线中的每一个组件置入这3个基本基线目录中:站点、主机和应用程序。

1. 站点基线

站点基线的目的是获得网络上每个物理站点的整体流量快照。理想情况下,这将是WAN内的每一个段。

这个基线应该包含以下几个组件。

1)使用的协议

在网络边缘(路由器/防火墙)捕获网段上所有设备的流量时,请使用协议分层统计窗口(Statistics->Protocol Hierarchy)来查看所有设备的流量。然后,你可以对照查看是否缺少本应出现的协议,或者网络上是否出现了新的协议。你也可以在协议的基础上,用它来发现高于正常数量的特定类型的流量。

2)广播流量

这包含网段上的一切广播流量。在站点内任一点监听都可以捕获所有广播流量,通过它可以了解正常情况下谁将大量广播流量发送到网络中,这样你将很快确定是否出现了过多(或过少)的广播流量。

3)身份验证序列

这包括任意客户端到所有服务的身份验证过程的流量,比如动态目录、Web应用程序,以及特定组织的软件。身份验证通常是服务运行缓慢的一个方面。通过基线你可以确定身份验证是否是通信缓慢的原因。

4)数据传输率

这通常包括在网络上测量这个站点到其他站点的大量数据传输。你可以使用Wireshark的捕获概述和绘图功能来确定传输速率和连接的一致性。这可能是你的一个很重要的站点基线。每当在网段上建立或拆除连接速度很慢时,你就可以运行与基线同样的数据传输并比较结果。这会告诉你连接是否真的很慢,甚至可能帮助你查找缓慢的原因。

2. 主机基线

使用主机基线并不意味着你必须要在网络上测试每台主机。主机基线只需要在高流量或关键任务服务器上执行。基本上,一旦某台服务器运行缓慢,便会招来管理层愤怒的电话,你应当在那台主机上建立基线。

主机基线包含以下几个组件:

1)使用的协议

当捕获这台主机的流量时,这个基线提供了使用协议分层统计窗口的好机会。然后,你可以对照看一看是否缺少本应出现的协议,或者主机上是否出现了新的协议。你也可以在协议的基础上,用它来发现高于正常数量的特定类型的流量。

2)空闲/繁忙流量

这个基线只是简单包含了高峰和非高峰时段正常操作流量的总体捕获记录。了解到一天之中不同时段的连接数量及其占用的带宽大小,有助于你确定缓慢是用户负载还是其他原因造成的。

3)启动/关闭

为了获取这个基线,你需要在主机启动和关闭时创建一个流量捕获记录。一旦计算机不能启动、不能关闭,或这两个过程异常缓慢,你就可以使用它确认问题是否跟网络有关。

4)身份验证序列

这个基线要求在主机上捕获所有服务的身份验证过程的流量。身份验证通常是服务运行缓慢的一个方面。通过基线你可以确认身份验证是否是通信缓慢的原因。

5)关联/依赖

这个基线需要持续更长时间的捕获,以确定这台主机依赖于哪些主机(以及哪些主机依赖于这台主机)。你可以通过会话窗口(Statistics->Conversations)查看这些关联和依赖。Web服务器依赖于SQL服务器便是这样的例子。有时我们会意识不到主机间的一些潜在依赖关系,这时主机基线便能派上用场。通过这个,你可以确定主机不能正常运转,是因为配置错误还是因为所依赖主机的高延迟。

3. 应用程序基线

最后一个网络基线类别是应用程序基线。这个基线应该用于所有基于网络的关键业务应用程序。
应用程序基线包含以下几个组件。

1)使用的协议

我们在这个基线中再次使用了Wireshark的协议分层统计窗口,但这次是在运行应用程序的主机上捕获流量。然后,你可以通过比较这个列表,发现依赖于这些协议的应用程序是否正常运转。

2)启动/关闭

这个基线需要捕获应用程序启动和关闭时生成的流量。一旦应用程序不能启动、不能关闭,或这两个过程都异常缓慢,你就可以使用它确定原因。

3)关联/依赖

这个基线需要持续更久的捕获,以通过会话窗口确定这个应用程序依赖的其他主机和应用程序。有时我们会意识不到应用程序间的一些潜在依赖关系,这时应用程序基线便能派上用场。通过这个,你可以确定应用程序不能正常运转,是因为配置错误还是因为所依赖应用程序的高延迟。

4)数据传输率

你可以在应用程序服务器正常运转期间,使用Wireshark的捕获概述和绘图功能确定数据传输率和连接一致性。每当有人报告应用程序缓慢时,你就可以使用这个基线来确定当前问题是否是高利用率或高用户负载造成的。

4. 基线的其他注意事项

下面是创建网络基线的一些额外注意事项:

  • 创建每个基线都至少要经过3次:低流量期间一次(早晨)、高流量期间一次(下午三点左右)、无流量期间一次(深夜)。
  • 有可能的话,尽量避免直接在需要创建基线的主机上捕获流量。因为在高流量期间,这可能会增加设备负载和影响性能,并可能因数据包丢失导致基线无效。
  • 你的基线可能包含一些与网络有关的私密信息,一定要保护好它。将它存储在安全的地方,只有合适的人才有访问权限。但同时别放得太偏,以免需要时找不到。可以考虑将它存放在U盘或者加密分区里。
  • 让所有.pcap文件与你的基线关联,为更常见的参考值写一份“小抄”,比如关联关系或数据传输率。

6、丢失的网页内容

发现加载网页耗费了很长时间;加载过程终于完成时,页面丢失了大部分图片和内容。

我们建议,从客户端向远程服务器发送HTTP请求的地方开始分析。你可以使用过滤器筛选GET请求数据包(使用http.request.method == "GET"),也可以使用主选单中的Statics > HTTP > Requests进行过滤。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

在没有明确目标会话的情况下,下一个步骤是,选择Statistics > Protocol Hierachy对抓包文件进行协议分层统计。这将帮助我们定位非预期的协议和通信过程中各种协议分布情况的异常。请注意,协议分层基于当前的筛选条件进行。为了对整个抓包文件进行分析以获得期望的结果,请先清除之前的过滤器设置。 

网络工具Netwox和Wireshark详解

协议分层视图并不复杂,我们能够很快地辨别出,会话只涉及两个应用层协议:HTTP和DNS,DNS用于将域名转换为IP地址。因此,当访问一个网站,如果你的系统没有缓存这个站点的DNS记录,则系统将发送一个DNS请求来查询远程网站服务器的IP地址。

当DNS服务返回了一个可用的IP地址时,则域名解析信息将被添加到本地缓存中。此时,HTTP通信(使用TCP协议)可以开始了。

虽然分层统计结果看上去并没有什么异常,但是14个DNS数据包是值得注意的。一个查询单个域名的DNS请求通常只包含一个数据包,请求响应同样由一个数据包构成(除非响应数据包很大,这种情况下,DNS数据包将使用TCP传输)。会话中包含14个DNS数据包,这说明可能发生了多达7次的DNS请求(7个请求数据包 + 7个响应数据包 = 14个数据包)。

这里 HTTP 只有 12.66%,是因为其他 84.41%TCP 流量是纯数据传输和控制数据包。

DNS 数据包共有 28 个,意味着 14 个 DNS 事务(请求与响应),而会话窗口的 UDP 会话数也正好是 14 个,DNS 查询不会独自发生,其他流量中只有 HTTP,因此可以判断 ESPN网站的 HTML 代码有可能通过域名引用了其他域或子域,从而导致执行多个查询。

在浏览器中只输入了一个URL,其他请求是如何产生的呢? 

在理想状况下,浏览网页只需要查询到一个服务器地址,然后在一次HTTP会话中即可获取所有的内容。但在实际情况中,一个网页可能提供多个服务器上的内容。可能的场景是,全部基于文本的内容在一处,图像内容在另一处,内嵌的视频则在第三个位置。这还不包括广告,广告可能由位于很多独立服务器上的多个提供商发放。当HTTP客户端解析HTML代码时,发现了对其他服务器上资源的引用,为了获取引用的内容,客户端将尝试查询相关的服务器,这导致了额外的DNS查询和HTTP请求。这就是想要查看来自于单个源的内容时,HTML代码中引用了其他源的内容,之后,他的浏览器自动从其他多个域名请求内容。

明白了这些额外的请求是如何产生的,接下来,我们将逐个检查与每个请求相关的会话(Statistics > Conversations)。

下图所示的会话窗口为我们提供了重要线索:

网络工具Netwox和Wireshark详解

我们之前发现浏览器进行了7次DNS请求,以及相应的7次HTTP请求。在这个前提下,我们可以推断,有7个对应的IP间会话,然而,实际情况并非如此。这里出现了8个会话。应该如何解释这个情况?

一种可能性是,抓包文件被一个与本例中问题无关的会话“污染”。确保分析工作不被无关的通信扰乱是很重要的,但是这并不是这个会话中出现问题的原因。如果仔细检查每一个HTTP请求,并留意请求的目的IP地址,你会发现存在一个会话,没有对应的HTTP请求。

我们注意到,发送了439846字节至未知服务器,但是收到了317字节,这值得我们去深究。

现在,筛选并查看这个会话(在会话上右击,并选择Apply As Filter > Selected > A<->B),然后,运用TCP的知识来确定错误位置。

网络工具Netwox和Wireshark详解

在正常的TCP通信中,我们期望看到一个标准的SYNSYN/ACK-ACK握手序列。但这里发送了一个SYN数据包,但是我们没有看到SYN/ACK响应。

不仅如此,还向不可用的目的服务器发送了多个SYN数据包,最终导致了他的机器发送TCP重传数据包。此处的关键是,一个主机发送了数据包,但是从未接收到响应。

查看时间栏,我们发现,重传持续了2s,并且没有任何响应。在网络通信中,这堪称龟速。 

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

我们识别了7次DNS请求、7次HTTP请求和8个IP间会话。在确定抓包文件并没有被额外数据污染的情况下,我们有理由相信,神秘的第8个IP间会话可能是Pete加载网页缓慢并最终失败的原因。

由于某些原因,计算机试图与一个不存在或未提供服务的设备进行通信。为了了解这个情况出现的原因,我们不会查看抓包文件中的数据包;相反,我们会考虑文件之外的内容。 

当浏览网页时,他的浏览器识别了其他域名上的内容。为了获取这些内容数据,他的计算机发起DNS查询来获得这些域名的IP地址,之后,向这些目标IP发起TCP连接,从而发送HTTP请求并获取网页内容。

大部分系统使用一种DNS缓存机制。这一机制在系统内建立本地的域名与IP地址间的映射缓存,当访问已经缓存DNS记录、经常访问的域名时,系统将使用本地的映射缓存,而不发起DNS请求。

直至这些域名与IP地址间的映射过期,才进行新的DNS请求以获得域名的IP地址。然而,如果域名与IP的映射关系变更了,但是某个设备并没有发起新的DNS请求以获得新的地址,那么,在下次访问这一域名时,该设备将尝试连接一个无效的地址。

计算机缓存了某一个为网站提供内容的主机的域名解析信息。由于缓存信息的存在,因此获取页面内容时没有进行DNS请求,这导致他的系统试图继续连接旧的地址。然而,这个地址已经不再为提供HTTP服务。作为结果,请求超时,并且内容加载失败。

值得庆幸的是,手动清除DNS缓存,只需要在命令行中敲击很短的命令即可。或者,他可以等待几分钟,在DNS缓存记录过期、新的DNS请求完成后,再尝试访问网站。

7、服务器差异性比较

1. 捕获Twitter社交网络流量

1)登录过程

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

2)上传数据 

网络工具Netwox和Wireshark详解

 网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

2. 捕获 Facebook 社交网络流量

1)登陆过程

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

2)发送私信

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

3. 比较 Twitter 和 Facebook 的方法

Twitter 身份认证方法好,更快速、高效;Facebook 能保证所有内容都能成功传递,并且由于在关闭身份认证连接前不需要额外的认证,防止中间人攻击(Man-in-the-middle,MITM)。

比较类似的流量可以用来分析相似服务的差异性。 

8、无法访问Internet

在许多情况下,你可能需要诊断和解决Internet的连接问题,下面我们介绍一些你可能遇到的常见问题。

1. 网关配置问题

第一个问题的场景相当简单:用户不能访问Internet。我们已经确认该用户可以访问所有内网资源,包括其他工作站的共享内容以及运行在本地服务器上的应用程序。
这个网络架构非常简单,因为所有客户机和服务器都连接到一系列的简单交换机上。Internet连接由一个路由器(作为默认网关)处理,IP 地址信息由DHCP服务提供。这种情景在小型办公室中非常常见。

1)侦听线路

为了找出问题的原因,我们可以一边用嗅探器监听线路,一边让用户尝试浏览Internet。我们使用嗅探器的方法。

网络上的交换机不支持端口镜像。为了完成测试,我们已经不可避免地妨碍了用户,所以我们假设可以使他再次下线(这是说,使用网络分流器是监听线路的推荐办法)。

2)分析

如图所示,流量捕获记录文件以一个ARP请求和响应开始。在数据包1中,用户的计算机发送一个ARP广播数据包给网络上的所有计算机,试图得到默认网关172.16.0.107的MAC地址。

网络工具Netwox和Wireshark详解

根据数据包2中收到的响应,用户的计算机了解到172.16.0.107的MAC地址。收到这个响应后,计算机就有了到达网关的路由,而网关应该可以带它接入Internet。

ARP响应之后,计算机会在数据包3中请求将网站的域名解析成IP地址。如图所示,计算机发送一个DNS查询数据包到它的首选DNS服务器4.2.2.2。 

网络工具Netwox和Wireshark详解

正常情况下,DNS服务器会迅速响应DNS查询,但在这个例子中并非如此。我们没有看到任何响应,却发现同样的DNS查询再次发送到不同的目的地址。在数据包4中,第二个DNS查询被发送到预先配置好的备用DNS服务器4.2.2.1。

由于计算机仍然没有从DNS服务器收到响应,因此1s后,查询被再次发送到4.2.2.2。这个过程不断重复,在接下来的几秒钟,计算机交替向配置好的首选DNS服务器和备用DNS服务器发送请求。整个过程大概花了8s ,这正是用户的Internet浏览器报告该页无法访问之前所花的时间。

基于前面看到的数据包,我们可以开始查明问题的根源了。首先,我们看见一个ARP请求成功地抵达网络上我们认为的默认网关,由此我们知道网关设备在线并且能连接。我们也知道用户的计算机确实在网络上传输数据包,所以我们可以假设本机的协议栈没有问题。显然当进行DNS请求时,问题就发生了。

就这个网络来说,DNS请求是由Internet上的外部服务器(4.2.2.2或4.2.2.1)解析的。这意味着,要使解析顺利进行的话,负责将数据包路由到Internet的路由器必须成功将DNS查询转发到服务器,而且服务器必须响应。否则,就无法用HTTP请求Web页面。

我们知道其他用户上网都没有问题,这说明网络路由器和远程DNS服务器也许不是问题的原因所在。剩下唯一可能的问题来源是用户自己的计算机。

进一步检查这台故障计算机后,我们发现它不接受DHCP分配的地址,而是手动配置了地址信息,并且默认网关地址设置错了。被设置为默认网关的地址并不是一台路由器,它不能将DNS查询数据包转发到网络之外。

总结:

如果我们注意到 ARP 请求发送到与网关路由器不同的 IP 上,就能立刻知道问题所在。

由于其他用户可以正常上网,路由器到 DNS 服务器是可以正常连接的,那么问题就出在问题用户计算机上,检查后发现该机是手动配置 IP,默认网关设置错了,不能将 DNS 查询数据包转发到网络之外。

2. 意外重定向

在这个情景中,还是上网的用户。然而,不像之前那个用户,她可以访问Internet,只是不能访问Google主页。每次她想访问Google的网站时,都被重定向到一个浏览器页面“该页无法显示”。这个问题只影响她一个人。

与之前的情景一样,这是一个只有一些简单交换机和一个简单路由器网关的小型网络。

1)侦听线路

我们一边监听流量,一边让用户尝试浏览Google主页,得到pcap文件。

2)分析

如图所示,捕获记录文件以一个ARP请求和响应开始。

在数据包1中,用户计算机的IP地址是172.16.0.8,它向网段上的所有计算机发送一个ARP广播数据包,试图获得主机172.16.0.102的MAC地址,我们目前还不认识这个地址。

网络工具Netwox和Wireshark详解

在数据包2中,用户的计算机了解到IP地址172.16.0.102的MAC地址是00:21:70:c0:56:f0。根据之前的情形,我们猜测这是网关路由器的地址,通过这个地址数据包可以被再次转发到外部DNS服务器。

然而,如图所示,下一个数据包并不是DNS请求,而是从172.16.0.8到172.16.0.102的TCP数据包。它设置了SYN标志,表明这是两台主机间建立TCP连接时握手的第一个数据包。 

网络工具Netwox和Wireshark详解

显然,试图连接到172.16.0.102的80端口的TCP连接通常与HTTP流量有关。如上图所示,当主机172.16.0.102发送回带有RST和ACK标志的TCP数据包(数据包4)时,连接请求就中断了。 

带有RST标志的数据包是用来结束TCP连接的。在这个场景中,主机172.16.0.8尝试与主机172.16.0.102的80端口建立TCP连接。不幸的是,由于那台主机没有配置好服务在80端口的监听请求,因此只能发送TCP RST数据包结束连接。

这个过程又重复了两次,在通信最终结束前,用户计算机发送了一个SYN数据包并得到RST响应。

此时,用户在浏览器上看到了“该页无法显示”。

在查看其他工作正常的网络设备的配置信息后,数据包1和2中的ARP请求和响应引起了我们的注意。因为ARP请求并不是指向网关路由器的真实MAC地址,而是其他未知设备。在ARP请求和响应之后,我们期望看到向DNS服务器的请求,以得到Google的IP地址,但最终并没有看到。阻止

DNS查询的两个条件如下:

  • 发起连接的设备在DNS缓存中已经有域名—IP地址的对应项。
  • 发起连接的设备在hosts文件中已经有域名—IP地址的对应项。

进一步检查这台计算机后,我们发现它的hosts文件有一个Google表项,对应一个内网IP地址172.16.0.102。这个错误表项就是用户问题的根源。

计算机通常都把hosts文件当作域名—IP地址配对的可信来源,并且会在查询外部来源之前检索它。在这个场景中,用户计算机检查它的hosts文件,发现有一个Google的表项,就认为Google在这个本地网段。接着,它向这个主机发送ARP请求,并得到响应,然后尝试向172.16.0.102的80端口发起TCP连接。然而,由于该系统并没有配置成Web服务器,因此它不可能接受这个连接请求。
将这个hosts文件的表项移除后,用户的计算机就能正常访问Google了。

实际上,这个场景非常普遍。恶意软件在几年前就使用这个方法,把用户重定向到存放恶意代码的网站。试想,如果黑客修改了你的hosts文件,每次你登录网上银行,实际*问的却是一个伪造的网站,专门偷你账户里的钱,这该有多恐怖!

总结:

ARP 请求并不是指向网关路由器,ARP 之后也没有 DNS 请求以得到 GOOGLE 的 IP,
而 DNS 缓存或 hosts 文件中如果有该域名到 IP 地址的映射时是不进行 DNS 查询请求的,检
查用户电脑的 hosts 文件时发现 GOOGLE 网址对应内网 IP 172.16.0.102,从而导致了以上错
误。

C:\windows\system32\drivers\hosts 或 /etc/hosts

3. 上游问题

与前两个场景一样,在这个场景中,有一位用户抱怨它的工作站无法上网。后来,他发现只是无法访问Google这个网站。进一步调查之后,我们发现这个问题影响到了机构的每一个人——谁也无法访问Google。

这个网络的配置和前两个场景一样,仍然是用一些简单交换机和一个路由器将网络连接到Internet。

1)侦听线路

为了解决这个问题,我们首先访问Google以生成流量。这是一个全网问题——意味着它也影响你的计算机,而且可能是感染恶意软件导致的——所以你不应该直接在你的设备上嗅探。当你在现实中遇到类似这样的问题时,网络分流器就是较好的解决方案,因为它允许你在短暂中断服务后完全被动地获取流量。

2)分析

这个数据包的捕获以DNS流量开始,而不是我们之前看到的ARP流量。因为捕获的第一个数据包发往一个外部地址,并且数据包2包含来自那个地址的响应,所以我们可以假设ARP过程已经完成了,并且网关路由器的MAC-IP地址映射已经存在于主机的ARP缓存中。

如图所示,捕获中的第一个数据包从主机172.16.0.8发往地址4.2.2.1,并且它是一个DNS数据包。查看该数据包的内容,我们发现这是一个查询Google的A记录请求。

网络工具Netwox和Wireshark详解

 网络工具Netwox和Wireshark详解

如下图所示,来自4.2.2.1的响应是捕获文件的第2个数据包。查看Packet Details面板,我们发现响应这个请求的域名服务器提供了多个回答。此时看起来通信一切正常。 

网络工具Netwox和Wireshark详解

现在用户的计算机已经得到Web服务器的IP地址,它可以尝试与服务器通信了。

如图所示,通信过程从数据包3开始,这是一个从172.16.0.8发往74.125.95.105的TCP数据包。这个目标地址来自数据包2中DNS查询响应提供的第1个A记录。TCP数据包设置了SYN标志,并尝试连接远程服务器的80端口。 

网络工具Netwox和Wireshark详解

因为这是一个TCP握手过程,所以我们知道应该在响应中看到TCP SYN/ACK数据包,但是主机过一会儿又发送了另一个SYN数据包到目标。这个过程大概在1s后再次发生,如图所示,到这里通信停止了,浏览器报告找不到网站。 

网络工具Netwox和Wireshark详解

这时,我们想到由于能成功向外部DNS服务器提交查询请求,因此网络内的工作站可以连接到外网。DNS服务器响应了一些看起来有效的地址,然后我们的主机就尝试向其中一个地址建立连接。而且,我们尝试连接的本地工作站看起来功能正常。

问题是远程服务器没有响应我们的连接请求,连TCP RST数据包都没发过来。可能的原因有几种:Web服务器配置错误、Web服务器的协议栈崩溃、远程网络部署了数据包过滤设备。假设本地网络没有数据包过滤设备,那么所有可能的解决方法都在远程网络上,这超出了我们的控制范围。在 这个案例中,Web服务器不能正常工作,我们的所有尝试都失败了。一旦Google修复故障,通信就可以继续了。

总之:

可能的原因有:WEB 服务器配置错误、WEB 服务器协议栈崩溃、远程网络部署了防火墙;总之就是远程端的问题,并非用户这边的网络问题。

这个场景中的问题不是我们能修复的。我们的分析表明,问题不在于我们网络上的主机、路由器,也不在于提供域名解析服务的外部DNS服务器。问题在我们的网络设施之外。

有时候发现这不是我们的问题不仅能缓解压力,也能在管理层来敲门时挽回颜面。我与很多运营商、设备厂商和软件公司打过交道,他们都说不是自己那边的问题,但你已经看到,数据包是不会说谎的。

9、打印机故障

我们的技术支持管理员遇到了一个打印机的难题。销售部门的用户报告说大批量的打印机出故障了。当用户发送大量打印作业给它时,它会打印几页然后停止工作。他们改动了很多驱动配置选项,但没有任何效果。技术支持的员工们希望你去确认这不是网络问题。

1. 侦听线路

这个问题的焦点在于打印机,因此我们希望尽可能将嗅探器放到离打印机最近的地方。虽然我们不能在打印机上安装Wireshark,但网络上使用了高级三层交换机,所以我们可以使用端口镜像功能。我们将打印机连接的端口镜像到一个空端口,然后将一台装有Wireshark的笔记本电脑连接到该端口。安装完成后,我们让一位用户发送大量打印作业给打印机,而我们会监视端口输出内容,最后得到捕获pcap记录文件。

2. 分析

捕获文件的开头是发送打印作业的主机(172.16.0.8)与打印机(172.16.0.253)的TCP握手。握手之后,一个大小为1460字节的TCP数据包发送到打印机。数据大小既可以在Packet List面板Info列的右边看到,也可以在Packet Details面板的TCP头部信息的底部看到。

数据包4后面是另一个包含1460字节的数据包,如图所示。这个数据被打印机确认了。

网络工具Netwox和Wireshark详解

在捕获文件的最后两个数据包之前,数据流一直正常。数据包121是一个TCP重传数据包,也是故障的第一个标志,如图所示。

网络工具Netwox和Wireshark详解

前三个包为 TCP 握手,之后就是用户发送的打印数据包,和打印机回复的 ACK 确认包,直到第 121 个数据包出现问题。 

当一个设备发送TCP数据包给远程设备,而远程设备没有确认此次传输时,就发送一个TCP重传数据包。一旦到达重传门限,发送设备就假设远程设备没有收到数据,从而立刻重传数据包。在通信停止之前,这个过程重复了多次。 

在这个场景中,因为打印机没有确认传输的数据,所以客户工作站就向打印机发送重传数据包。如果展开TCP头部的SEQ/ACK analysis部分以及下方的额外信息,如图所示,你就可以从细节中看到为什么这是重传。根据Wireshark加工的细节,数据包121是数据包120的重传。另外,重传数据包的重传超时(RTO)在5.5s 左右。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

当分析数据包间隔时间时,你可以更改时间显示格式以适应特定情形。在这个案例中,我们想看一看之前的数据包在发送多久后发生了重传,于是选择View->Time Display Format并改成Seconds Since Previous Captured Packet这个选项。然后,你可以清楚地看见初始数据包(数据包120)发送5.5s后发生了数据包121的重传。

下一个数据包是数据包120的另一个重传。这个数据包的RTO是11.10s,包括上一个数据包的5.5s RTO。Packet List面板的Time列告诉我们,在上一次重传5.6s后发生了这次重传。这好像是捕获文件中的最后一个数据包,巧合的是,打印机大概在这个时间停止打印了。

好在这个分析场景只涉及内网的两台设备,所以我们只需要确定是客户工作站还是打印机的问题。我们可以看见数据正常流动了相当长的时间,然而在某一时刻,打印机停止响应工作站了。工作站尽了最大努力投递数据包,重传就是一个明证,但打印机就是没有响应。这个问题可以在其他工作站上重现,所以我们猜测打印机才是问题的来源。

进一步分析后,我们发现打印机的内存出故障了。当大量打印作业发送到打印机时,它只打印一定的页数,一旦访问到特定内存区域就停止工作。由此可见,内存问题导致打印机无法接收新数据,并中断了与主机的通信。

总结:

用户电脑尽力重传使数据到达目的地,但打印机就是没响应,这个问题可以在其他电脑上重现,进一步分析发现是打印机内存故障。

当通信意外停止时,靠 TCP 内置的重传功能指出了问题的确切位置。

10、访问不了总部应用服务器

在这个场景中,一家公司在总部之外新开设了几家分公司。通过部署一台Windows域控制器服务器和一台备用域控制器,公司的所有IT设施几乎都放置在总部。域控制器负责处理DNS和分公司用户的认证请求。

域控制器是一个代理DNS服务器,它接收来自总部的上游DNS服务器的资源记录信息。
当部署团队将新设施延伸到分公司时,发现没有人能访问网络上的内部Web应用服务器。这些服务器位于总部办公室,通过广域网(Wide Area Network,WAN)访问。问题影响到分公司的所有用户,并只限于这些内部服务器。所有用户都可以访问Internet以及分公司内的其他资源。

下图显示了在这个场景中要考虑的组件,包括了多个站点。

网络工具Netwox和Wireshark详解

1. 侦听线路

由于问题出在总部和分公司间的通信过程中,因此我们可以在多个地点收集数据来跟踪问题。问题可能出在分公司的客户端上,所以我们使用端口镜像功能查看其中一台计算机在线路上看到了什么数据包。收集完这个信息后,我们可以使用它推测出其他收集地点以帮助解决问题。

分公司工作站能访问 Internet 和分公司服务器,但访问不了总部应用服务器,在分公司对工作站进行端口镜像。

2. 分析 

如图所示,当工作站172.16.16.101尝试访问托管在总部应用服务器172.16.16.200的应用程序时,产生了捕获文件的第1个数据包。这个捕获只有两个数据包。第1个数据包是发送到172.16.16.251的DNS请求,查询应用服务器的A记录。这是总部172.16.16.200服务器的DNS域名。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

如图所示,这个数据包的响应是服务器故障,表明DNS查询被阻止了。注意到这个数据包只是一个错误(服务器故障),并没有响应查询结果。

网络工具Netwox和Wireshark详解

现在我们知道该通信故障与DNS有关。因为分公司的DNS查询由DNS服务器172.16.16.251解析,我们前往下一站。

为了从分公司的DNS服务器捕获合适的流量,我们将嗅探器留在原地,只改变端口镜像设置。现在服务器的流量就被镜像到我们的嗅探器了。捕获结果在stranded_branchdns.pcap文件中。

如图所示,这个捕获的开头是我们之前看到的查询和响应,但还有一个额外的数据包。额外的数据包看起来很奇怪,因为它尝试与中心办公室的首选DNS服务器(172.16.16.250)的标准DNS服务端口53进行通信,但它却不是我们过去看见的UDP类型。

在分公司对 DNS 服务器进行端口镜像:

网络工具Netwox和Wireshark详解

 开头是之前看到的 DNS 查询和响应,第三个是从服务器向主服务器 250 进行通信:

网络工具Netwox和Wireshark详解

为了找出这个数据包的用途,回顾我们之前对DNS的讨论。DNS通常使用UDP,但当响应超过一定大小时要使用TCP。在那种情况下,我们会看见一些触发TCP流量的UDP流量。另外,TCP也用于DNS的区域传送过程,它使资源记录在DNS服务器之间传输,这里就是该种情况。

分公司的DNS服务器是总部DNS服务器的从属服务器,意味着分公司的DNS服务器依赖于从总部服务器获得资源记录。分公司用户试图访问的应用服务器放置在总部,意味着总部DNS服务器是它的权威DNS服务器。要使分公司服务器能解析用户对应用服务器的DNS请求,总部DNS服务器必须把DNS资源记录传输给分公司DNS服务器,这可能是捕获文件中SYN数据包的来源。

SYN数据包没有得到响应,这告诉我们总部和分公司DNS服务器之间失败的区域传送导致了DNS故障。现在我们可以进一步找出区域传送失败的原因。办公室之间的路由器或中心办公室的DNS服务器可能是罪魁祸首。为了找出问题,我们可以嗅探中心办公室DNS服务器的流量,查看SYN数据包是不是到达了服务器。

我没有给出中心办公室DNS服务器的流量捕获文件,因为根本就没有。SYN数据包从来没有到达服务器。派遣技术人员查看连接两个办公室的路由器配置后,我们发现中心办公室的路由器被配置成只允许53端口的UDP流量进入,而53端口的TCP流量则被阻止了。这个简单的配置错误阻止了服务器间的区域传送,从而导致分支办公室的客户端无法解析对中心办公室设备的查询。 

11、插入数据库的数据经常出错

在IT界,开发者和系统管理员经常争吵。开发者总是将程序故障归咎于糟糕的网络设置和设备。系统管理员则倾向于把网络错误和网络缓慢归咎于糟糕的代码。

在这个场景中,程序员开发了一个应用程序,用于跟踪多个商店的销售并将报告发回中心数据库。为了节约正常工作时间的带宽,它没有被设计成实时应用程序。而是等报告数据累积一天后,才在晚上以逗号分隔值(comma-separated value,CSV)文件的形式传回,插入中心数据库中。

然而,这个新开发的应用程序工作情况不太正常。服务器接收到了各个商店传回的文件,但插入数据库的数据是错误的。一些地区的数据丢失了,有的数据还存在错误,而且文件的某些部分还丢失了。

系统管理员很烦恼,因为程序员抱怨这是网络的问题,程序员一口咬定文件在从商店传到中心数据库时被损坏了。我们就要证明他是错的。

1)侦听线路

为了收集所需数据,我们可以在其中一个商店或中心办公室捕获数据包。故障影响到了所有商店,因此如果这确实是网络导致的问题,那肯定是在中心办公室那边——它是所有商店通信的汇聚点。
因为网络交换机支持端口镜像,所以我们用端口镜像功能嗅探服务器的流量。我们只捕获单个商店上传CSV文件到收集服务器的流量。

2)分析

除了网络上的基本信息流量之外,我们完全不了解程序员开发的应用程序。捕获文件看起来是以一些FTP流量开始的,因此我们将调查这是不是传输CSV文件采用的机制。简洁、干净的通信最适合查看通信流量图了。选择Statistics -> Flow Graph,然后单击“OK”。

下图显示了结果图像:

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

可以看到客户机 128 向服务器 121 发起的 FTP 连接(端口 21),前三个包是 TCP 握手。

首先观察一下包列表,我们会看到一个172.16.16.128与172.16.16.121之间的基本FTP连接。

由于172.16.16.128发起连接,因此我们猜测它是客户端,172.16.16.121则是汇总与处理数据的服务器。流量图确认这些流量只用到了FTP协议,在握手竞争之后,我们开始看到来自客户端的FTP请求和来自服务器的响应。

我们知道这里会有一些数据传输,因此我们用FTP的知识,定位开始传输数据的位置。FTP连接和数据传输是由客户端发起的,因此我们应该寻找用于上传数据到FTP服务器的FTP STOR命令。简单的方法是生成一个过滤器。

这个捕获文件里到处都是FTP请求命令,因此我们不需要面对表达式生成器中的数百个协议和选项,只要在Packet List面板中直接生成过滤器就行了。

为此,我们首先需要选择一个出现有FTP请求命令的数据包。我们选择了数据包5,这是最接近列表顶部的一个。然后展开Packet Details面板的FTP section和USER section。右击Request Command:USER域,并选择Prepare a Filter。最后,选择Selected。

这将生成一个筛选含有FTP USER请求命令的数据包的过滤器,并出现在过滤器对话框中。接着,如图所示,编辑过滤器,将单词USER替换成STOR。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

现在按回车键应用这个过滤器,你会看见捕获文件里只有一个STOR命令,在数据包64 中。 

既然我们已经知道数据从哪里开始传输了,就可以单击Packet List面板上方的Clear按钮清除过滤器。查看从数据包64开始的捕获文件,我们看见这个数据包指定传输store4829-03222010.csv文件。

STOR命令后面的数据包使用了不同的端口,但它们被识别成FTP数据传输的一部分。我们已经验证数据在传输了,但我们仍然没有证明程序员是错的。为此,我们需要从捕获的数据包中提取传输文件,以展示文件在网络中传输后并没有被损坏。

当文件以未加密格式在网络中传输时,它会被分解成多个段,并在目的地被重新组装。在这个场景中,我们在数据包到达目的地并且尚未被组装之时捕获它们。数据就在那儿了,我们只需要将文件提取为数据流来重新组装它。为此,选择FTP数据流的任一个数据包(比如数据包66),并单击Follow TCP Stream,结果显示在TCP流中。

由于数据在FTP中以明文传输,所以我们能看到它,但却不能仅由此断定文件是完整的。为了重组数据,以便将其提取为原始格式,我们单击Save As按钮并指定数据包64显示的文件名,如图所示。然后单击Save。

网络工具Netwox和Wireshark详解

保存操作的结果应该是一个CSV文件,这是对商店系统传过来的文件的字节层次的复制。我们通过比较原始文件和提取文件的MD5哈希值来验证该文件。

MD5哈希值应该是一样的,如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

通过比较文件,我们可以证明网络并不是应用程序数据库出错的原因。文件从商店传输到收集服务器时是完整的,所以肯定是应用程序处理文件时出错了。 

总结:

数据包层面分析的一个好处是你不必处理杂乱无章的应用程序。糟糕的程序远比好的程序要多,但在数据包层面,它们就无所谓了。

在这个案例中,程序员关心的是应用程序所依赖的所有不明组件,但最终,他那耗费数百行代码写成的数据传输不过就是FTP、TCP和IP而已。通过使用我们了解的基本协议知识,可以确认通信过程毫无差错,甚至能通过提取文件证明网络正常。记住这个关键的结论:无论手里的问题多么复杂,都只是一些数据包而已。

十三、Wireshark高级特性

1、端点与网络会话

要想让网络通信正常进行,你必须至少拥有两台设备进行数据流的交互。端点(endpoint)就是指网络上能够发送或者接收数据的一台设备。两个端点之间的通信被称之为会话(conversation)。Wireshark 根据交互的特性来标识端点会话,特别是在多种协议之间所使用的地址。

端点在OSI的不同层级上使用多种不同类型的地址。例如在数据链路层,通信使用物理网卡的MAC地址。每个设备的MAC地址独一无二(虽然也有办法修改,但这可能会削弱它的唯一性)。然而在网络层,端点使用IP地址,IP地址可以在任何时间修改。

下图展示了地址是如何标识端点的两个例子。图中会话A阐释了数据链路(MAC)层的两个端点之间的通信。端点A的MAC地址是00:ff:ac:ce:0b:de,端点B的MAC地址是00:ff:ac:e0:dc:0f。会话B阐释了工作在网络(IP)层的两个设备之间的通信。端点A的IP地址是192.168.1.25。端点B的IP地址是192.168.1.30。

网络工具Netwox和Wireshark详解

现在让我们来看一看Wireshark如何在端点层面或会话层面上提供网络通信的相关信息。

1. 查看端点统计

当分析流量时,你也许会察觉到可以将问题定位到网络中的一个特定端点上去。举例来说,打开捕获pcapng文件和Wireshark的Endpoints窗口(Statistics->Endpoints)。这个窗口给出了各个端点的许多有用的统计数据,如图所示,包括每个端点的地址、传输发送数据包的数量和字节数。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

这个窗口顶部的选项卡(TCP、Ethernet、IPv4、IPv6和UDP)根据协议将当前捕获文件中所有支持和被识别的端点进行分类。单击其中一个选项卡,就可以只显示针对一个具体协议的端点。单击窗口右下角的EndpointTypes多选框,就可以添加额外的协议过滤标签。

勾选Name resolution多选框,可以开启名称解析功能来查看端点地址。如果你在处理大流量且需要过滤出所显示的端点数据,那么你可以事先在Wireshark主窗口里应用显示过滤器,然后在端点窗口勾选Limit to display filter多选框。这个选项会让端点窗口只显示与显示过滤器相匹配的端点。

另一个便利的功能就是你可以使用端点窗口将特定的数据包过滤出来,使其显示在Packet List面板中。

这是快速锁定某个端点相关数据包的方法。右键单击一个特定的端点,可以看到许多选项,包括创建过滤器以显示只与这个端点关联的流量,或者与选定端点无关的所有流量。你还可以在下拉菜单里选择着色(Colorize)选项,这会直接把当前端点地址转化为一条着色规则。用这种方法,你可以批量高亮与一个端点有关的包,以便于你在后续分析中可以很快地定位到它们。

2. 查看网络会话

打开pcapng文件后,访问Wireshark的会话窗口(Statistics->Conversations)来显示所有在捕获文件中的会话,如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

会话窗口和端点窗口看起来很像,但会话窗口展示的是一行两个地址组成的会话,以及每个设备发送或收到的数据包和字节数。地址A列代表着源端点,地址B列代表着目的端点。 

这个窗口中列出的会话以不同的协议分开。要查看针对一个协议的会话,可单击其中一个窗口顶部的选项卡进行切换或者在右下角增加一个其他的协议类型。就像在端点窗口里的操作一样,你可以使用名称解析、通过显示过滤器限制可见会话、右键单击一个特定的会话,来创建基于该会话的过滤器。基于会话的方式来过滤流量可以帮助你深入研究一些有趣的交互序列中的细节。

3. 使用端点和会话定位最高用量者

端点和会话窗口是排查网络问题的得力助手,特别是当你试图寻找网络中产生巨大流量的源头时。

下图显示了在这个捕获文件中以字节数目排序的端点列表:

网络工具Netwox和Wireshark详解

假设:74.125.103.163和172.16.16.128正在各自与很多其他设备进行大量通信,或者这两个IP之间在彼此通信。实际上,最大用量者之间的端点通信是比较常见的。

要确认这一点,请打开会话窗口并选中IPv4选项卡,你就可以通过使用字节数对列表进行排序来验证这一点。在这个例子中,你可以看到这个流量应该是连续的视频下载流量,因为从地址A(74.125.103.163)发出的数据包比从地址B(172.16.16.128)发出的要大得多,如图所示。

网络工具Netwox和Wireshark详解

2、协议分层

当在与未知的捕获文件打交道时,有时需要知道文件中协议的分布情况,也就是捕获中TCP、IP、DHCP等所占的百分比是多少。除了计算并汇总数据包之外,使用Wireshark的Protocol Hierarchy Statistics(协议分层统计)窗口也是一个对你的网络进行基准分析的好方法。

举例来说,pcapng文件打开并且清除之前的过滤器,选择Statistics->Protocol Hierarchy打开协议分层统计窗口,如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

协议分层统计窗口就像一张快照,会让你直观地看到网络活动中的各种类型。

在上图中,以太网流量占100%,IPv4流量占93.86%,TCP流量占79.47%,来自网页浏览的HTTP流量占4.68%。这些信息给我们提供了一个很好的测试网络的方式,特别是当你在脑海中对网络流量通常是什么样子有了大致的印象后。

举个例子,假设在正常情况下你的网络流量有10%是ARP流量,但在最近的一次捕获中发现有50%的ARP流量,你就可以推断也许哪里出问题了。在一些情况下,一种很少见的协议出现在流量中也比较有趣。如果你没去设置使用生成树协议(STP)的设备但又在协议分层统计中看到STP流量,这说明有设备设置错误。

假以时日,你就可以通过查看正在使用协议的分布情况,来得到网络中用户和设备的情况。比如说,当你看到高HTTP流量时,说明有很多网页浏览在进行。你会发现只需要简单地查看网段中的流量,就可以立即分辨这个网段属于哪个部门。

IT部门网段的流量中通常包含管理协议,例如ICMP或者SNMP的数据,订单管理部门通常会导致大量的SMTP流量,甚至我还可以在一些讨厌的实习生的网络区段内找到他们玩魔兽世界的流量! 

3、名称解析

网络数据通过使用各种字母数字组成的寻址地址系统进行传输,但这些地址系统通常都因为太长或者太复杂,而不容易被记住,比如物理硬件地址00:16:CE:6E:8B:24。名称解析(也称为名称查询)就是一个协议用来将一个独特的地址转换到另一个的过程,目的是让地址方便记忆。举例来说,记忆google的域名绝对比记忆216.58.217.238快得多。我们通过关联有意义的名称与神秘的地址,以便使我们更加容易记忆和识别。

1. 开启名称解析

Wireshark在显示数据包时,使用名称解析来简化分析。要启用这项功能,请选择Edit -> Preferences -> Name Resolution,如图所示。

网络工具Netwox和Wireshark详解

这里有一些Wireshark名称解析的主要选项。解析MAC地址(Resolve MAC addresses):这种类型的名称解析使用ARP协议,试图将第2层——数据链路层的MAC地址,例如00:09:5B:01:02:03,转换为网络层地址,例如10.100.12.1。如果这种转换尝试失败,那么Wireshark会使用程序目录中的ethers文件尝试进行转换。

Wireshark最后的尝试便是将MAC地址的前3个字节转换为设备IEEE指定的制造商名称,例如Netgear_01:02:03。

解析传输名称(Resolve Transport name):这种类型的名称解析尝试将一个端口号,转换成一个与其相关的名字。比如,将端口80显示为http。当你碰到一个不常见的端口而又不知道这是什么协议的时候,这个功能显得尤为便利。

解析网络名称(Resolve Network/IP name):这种类型的名称解析试图转换第3层——网络层的地址,例如将IP地址192.168.1.50,转换为一个易读的域名。假如域名具有高描述性,则对我们理解该系统的目的或其所有者,将是非常有帮助的。

前3项中只有MAC地址解析被选中了。

Use captured DNS packet data for address resolution:从已捕获的DNS数据包中解析出了IP地址和DNS域名之间的映射。

Use an external network name resolver:允许Wireshark为你当前的分析机器使用的外网DNS服务器生成查询,从而获得IP地址和DNS域名之间的映射。当捕获的文件里没有DNS解析数据而你还需要DNS域名解析时,这个功能就比较实用了。

Maximum concurrent requests:该参数会限制当前的一次最多DNS请求数量。当你的捕获文件将产生大量的DNS查询而且你并不想让DNS查询占用过多带宽的时候,请使用这项功能。

Only use the profile "hosts" file:把DNS解析限制在与活动Wireshark文档关联的host文件中。我会在下面的介绍如何使用这个文件。

在Preferences中所修改的设置,会在Wireshark关闭并重启后生效。要想让名称解析设置立马生效,请在主下拉菜单的View->Name Resolution把名称解析设置打开。在这个子菜单下你可以启用或关闭物理、传输、网络地址的名称解析。

你可以利用各种名称解析工具使你的捕获文件变得更加具有可读性,从而在一些情况下节省大量时间。举例来说,你可以使用DNS名称解析,来轻松地识别你试图精确定位为特定数据包源的计算机名称。

2. 名称解析的潜在弊端

名称解析有着很多优点,使用名称解析看上去很容易,但是也存在着一些潜在的弊端。首先,网络名称解析可能会失败,尤其是当没有可用的DNS服务器时。名称解析的信息是不会保存在捕获文件里的,所以在你每次打开一个捕获文件的时候都要重新进行一次名称解析。如果你在一个网络环境下捕获了流量,那么在另一个网络环境中打开该捕获文件时,你的系统可能访问不到之前的DNS服务器。

除此之外,名称解析还会带来额外的处理开销。如果你正在处理一个非常大的捕获文件而内存不剩多少的时候,你可能需要关闭名称解析,来节约系统资源。

另一个问题就是,对DNS名称解析的依赖会产生额外的数据包,也就是说你的捕获文件可能会被解析那些基于DNS地址的流量所占据。我们还可以再把问题想得复杂一些,如果在你分析的捕获文件中含有恶意IP地址,那么试图去解析它们会生成对攻击者控制的基础架构的查询,这样攻击者就有可能知道你的动作,甚至把你自己变成靶子。要避免跟攻击者打交道,请在名称解析选项对话框中关掉Use an external network name resolver。

3. 使用自定义hosts文件

在一个大型捕获文件中,不断从多个主机之间跟踪流量是一件很乏味的事情,特别是当外部主机解析服务访问不到的时候。好在我们可以根据它们的IP地址并且通过一个叫Wireshark hosts的文件来手动地标识系统。Wireshark的hosts文件实质是由IP地址列表和与之对应的名字组成的文本文件。为了快速查询,你可以在Wireshark里使用hosts文件来标记地址。这些名字会显示在数据包列表窗格里。

要使用hosts文件,请按照以下步骤操作:

(1)单击Edit->Preferences->Name Resolution并且选择Only use the profile "hosts" file。

(2)使用Windows记事本或者类似的文本编辑器创建一个新文件。该文件应该包含至少一条IP和对应名称的记录。Wireshark会根据这个映射来把相应的IP地址替换为hosts文件里对应的名称并最终显示在包列表窗格里。

(3)把文件以文本格式存为hosts并将其保存到正确的目录下,如下所示。请确保文件名没有后缀!

  • Windows: <USERPROFILE>\Application Data\Wireshark\hosts
  • OS X: /Users/<username>/.wireshark/hosts
  • Linux: /home/<usename>/.wireshark/hosts

现在打开一个捕获文件,如图所示,所有在hosts文件里的IP地址都被解析成了明确的名称。现在有着更有意义的名称显示在源和目的列中而不是之前的IP地址。

网络工具Netwox和Wireshark详解

用这种hosts文件的方式可以在分析中大幅增强识别特定主机的能力。当团队协作分析时,请考虑将hosts文件共享给其他网络上的同事。这会帮助你的团队迅速识别一些使用静态地址的基础系统,比如服务器和路由器。

注意:

如果你的hosts文件不起作用了,请确保你没有意外地在文件名后面加后缀名。这个文件的名字就叫hosts。

4、协议解析

Wireshark最大的优势就是对上千种协议解析的支持。Wireshark有这种能力的原因是它是开源软件,能够给开发者一个创造协议解析器(protocol dissectors)的框架。Wireshark中的协议解析器允许你将数据包拆分成多个协议区段以便分析。举例来说,Wireshark的ICMP协议解析器可能将网络上的原始数据提取出来,对其进行格式化并以ICMP数据包格式显示出来。

你可以将解析器看作是一个网络原始数据流和Wireshark程序之间的翻译器。如果需要Wireshark支持某一个协议,那么它就必须拥有一个内置的解析器(或者你可以自己写一个)。

1. 更换解析器

Wireshark使用解析器来识别每个协议并且决定该如何显示网络信息。不幸的是,Wireshark在给一个数据包选择解析器时也并不是每次都能选对,尤其是当网络上的一个协议使用了不同于标准的配置时,比如非缺省端口(网络管理员通常会出于安全考虑,或者是员工想要避开访问控制而进行设置)。

当错误地应用解析器时,我们可以人为地干预Wireshark的选择。

举例来说,打开pcapng这个捕获文件,可以注意到这个文件中包含了大量两台计算机之间的SSL通信。SSL是安全接口层协议(Secure Socket Layer protocol),用来在主机之间进行安全加密的传输。

由于其保密性,因此大多数的正常情况下,在Wireshark中查看SSL流量不会产生什么有用的信息,但这里一定存在着一些问题。如果你单击其中的几个数据包,然后在Packet Bytes面板中仔细查看这几个数据包的内容,很快就会发现一些明文流量。

事实上,如果你看第4个数据包,就会发现其中提到了FileZilla FTP服务器程序(FileZilla FTP server application),并且之后的几个数据包清晰地显示了对于用户名和密码的请求与响应。
如果这真是SSL流量,那么你应该不会读到数据包中的任何数据,并且你也不会看到以明文传输的所有用户名和密码。

根据这些信息,我们可以推测出这应该是一个FTP流量而不是SSL流量,而导致错误选择解析器的原因应该是这个FTP流量使用了原本用作HTTPS(基于SSL的HTTP)标准端口的443端口。

为了解决这个问题,你可以强制Wireshark对这个数据包使用FTP协议解析器。

这个过程被称为强制解码,需要按如下操作:

  1. 在协议列右键单击其中一个SSL数据包(比如第30号包),选择Decode As。这时会弹出一个对话框,你可以从中选择想要使用的解析器,。
  2. 在下拉菜单中选择destination(443),并在Transport选项卡中选择FTP,以便让Wireshark使用FTP解析器对所有端口号为443的TCP流量进行解码。
  3. 在你选好之后单击OK,就可以立刻将修改应用到捕获文件中去。

数据已经被解码为FTP流量,这时你就可以从Packet List面板中对它进行分析,而不是对每一个字节下功夫。

右键点击数据包,选择 Decode As,创建强制解码器,比如可以强制将 80 端口解析成FTP 协议,点击 Clear 可清除强制解码器。

网络工具Netwox和Wireshark详解

Wireshark的IMAP协议解析器可能将网络上的原始数据提取出来,对其进行格式显示出来。

网络工具Netwox和Wireshark详解

Wireshark使用解析器来识别每个协议并且决定该如何显示网络信息。有时候,我们会发现Wireshark在给一个数据包选择解析器时也并不是每次都能选择对,尤其是当前网络上的一个协议使用了不同标准配置时,比如非缺省端口…

当错误的应用解析器,我们可以人为干预Wireshark的选择。例如你可以强制Wireshark对这个数据包使用别的协议解析器。这个过程就做强制解码。我们选择(分析->解码为)。

 网络工具Netwox和Wireshark详解

2. 查看解析器源代码

开源软件的美妙之处就在于,当对正在进行的事情感到困惑时,你可以直接查看源代码来找到具体原因。当你想查明一个特定的协议没有被正确解析的原因时,这一点就变得非常顺手了。

在Wireshark网站上的Develop链接中,单击Browse the Code,就可以直接查看协议解析器的源代码。这个链接直接指向Wireshark的代码仓库,里面有Wireshark的最新以及之前的发行版。单击releases文件夹,便能看见所有官方的Wireshark(甚至包括Ethereal)发行版,其中最新版将在最下面显示出来。在你选择了想要查看的发行版之后,在epan/dissectors文件夹下可以找到协议解析器。每一个解析器都以packets-<protocolname>.c(数据包-协议名称.c)的形式命名。

这些文件可能会很复杂,但你应该可以发现它们都遵循着同一个标准模板并有着详细的注释。你并不需要成为一个C语言专家,就可以理解每一个解析器的基本功能。如果你想深入理解在Wireshark中所看到的,我强烈建议你至少看一些简单协议的解析器。 

5、流跟踪

Wireshark分析功能中令人满意的一点就是它能够将来自不同包的数据重组成统一易读的格式,一般称作packet transcript。流跟踪功能可以把从客户端发往服务端的数据都排好序使其变得更易查看,这样你就不需要从一堆小块数据里一个包一个包地跟踪了。

现有4种类型的流可以被跟踪。

TCP流:重组使用TCP协议的数据,比如HTTP和FTP。

UDP流:重组使用UDP协议的数据,比如DNS。

SSL流:重组加密的协议,比如HTTPS。你必须提供密钥来解密流量。

HTTP流:从HTTP协议中重组和解压数据。当使用TCP流跟踪但又没有完全解码出HTTP数据时,这个功能就派上用场了。

我们以一个简单的HTTP交互举例来说,打开pcapng文件,并在文件中单击任意一个TCP或者HTTP数据包,右键单击这个文件并选择Follow TCP Stream。这时TCP流就会在一个单独的窗口中显示出来。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

红色表示从源地址前往目标地址的流量,蓝色相反,也就是从目标地址到源地址的流量。这里的颜色标记以哪方先开始通信为准,在我们的例子中,客户端最先建立了到服务器的连接,所以显示为红色。

在这个TCP流中,你可以清晰地看到这两台主机之间进行的绝大多数通信。在这些通信开始的时候,最初是对Web根目录的GET请求,然后是来自服务器的一个用HTTP/1.1 200 OK表示请求成功的响应。当客户端请求另一个文件并由服务器给予响应的时候,这个简单模式就会重复出现。你可以看到一个用户正在浏览Google首页,但你不需要遍历每个数据包,就可以轻松地滚动文本,事实上你和这个用户看到的别无二致,只不过是以更深入的形式去看。

在这个窗口中除了能够看到这些原始数据,你还可以在文本间进行搜索,将其保存成一个文件,打印出来,也可以用ASCII码、EBCDIC、十六进制或者C数组的格式去看。这些选项都可以在跟踪TCP流窗口的下面找到。

跟踪TCP流在你和一些协议打交道的时候,绝对是一个好方法。

跟踪TCP和UDP流是一个简单的双击操作,但以可读的形式查看SSL流还需要额外的步骤,因为流量都是加密的,所以你必须提供与服务器加密所对应的私钥。

但是一旦有了私钥,你就可以按照以下步骤把它加载到Wireshark里:

  1. 单击Edit->Preferences进入Wireshark选项设置。
  2. 展开协议(Protocols)部分并且选择SSL协议标题。
  3. 单击加号(+)按钮。
  4. 提供所需要的信息,包括加密服务器的IP地址、端口、协议、密钥文件地址和密钥文件所使用的密码(如果需要的话)。
  5. 重启Wireshark。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

在RSA keys list后的空白处,提供以下信息<ip>,<port>,<protocol>,<key_file_name>
其中:

  • <ip>:是具有私钥的服务器或设备的IP地址
  • <port> :是SSL/TLS端口号,通常是443
  • <protocol> :通常是HTTP
  • <key_file_name> :是私钥的名称和路径is the location and file name of the private key
  • Note:逗号间没有符号。而且,使用分号间隔用于不同条目。“<ip>,<port>,<protocol>,<key_file_name>;<ip>,<port>,<protocol>,<key_file_name>;<ip>,<port>,<protocol>,<key_file_name>”.

在SSL debug file后的空白处填入排错文件的路径和文件名,点击 OK.,SSL则被解密。

如果一切顺利的话,你就可以捕获客户端和服务器之间的加密流量了。右键单击一个HTTPS的包,然后单击Follow SSL Stream,然后你就可以清晰地看到这一串SSL流的明文内容了。

网络工具Netwox和Wireshark详解

私钥格式

Wireshark只要有私钥就可以解密SSL流量。私钥需要时decrypted PKCS#8 PEM format (RSA)格式。你可以打开私钥看它的内容。如果是二进制,则是DER格式,不能用于Wireshark解密。

你可以使用OpenSSL转换密钥格式。例如,可以将PKCS#8 DER格式的密钥转化成decrypted PKCS#8 PEM format (RSA)格式。

在$提示符后输入如下指令:

openssl pkcs8 -nocrypt -in der.key -informat DER -out pem.key -outformat PEM

其中:

der.key 是DER密钥文件的文件名和路径

pem.key是pem文件的文件名和路径

解密后的decrypted PKCS#8 PEM format (RSA)格式如下:

网络工具Netwox和Wireshark详解

注意密钥开头为:

-----BEGIN RSA PRIVATE KEY-----

如果开头为:

-----BEGIN ENCRYPTED PRIVATE KEY-----

则这个密钥需要用适当的方法解密。OpenSSL可以实现。

  • At the $ prompt, enter the command: 在$提示符,输入命令:
    openssl rsa
    If you enter this command without arguments, you are prompted as follows: 如果输入指令不带参数,则出现以下字样:
    read RSA key
  • 输入解密的私钥文件名

你可以在openssl rsa后加上参数,假如你知道私钥和解密的PEM的文件名。

例如,私钥的文件名是myprivkey.pvk和解密的文件名问keyout.pem,命令如下:

openssl rsa –in myprivkeypvk -out keyout.pem

查看数据包脚本是Wireshark中的一个常用的分析功能,你将依赖它来快速确定正在使用的特定协议。

6、数据包长度分析

一个或一组数据包的大小可以让你了解很多情况。在正常情况下,一个以太网上的帧最大长度为1518字节,除去以太网、IP以及TCP头,还剩下1460字节以供应用层协议的头或者数据使用。如果你知道报文传输的最小需求,那么我们就可以通过一个捕获文件中数据包长度的分布情况,做一些对流量的合理猜测。这个技巧对我们尝试理解捕获文件的组成结构十分重要。Wireshark提供了数据包长度窗口,帮助你查看数据包基于其长度的分布情况。

打开文件pcapng后,选择Statistics->Packet Lengths,就会出现一个如图所示的数据包长度对话框。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

特别注意那些大小为1280~2559字节的数据包统计的行。这些较大的数据包通常表示数据传输,而较小的数据包则表示协议控制序列。

在这个例子中,我们看到较大的数据包占了相当大的比重(28.62%)。即使不看这个文件中的数据包,我们也仍然可以知道捕获中包含了一个或多个数据传输流量。这可能是HTTP下载、FTP上传,或者其他类型在主机之间进行数据传输的网络通信。

剩下的大多数数据包(37.30%)都是在40~79字节范围内,而处于这个范围的数据包通常是不包含数据的TCP控制数据包。

我们可以想一下协议头一般的大小。以太网报头是14字节(包含4字节CRC),IP报头至少20字节,没有数据以及选项的TCP数据包也是20字节,也就意味着典型的TCP控制数据包——例如TCP、ACK、RST和FIN数据包——大约是54字节并落入了这个区域。当然IP或TCP的额外选项会增加它的大小。

查看数据包长度是一个鸟瞰捕获文件的好方法。如果存在着很多较大的数据包,那么很可能是进行了数据传输。如果绝大多数的数据包都很小,我们便可以假设这个捕获中存在协议控制命令,而没有传输大规模的数据。虽然这不是一个必需的操作,但在深入分析前做一些类似的假设,有时还是很保险的。

以太网帧最大长度为 1518 字节,图中较大数据包(1280~2559)常用于传输数据,较
小的(40~79)则是协议控制序列,一个 TCP 控制数据包大约在 54 字节。 

7、图形展示

图形是分析工作中必不可少的一部分,并且也是得到一个数据集概览的好方法。Wireshark中有一些不同的图形展示功能,可以帮助你更好地了解捕获数据,其中第一个便是IO图形化功能。

1. 查看IO图

Wireshark的IO图窗口允许你对网络上的吞吐量进行绘图。你可以利用这些图,找到数据吞吐的峰值,找出不同协议中的性能时滞,以及比较实时数据流。

打开pcapng文件,单击任意一个TCP数据包并将其高亮,然后选择Statistics->IO Graphs,就可以看到一台计算机在从互联网上下载文件时的IO图的例子。

这个IO图窗口显示了数据流随时间变化的一个图形化视图。下图这个例子中所显示的下载量可知,每个周期大约有500个数据包,其过程中在一定程度上保持不变并在最后逐渐减少。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

通过选择 X 轴(数据包间隔时间)、Y 轴(数据包数量上限)来调整显示的 IO 图形,图中显示每团体传输 0~200 个数据包之间,且波动很大,表示是一个慢速下载过程。下载较快的程序一般显示0~700个数据包/秒。

通过过滤器可以将不同流量以不同颜色显示 IO 图形对比。

2. 双向时间图

Wireshark中的另一个绘图功能就是对给定捕获文件的双向时间绘图。双向时间(round-trip time, RRT)就是接收数据包确认所需的时间。解释得更清楚一点就是,双向时间就是你的数据包抵达目的地以及接收到数据包确认所需的时间之和。对双向时间的分析通常被用来寻找通信中的慢点或者瓶颈,以确定是否存在延迟。

我们来试一试这个功能吧。打开pcapng这个文件,选择一个TCP数据包,然后选择Statistics->TCP Stram Graph->Round Trip Time Graph,这个双向时间如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

图中每一个点都代表了一个数据包的双向时间,单击任何一点可以在 Packet List 面板中
看到相应数据包。

图中显示大部分数据多在 0.05s 以下,少量在 0.10~0.25s 间,对于慢速下载(看网页、
微博等)来说是可以接受的。 

虽然存在少量的值超出了可以接受的范围,但大多数的双向时间还都是可以的,所以对于文件下载来说,这个双向时间是可以接受的。当使用RTT图检查吞吐量方面的问题时,你要去找高延迟的时段,这在图中用多个高Y值的点表示。

3. 数据流图

数据流绘图功能对于可视化连接以及显示一定时间的数据流非常有用,这些信息使你可以更轻松地了解设备的通信方式。数据流图基本上以列的方式,将主机之间的连接显示出来,并将流量组织到一起,以便于你更直观地解读。

要生成数据流图,打开pcapng文件,并选择Statistics-> Flow Graph,结果如图所示。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

这个数据流图是一个递归DNS查询,表示一台主机收到DNS查询结果再把它转发出去。图中的每一个竖线表示单独的主机。

数据流图是一个将两个设备之间相互通信可视化的好方法,这也有助于你理解不熟悉的协议是如何正常交互的。 

8、专家信息

Wireshark中每个协议的解析器都有一些专家信息,可以提醒你该协议的数据包中的特定状态。这些状态可以分为4类。

  • 对话:关于通信的基本信息。
  • 注意:正常通信中的异常数据包。
  • 警告:非正常通信中的异常数据包。
  • 错误:数据包中的错误,或者解析器解析时的错误。

举例来说,打开pcapng这个文件,然后单击Analyze,并选择Expert Info Composite,便可以打开这个捕获文件的专家信息窗口。然后反选Group by summary来依据严重性排序输出。

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

网络工具Netwox和Wireshark详解

我们应该注意到,这个窗口中对于每种类型的信息都有一个选项卡,在这个例子中没有错误消息,但有3个警告、18个注意以及3个对话。

这个捕获文件中的大多数信息都与TCP有关,这仅仅是因为专家信息系统传统上常用于该协议。目前,总共为TCP配置了29种专家信息,并且这些信息在解决捕获文件的问题时非常有用。这些信息可以在满足如下条件的时候对数据包进行标记)。

1. 对话消息

窗口更新:由接收者发送,用来通知发送者TCP接收窗口的大小已被改变。

2. 注意消息

TCP重传输:数据包丢失的结果。当收到重复的ACK,或者数据包的重传输计时器超时的时候产生。

重复ACK:当一台主机没有收到下一个期望序列号的数据包时,它会生成其最后收到的一个数据的重复ACK。

零窗口探查:在一个零窗口包被发送之后,用来监视TCP接收窗口的状态。

保持活动状态ACK:用来响应保持活动状态数据包。

零窗口探查ACK:用来响应零窗口探查数据包。

窗口已满:用来通知传输主机接收者的TCP接收窗口已满。 

3. 警告信息

上一段丢失:指明数据包丢失。当数据流中一个期望的序列号被跳过时产生。

收到丢失数据包的ACK:当一个数据包已经确认丢失但仍收到了其ACK数据包时产生。

保持连接状态:当一个连接的保持连接数据包出现时触发。

零窗口:当接收方已经达到TCP接收窗口大小时,会发出一个零窗口通知,要求发送方停止传输数据。

乱序:当数据包乱序被接收时,会利用序列号进行检测。

快速重传输:一次重传会在收到一个重复ACK的20ms内进行。

4. 错误消息

没有错误消息

十四、Wireshark使用技巧

1、定制工具栏

对于一般情况下的抓包,根本无需调整与Wireshark工具条有关的任何配置。但若要不显示某些工具栏信息,则可以点击窗口中的查看菜单,选择显示的内容。

网络工具Netwox和Wireshark详解

同理,主窗口分别显示数据包列表(又叫分组列表),数据包细节(又叫分组详情),数据包字节(又叫分组字节流)。使用者根据显示需求,点击窗口中的查看菜单,选择显示的内容。 

网络工具Netwox和Wireshark详解

在Wireshark软件里,名字解析功能一经启用,数据包中的L2(MAC)L3(IP)地址以及第4层( UDP/TCP)端口号将会分别以有实际意义的名称显示。

选择菜单视图——解析名称,勾选相关设置。

网络工具Netwox和Wireshark详解

通常,在使用Wireshark抓包时,应为抓取到的网络中的正常流量建立一个(视觉上的)基线模板。这样一来,便可以一边抓包,一边通过抓包主窗口显示出的数据包的色差,来发现潜在的令人生疑的以太网、IP或TCP流量。

要让Wireshark体现出这样的色差,在抓包主窗口的数据包列表区域,选择一个深受怀疑或需要着色的数据包,同时点右键,在右键菜单对话着色下点选 Ethernet、IP或 TCP/UDP(TCP和UDP只有一项可选,视数据包的第四层类型而定)子菜单项名下的各种颜色菜单项。如此操作,会让该数据包所归属的( Ethernet、IP、UDP或TCP)会话中的所有其他数据包都以相同的颜色显示。

网络工具Netwox和Wireshark详解

配置数据包的时间显示格式,对时间显示格式的调整,会在Wireshark抓包主窗口数据包列表区域的time列的内容里反映出来。

在某些情況下,有必要让Wireshark以多种时间格式来显示数据包。比方说,在观察隶属同一连接的所有TCP数据包时,每个数据包的发送间隔时间是应该关注的重点;当所要观察的数据包抓取自多个来源时,则最应关注每个数据包的确切抓取时间。

选择菜单视图——时间显示格式,勾选想要显示的格式类型。

网络工具Netwox和Wireshark详解

Wireshark会根据事先定义的配色规则,用不同的颜色来“分门別类”地显示抓包文件中的数据。合理的定义配色规则,让不同协议的数据包以不同的颜色显示(或让不同状态下的同一种协议的数据包呈现出多种颜色),能在排除网络故障时帮上大忙。

Wireshark支持基于各种过滤条件,来配置新的配色规则。这样一来,就能够针对不同的场景,定制不同的配色方案,同时还能以不同的模板来保存。也就是说,网管人员可在解决TCP故障时,启用配色规则A;而在解决SlP和IP语音故障时,启用配色规则B。

选择菜单视图——着色规则,在打开的窗口进行个性化着色配置。

网络工具Netwox和Wireshark详解

2、Wireshark首选项

通过编辑菜单中的首选项设置,可以控制Wireshark软件的主界面及软件自身的诸多参数,包括数据包的呈现方式、抓包文件的默认保存位置,以及用来抓取数据包的网卡等。熟知这些参数的配置,可帮助我们更好地应对不同的抓包场景。

网络工具Netwox和Wireshark详解

Wireshark首选项分为6个主要部分,外加1个高级选项。

Appearance(外观):这些选项决定了Wireshark将如何显示数据。你可以根据个人喜好对大多数选项进行调整,比如是否保存窗口位置、3个主要窗口的布局、滚动条的摆放、Packet List面板中列的摆放、显示捕获数据的字体、前景色和背景色等。

Capture(捕获):这些选项可以让你对于自己捕获数据包的方式进行特殊设定,比如你默认使用的设备、是否默认使用混杂模式、是否实时更新Packet List面板等。

Filter Expressions(过滤器表达式):在之后我们将探讨 Wireshark 是如何让你基于设定标准去过滤流量的。这个部分中的选项可以让你生成和管理这些过滤器。

Name Resolutions(名称解析):通过这些设定,你可以开启Wireshark将地址(包括MAC、网络以及传输名称解析)解析成更加容易分辨的名字这一功能,并且可以设定并发处理名称解析请求的最大数目。

Protocols(协议):这个部分中的选项可以让你调整关于捕捉和显示各种Wireshark解码数据包的功能。虽然并不是针对每一个协议都可以进行调整,但是有一些协议的选项可以进行更改。除非你有特殊的原因去修改这些选项,否则最好保持它们的默认值。

Statistics(统计):这一部分提供了Wireshark中统计功能的设定选项。

Advanced(高级):以上6个部分中没有做的设置会被归类到这里。通常这些设置只有Wireshark的高级用户才会去修改。

1. 定制列显示

Wireshark默认显示了如下列内容:

网络工具Netwox和Wireshark详解

Wireshark默认显示了如下列内容:

网络工具Netwox和Wireshark详解

通过点击上图中的加号或减号,增加或删除默认显示列,调整为使用者最熟悉和习惯的列显示。 

网络工具Netwox和Wireshark详解

2. 定制抓包方式

要想更改默认用来抓取数据包的网卡,请点击Capture,在默认接口中选择对应的网卡,再点OK按钮即可(重启Wireshark软件之后才能生效)。当然,这里更改的只是默认配置,可在每次重新开始抓包之前,更换用来接收数据包的网卡。

网络工具Netwox和Wireshark详解

3. 定制默认名称解析

在Wireshark基础设置(一)中,也有默认名称解析设置。这两处设置影响和显示并没有不同。这里的设置更多的是倾向于默认设置,而前置更侧重于事后分析设置。

选择Name Resolution,勾选需要默认解析的名称项。

网络工具Netwox和Wireshark详解

4. 使用首选项定制协议内容

Wireshark主要分析和显示协议相关信息,所以,协议的抓取和显示就显得尤为重要,不同的显示方式或格式,可能会对使用者带来意想不到的收获。

展开首选项中的Protocols,就能查看到所有Wireshark支持的协议列表。

在这里,我们介绍常见的最重要的协议IP和TCP配置信息。

1)IPv4选项配置

关于IPv4选择中的配置如下图:

网络工具Netwox和Wireshark详解

2)TCP选项配置

TCP是协议分析中的重中之重,所以,TCP的配置信息相对也较多。

如下图:

网络工具Netwox和Wireshark详解

这里挑选重点和常见的配置项:

  • Validate the TCP checksum if possible

有时, Wireshark会抓到超多校验和错误(checksum errors)的数据包,这要归因于在抓包主机的网卡上开启的TCP Checksum offloading(TCP校验和下放)功能。该功能一开,便会导致 Wireshark将抓到的本机生成的数据包显示为“checksum errors”。因此,若 Wireshark抓到了超多校验和错误的数据包,则有必要先取消勾选与Validate the TCP checksum if possible子选项关联的复选框,再去验证是否真的存在校验和问题。

  • Analyze TCP Sequence numbers

如果要Wireshark对TCP数据包做详尽分析,就必须勾选与Analyze TCP Sequence numbers参数相关联的复选框,因为“TCP Sequence numbers(TCP序列号)”是TCP最重要的特性之一。

  • Relative Sequence Numbers

主机在建立TCP连接时,会启用一个随机的序列号,并将其值存入相互交换的第一个报文段的TCP头部的序列号字段。如果勾选了与Relative Sequence Numbers参数相关联的复选框, Wreshark就会把(一个TCP数据流中的)第一个TCP报文段的(TCP头部的)序列号字段值显示为0,后续TCP报文段的序列号字段值将依次递増,从而隐藏了真实的序列号字段值。

在大多数情況下,都应该让Wireshark显示TCP报文段的相对序列号(relative number),以方便网管人员查看。

  • Calculate conversations timestamps

与该参数相关联的复选框一旦勾选,在抓包主窗口的数据包结构区域中,只要是TCP数据包,就会在 transmission control protocol树下多出一个Timestamps结构,点击其前面的“+”号,就能看到Wireshark记录的该TCP数据包在本TCP数据流中的相关时间戳(Timestamps)参数。让Wireshark显示

TCP数据包的Timestamps信息,将有助于排查当时间敏感型TCP应用程序故障。

3、自定义Wireshark个性化环境

类似windows操作系统,或其他常用软件一样,Wireshark可以根据用户的喜好,创建并设置自己喜欢的个性化环境。通过不同的个性化设置环境,提高不同场景的分析速度和效率,更加精准的得到分析结果。

这里我们讲解如何创建个性化环境,包括抓包过滤器、显示过滤器、时间和列显示顺序、协议顺序、颜色配置等等内容。

1. 创建个性化配置

右键单击状态栏配置:Default,能够看到个性化配置文件的管理。

网络工具Netwox和Wireshark详解

点击New,新增一个配置文件,如下图。 

网络工具Netwox和Wireshark详解

例如,在这里创建一个名称为TCP Analyse的个性化环境。 

网络工具Netwox和Wireshark详解

点击OK,Wireshark会自动使用当前选择的环境配置文件。 

网络工具Netwox和Wireshark详解

这时候,你可以自定义所有能定义的内容。 由于当前采用的配置环境为TCP Analyse,所以,所有的个性化设置,都会保存在这个配置文件中。

使用相同的方法,定义更多适合自己的个性化分析环境。

2. 如何使用个性化配置文件

使用个性化配置文件的方法很简介,左键点击状态栏配置,就会列出最近使用的几个个性化环境名称,点击即可切换到对应的配置环境,此操作立即生效。

网络工具Netwox和Wireshark详解

如果个性化配置名称较多,左键点击的时候没有列出,你也可以选择右键,从切换到下拉菜单中选择要使用的配置环境。

网络工具Netwox和Wireshark详解

3. 如何导出和导入个性化文件

如果你善于创建个性化工作环境,那么导出导入工作就显得很重要,因为你一定会在新的环境中,想要轻松的使用到你之前习惯使用的分析环境。当然,你也可以将自己定义的个性化环境共享给你的朋友或同事,与他们分享数据包分析的乐趣。

个性化配置文件在C:\Users\用户名\AppData\Roaming\Wireshark\profiles下,拷贝这个目录中的文件到新的一台机器对应的目录,重新打开Wireshark即可生效。

网络工具Netwox和Wireshark详解

4、在工具栏中增加显示过滤器 

为自己的wireshark工具添加快捷过滤器按钮,也是大大提高包分析效率的一种方式。实际工作中我们需要关注和分析的信令往往没有那么多,而且比较固定,有些需要使用的过滤语法可能非常复杂,但是又经常用到,那么就可以为这种复杂的过滤器语法增加一个快捷按钮,用的时候直接点一下按钮就可以调出提前写好的语法进行数据包的过滤,无需再一个个的找过滤器并对过滤器进行组合了,提高我们分析问题的效率。

点击过滤器输入对话框右侧的“+”号,即可调出如下添加快捷按钮对话框。

网络工具Netwox和Wireshark详解

  • 标签:按钮标签
  • 过滤器:这里可以写复杂的过滤语法
  • 注释:对过滤器按钮做一个简单说明 

可直接添加快捷过滤按钮:

网络工具Netwox和Wireshark详解

点击ok后,在“+”后快捷按钮栏可看到添加的按钮 

网络工具Netwox和Wireshark详解

点击即可调出快捷按钮的过滤语法,并进行数据包的过滤。

可在过滤首选项进行添加:

1)调出过滤器首选项对话框

网络工具Netwox和Wireshark详解

2)添加快捷按钮配置 

网络工具Netwox和Wireshark详解

这样添加后,记得在“show in toolbar”方形框里打勾才能在快捷按钮栏看到,当然如果不常用的也可将对勾去掉,这样快捷按钮栏就看不到了,想显示时在勾上即可。

也可直接在配置文件中添加快捷过滤按钮。

1)调出快捷过滤按钮配置文件

网络工具Netwox和Wireshark详解

2)配置文件 

网络工具Netwox和Wireshark详解

  1. show in toolbar
  2. 标签
  3. 过滤语法
  4. 注释,这里应该是中文字符的16进制编码

这里添加的快捷按钮配置,需要重新打开wireshark才会加载看到结果。 

十六、Wireshark功能扩展

前面我们已经领略了Wireshark的强大功能,不过这些都是由工具开发者设计好的功能,如果我们遇到了一些特殊情况,而这些情况又是开发者当时所没有想到的,这又该如何解决呢?

其实很多网络安全方面的工具都考虑到了这个问题,例如Nmap、Metasploit和Wireshark都给出了解决的方案,这也正是这些工具日益受到使用者欢迎的原因。它们的解决方案就是在工具中提供编程的接口,只要使用者掌握一定的编程能力,就可以打造出符合自己需要的功能模块来。这样一来,这些工具就不再只是功能模块的简单拼凑,而是变成了一个拥有无限潜力的开发工具。

1、Wireshark编程开发基础

Wireshark的功能已经十分强大了,但是鉴于在这个世界上新的协议不断产生,我们需要扩展它的功能。Wireshark本身就是使用C语言开发出来的,所以它支持C语言编写扩展功能。虽然C语言在我国普通高校的教学中普及的范围很广泛,但是这门语言的难度也是十分大的。很多人在花费了很长时间来学习C语言之后,也无法用它写出一个实用的程序来。

相信Wireshark的开发团队也考虑到了这个问题,所以Wireshark还提供了对另一门语言Lua的支持。Lua是一种轻量、小巧的脚本语言,而且如果你具备编程语言基础的话,学习起来将会十分简单。

1. Wireshark中对Lua的支持

Wireshark的大部分版本中都内嵌了Lua语言的解释器,在我们开始为Wireshark编写扩展功能之前需要检查当前的版本是否支持Lua。检查的方法很简单,可以在启动Wireshark之后,依次单击菜单栏上的“帮助”→“关于Wireshark”,打开“关于Wireshark”对话框。

如图所示,在这个对话框中显示了当前版本所支持的所有工具,如果在这个对话框中显示了“with Lua 5.x”的话,表示已经内嵌了Lua的解释环境。

网络工具Netwox和Wireshark详解

如果在你的Wireshark版本中没有提供对Lua的支持,你就需要在操作系统中安装它的支持环境。
同样TShark中可以支持使用Lua语言编写扩展,但是也需要检查它是否内置了Lua的解释器,这一点可以通过在命令行中输入TShark-v来查看。

如图所示,我们可以看到这个Tshark和Wireshark一样都支持Lua5.2.4。

网络工具Netwox和Wireshark详解

2. Wireshark中Lua的初始化

init.lua是Wireshark中启动的第一个Lua脚本,它位于Wireshark的“global configuration”目录中。这个目录会因为配置的不同而不同,在我使用的Windows 7操作系统中,这个文件位于C:\Program Files\Wireshark中。在init.lua中可以开启和关闭对Lua的支持,同时也为Wireshark提供了安全检查。

当init.lua启动了之后,这个脚本中可以使用dofile函数来指定要执行的其他Lua脚本。这个过程是在数据包捕获之前就完成的。 

2、使用Lua开发简单扩展功能

在Wireshark中内置了一个简单的Lua编程环境,我们只需在菜单栏上依次单击“工具”→“Lua”→“Evaluate”,这个选项可以帮助我们轻松地实现使用Lua编程和调试。

在下图所示的“Evaluate Lua”对话框中可以输入Lua编写的代码,在这里编写的代码会自动载入Wireshark所提供的库文件。下面编写一个简单的Lua程序,它的作用是弹出一个显示“hello world!”的窗口。

网络工具Netwox和Wireshark详解

输入的程序代码如下:

local newwindow=TextWindow.new("hello world!")

然后单击“Evaluate”,就会弹出一个标题栏为“hello world!”窗口,如图所示。

网络工具Netwox和Wireshark详解

除此之外,在Wireshark中还可以使用Lua编写两种类型的插件,协议解析器用于解析报文,监听器用来收集解析后的信息。 

3、使用Wireshark开发新的协议解析器

在学习任何一种语言时,除了需要了解该语言的语法之外,还需要做的就是了解系统所提供的API。有了这些API的帮助,我们在编写程序时可以节省大量的时间和精力。Wireshark中就提供了很多高效的函数,在Wireshark的主页就提供了这些函数的详细说明。下面我们利用这些API来编写一个协议解析器。

1. 新协议的注册

我们先来查看一下Wireshark在解析协议时的原理。一个协议在进行解析时需要考虑两个方面,第

一是这个协议所使用的端口,第二是这个协议中数据的格式。

首先我们来看一下Wireshark中所支持的全部协议信息,单击菜单栏上的“视图”→“内部”→“解析器表”,就可以打开一个Wireshark的解析器表,如图所示。

网络工具Netwox和Wireshark详解

这个表中一共分成了4个子表,我们选中其中的第3个子表“Interger Tables”。在其中我们可以看到Wireshark可以解析的应用层协议对应的端口,如果这个应用层协议使用TCP协议进行传输的话,可以在“Interger Tables”中找到“TCP port”选项,这里会列出这些应用层协议所对应的端口。 

网络工具Netwox和Wireshark详解

所有可以解析的协议都需要先在Wireshark中注册,成功注册的协议会显示在“解析器表”中,在这个注册过程中我们需要完成如下的3项工作。

  1. 添加一个协议。
  2. 添加这个协议的解析器。
  3. 将这个协议注册到Wireshark中。

这里面需要用到几个Wireshark提供的函数,首先我们来查看用于实现添加协议的类,使用这个类实例化一个对象的方法为:

proto:__call(name,desc)

这里面包含两个参数,name表示新协议的名称,desc表示新协议的描述。我们使用如下命令来初始化一个新的协议:

local foo=Proto(“foo”,"Foo Protocol")

接下来我们添加这个协议的解析器,这需要使用到proto.dissector()函数,这个函数的形式为:

dissector:call(tvb,pinfo,tree)

需要用到3个参数:tvb、pinfo、tree。其中tvb表示要处理的报文缓存,pinfo表示报文,tree表示报文解析树。这里我们暂时先不添加这个函数的内容:

function foo.dissector (tvb,pinfo,tree)
end

现在我们将这个协议添加到“Interger Tables”的tcp.port中。

DissectorTable.get(tablename)函数会将协议添加到tablename中,这个参数tablename就是表的名字,这里可以是tcp.port或者是udp.port。

dissectortable:add(pattern,dissector)这里面的pattern可以是整数,整数区间或者字符串,这个是有前面所选的tablename所决定的。dissector可以是一个协议或者解析器。

DissectorTable.get("tcp.port"):add(10001,foo)

完整的代码很简单为:

local foo=Proto("foo","Foo Protocol")
function foo.dissector (tvb,pinfo,tree)
end
DissectorTable.get("tcp.port"):add(10001,foo)

好了到此为止,我们已经创建了一个Lua的框架文件,这里面包含了解析器的创建,解析器函数,解析器注册的功能。将这个文件以foo.lua为名保存到plugin目录中。Wireshark在启动时,就会自动加载这个文件。

如果放置在其他目录下,那么Wireshark将不会自动加载这个插件,我们需要修改Wireshark根目录下面的init.lua文件,在文件尾部追加下面一行代码,这里我们的Lua解析文件名为foo.lua,保存在C盘下,添加的代码为:

dofile("c:/foo.lua")

重新启动Wireshark之后,单击菜单栏上的“视图”→“内部”→“解析器表”,就可以在解析器表中“Interger Tables”中找到“TCP port”选项,可以看到10001号端口对应着协议foo。 

网络工具Netwox和Wireshark详解

2. 解析器的编写

我们已经了解了解析器的主体部分就是dissector函数,它将决定一个数据包在进行解析时显示在Wireshark中信息面板中的树状结构。

网络工具Netwox和Wireshark详解

在开始编写这个函数之前,我们先来回忆一下网络协议的一些基本知识。首先协议规定的数据包的长度不应该是任意的,这是因为每个字节的长度是8位,通常的网络协议是以4字节(32位)或者8字节(64位)为单位的。另外当数据通过网络传播时,采用的大端模式。

下表给出了一个极为简单的协议(这个协议是不存在的,为了方便学习,协议内容得到了最大的简化)。 

网络工具Netwox和Wireshark详解

我们假设这个协议使用2字节表示传输的序号Trans ID,使用另外2字节表示传输的消息类型Msg Type,使用4字节来存储Msg data。

好了现在我们虚拟了一个协议(但是它和真实的协议是一样的),下面就使用Lua语言来构造这个协议,这里我们需要使用ProtoField对象,它表示协议字段,一般用于解析字段后往解析树上添加节点。

添加的函数格式为:

ProtoField.{type}(abbr,[name],[desc],[base],[valuestring],[mask])

可以使用的type类型有:

uint8、uint16、uint24、uint32、uint64、framenum

例如我们虚构的协议中Trans ID的长度为2字节(16位),这里就选用unit16来定义它,只赋值前两个参数:

Trans_ID=ProtoField.uint16("foo.ID","ID")

同样的方法来定义Msg Type和Msg data:

Msg_Type=ProtoField.uint16("foo.Type","Type")
Msg_Data=ProtoField.uint32("foo.Data","Data")

接下来就可以将这几个字段合并成一个协议:

foo.fields={Trans_ID,Msg_Type,Msg_Data}

下面利用这个协议来定义协议树的结构:

function foo.dissector(tvb,pinfo,tree)
  • 把Wireshark报文列表上的“Protocol”列的文本置为foo协议名称“Foo”
pinfo.cols.protocol=foo.name
  • 往协议解析树上添加一个新节点subtree
local subtree=tree:add(foo,tvb(0))
  • 将Trans_ID的信息加入到协议解析树
subtree:add(Trans_ID,tvb(0,2))
  • 将Msg_Type的信息加入到协议解析树
subtree:add(Msg_Type,tvb(2,2))
  • 将Msg_data的信息加入到协议解析树
subtree:add(Msg_Data,tvb(4,4))

完整的代码如下所示: 

local foo=Proto("foo","Foo Protocol")
Trans_ID=ProtoField.uint16("foo.ID","ID")
Msg_Type=ProtoField.uint16("foo.Type","Type")
Msg_Data=ProtoField.uint32("foo.Data","Data")
foo.fields={Trans_ID,Msg_Type,Msg_Data}
function foo.dissector(tvb,pinfo,tree)
pinfo.cols.protocol="foo"
local subtree=tree:add(foo,tvb(0))
subtree:add(Trans_ID,tvb(0,2))
subtree:add(Msg_Type,tvb(2,2))
subtree:add(Msg_Data,tvb(4,4))
end
DissectorTable.get("tcp.port"):add(10001,foo)

将这段代码保存到Wireshark的plugins目录中,重新启动Wireshark就可以加载这个插件。 

4、测试新协议

接下来,我们可以使用任何一种发包工具产生一个TCP协议数据包,其中的数据部分为64位的0,目标端口为10001。

这里我使用了xcap工具来发送这个数据包,你可以到xcap网站下载这个工具,网站提供了这个工具和它的使用方法。

网络工具Netwox和Wireshark详解

用xcap发包工具的方法很简单,大体步骤就是创建报文、添加报文内容和发送报文。我们以构造一个上例中的foo数据包为例。

1)创建报文组,可点击菜单“报文组/创建报文组”,输入报文组名称,再单击“确定”按钮。 

网络工具Netwox和Wireshark详解

2)在左侧窗口中选择已创建的报文组,右侧窗口显示该报文组的界面。

网络工具Netwox和Wireshark详解

3)在右侧界面中点击“+”按钮,创建一个报文,并输入名称。 

网络工具Netwox和Wireshark详解

4)双击已创建的报文,出现报文配置向导,首页为以太网头部。这里的内容与我们的实验无关,无需进行改变。

网络工具Netwox和Wireshark详解

5)点击下一步,出现Ipv4头部页面,这里要将Protocol选中为0x06(TCP),因为我们的这个foo协议是以TCP作为下层协议的,然后单击“下一步”。 

网络工具Netwox和Wireshark详解

6)此时出现TCP页面,目的端口填写“10001”,这是关键的一步,因为只有来自10001端口的数据包才会被当做foo协议来解析。 

网络工具Netwox和Wireshark详解

7)如图所示,在Data部分添加64位的0。

网络工具Netwox和Wireshark详解

8)单击下方的“保存和关闭”按钮,报文创建成功。

9)获取接口列表。点击主界面工具栏中的“刷新列表”按钮(或对应菜单“接口”→“刷新接口”),所有接口会列在左侧窗口中,选中要使用的接口。单击工具栏中的“启动接口”按钮,之后接口启动成功。 

网络工具Netwox和Wireshark详解

10)如图所示,用鼠标选中要发送的报文(如果要发送多个,可使用Ctrl键选中多个),然后单击“发送”按钮,报文即被发送。 

网络工具Netwox和Wireshark详解

另外,在发送的同时使用Wireshark捕获数据包,可以看到Wireshark已经可以正确地解析这个数据包的格式了。 

网络工具Netwox和Wireshark详解

5、编写恶意攻击数据包检测模块

现在我们已经掌握了在Wireshark编程的基础知识。那么接下来就开始编写一个可以找出攻击者发送数据包的插件。这里就以SQL注入攻击为例,这是黑客对数据库进行攻击的一种常用手段。现在采用B/S模式的应用程序越来越多,但是开发这些应用的程序员水平参差不齐。很多人在编写程序的时候没有考虑到对用户输入的内容进行合法性判断,从而可能导致数据库内容的泄露,这种攻击方式就是SQL注入。

下面我们以一个实例来简单了解一下这种攻击方式。许多网页链接有类似的结构http://xxx.com/xxx.php?id=1基于此种形式的注入,一般被叫作数字型注入点,缘由是其注入点id类型为数字,在大多数的网页中,诸如查看用户个人信息、查看文章等,大都会使用这种形式的结构传递id等信息,交给后端查询出数据库中对应的信息,再将信息返回给前台。

而某个程序员在编写应用程序登录验证的SQL查询代码时,写成了以下形式:

select * from 表名 where id=1

如果攻击者在id=1后面添加“and 1=1”就可以构造出类似与如下的SQL注入语句从而完成对数据库的爆破:

select * from 表名 where id=1 and 1=1

这里我们可以知道,通常一个攻击者在对应用程序进行SQL注入时会先添加“and 1=1”,所以我们先来编写一个插件来检测在指定数据包的内容是否存在这个字段。这个插件应该包含以下3个部分:

  • URL解码部分;
  • 数据包内容检测部分;
  • 攻击数据包显示部分。

我们首先来编写URL解码部分,解码的原因是HTTP协议来用发送URL中的参数时会进行编码。这种编码将一些特殊字符(例如‘=’、‘&’、‘+’)转换为“%XX”形式的编码,其中XX是字符的十六进制表示,然后将空白转换成‘+’。比如,将字符串“a+b=c”编码为“a%2Bb+%3D+c”。

所以我们在解码的时候需要将其重新转换回来。这里需要使用函数string.gsub (s,pattern,repl[,m]),这个函数会返回一个替换后的副本,原串中所有的符合参数pattern的子串都将被参数repl所指定的字符串所替换。

如果指定了参数m,那么只替换查找过程的前m个匹配的子串,参数repl可以是一个字符串、表或者函数,并且函数可以将匹配的次数作为函数的第二个参数返回。这个URL解码的程序如下所示:

function unescape (s)
s=string.gsub (s,"+","")
s=string.gsub (s,"%%(%x%x)",function(h) return string.char(tonumber(h,16))
end)
s=string.gsub (s,"\r\n","\n")
return s
end

然后我们编写一个检查数据包中是否包含特定字段的程序,首先需要将数据包使用unescape()函数解码,然后再使用string.match()函数进行查找。这个检查的程序如下所示:

local function check(packet)
local result=unescape (tostring(packet))
result=string.match(result,"and 1=1")
if result~=nil then
return true
else
return false
end
end

最后将检测到的结果显示在数据包层次表中,这部分的内容如下所示:

local function SQLInject_postdissector()
local proto=Proto('suspicious','suspicious dissector')
exp_susp=ProtoExpert.new('suspicious.expert','Potential SQL Inject',expert.group.SECURITY,expert.severity.WARN)
proto.experts={exp_susp}
function proto.dissector(buffer,pinfo,tree)
local range=buffer:range()
if check(range:string()) then
local stree=tree:add(proto,'Suspicious')
stree:add_proto_expert_info(exp_susp)
end
end
register_postdissector(proto)
end
SQLInject_postdissector ()

同样,如果这个编写好的插件没有放置在plugin目录中的话,那么Wireshark将不会自动加载这个插件。

我们需要修改Wireshark根目录下面的init.lua文件,在文件尾部追加一行代码,假设这里我们的Lua解析文件名为SQLInject_postdissector.lua,保存在C盘下,那么添加的代码为:

dofile("c:/SQLInject_postdissector.lua")

现在我们使用这个插件来分析一个数据包文件中是否含有SQL注入攻击的数据包,通过Wireshark对sql.pcap文件进行分析,下图给出了一个已找到了具有SQL注入攻击的数据包。

网络工具Netwox和Wireshark详解

Wireshark的插件编写,这个功能在实际应用中相当有用,尤其是软件开发人员在设计新的应用时。之前很多的网络分析工具只能解析内置的协议,因此一旦出现新的协议时就毫无用武之地。

而Wireshark则弥补了这个缺陷,它提供的扩展功能已经成为当前流行工具的共同特点,例如Nmap和Metasploit都提供了开发功能。