哈喽,小伙伴们,大家好,我是小智。
在后面的网络知识学习中,都离不开对数据报文的分析。俗话说,工欲善其事,必先利其器。掌握网络分析工具的基本使用,对我们后面的学习会起到事半功倍的效果。
网络世界中的数据报文(我们也叫它数据包)看不见摸不着,但是通过 Wireshark 这款软件,我们不仅可以抓取到报文,而且还可以详细分析报文的每个字段。
这个章节包含的内容如下:
由于前面安装的 CentOS 没有图形化界面,所以在 CentOS 里面不能直接使用 Wireshark 抓包,我们要先通过 Linux 系统的 tcpdump 工具抓取并保存报文,然后将报文的 pcap 文件拖到 Windows 系统上用Wireshark 进行分析。
我们在 CentOS 上使用 yum 工具安装 tcpdump:
tcpdump 提供了各种抓包选项和过滤表达式,在这个章节,我们掌握最基本的最常用的就好,后面如果有需要,我们可以在虚拟机上通过 man tcpdump 查询相关选项的含义。
现在我们开始抓包,首先打开两个连接虚拟机的终端窗口,在第一个窗口,执行 tcpdump 的抓包命令:
tcpdump -i ens33 tcp -n -v -w http.pcap
在第二个窗口,我们用 curl 工具访问http://info.cern.ch/网站的首页,触发 Linux 操作系统发出网络报文:
再回到第一个窗口,ctrl+c 停止抓包,可以看到当前目录上已经生成了一个 http.pcap 的文件,然后使用 sz http.pcap 将文件拖到 Windows 系统上面。到这里,tcpdump 抓包就结束了,等后面Wireshark 安装好了之后,我们把 http.pcap 文件打开就可以看到报文了。
有没有小伙伴觉得很奇怪,为什么小智要选 http://info.cern.ch/ 这个网站作为例子呢?其实很多人可能不知道,它是世界上第一个网站,从 1991 年 8 月 6 日首次开放至今,至今已经快 30 年了。
关于 tcpdump 常用的抓包和过滤选项,小智这里整理了一下:
-i: 指定网络接口,也就是要抓包的网卡名称,小智这里用的是 ens33,是通过ifconfig 命令查看到的;
-w: 指定抓包文件名称,将报文保存到文件,以便后续使用 Wireshark 进行分析,注意文件后缀名是pcap。不加-w时,报文信息会在终端上显示出来;
-n: 指定将每个监听到数据包中的域名转换成 IP 地址后显示,不把网络地址转换成名字;
-nn: 指定将每个监听到的数据包中的域名转换成 IP 、端口从应用名称转换成端口号后显示;
-v: 解析和打印时,产生详细的输出,如果使用了 -w 选项写入文件时,每秒报告一次捕获的数据包数量;
-c: 限制要抓取报文的个数,抓到指定报文数后,抓包自动停止;
主机过滤: host、src host(源主机)、dst host(目的主机),例如 tcpdump -i enss33 host 192.168.1.2,表示只抓取IP地址为192.168.1.2的报文;
协议过滤: ip、tcp、udp、icmp、arp、ipv6;
端口过滤: port、src port(源端口)、dst port(目的端口);
逻辑表达式: and(且)、or(或)、not(非);例如 tcpdump -i enss33 host 192.168.1.2 and tcp,表示抓取IP地址为192.168.1.2同时是tcp协议的报文;
Wireshark 是一款免费开源的抓包和分析工具,我们可以从官网上下载相应的版本,地址为:
https://www.wireshark.org/#download。
小智的电脑是64位Win10系统,所以选择下载的是 Windows Installer(64-bit)。Wireshark 的安装很简单,下载完成后,按照软件提示一路点击 Next 安装就可以了。
打开 Wireshark 3.4.0,主界面如下:
在主界面上可以看到电脑网卡的列表,双击选择要抓包的网卡,就可以开始抓包:
或者在菜单栏点击捕获—》选项,也可以看到电脑网卡的列表,选中要抓包的网卡,点击开始按钮:
点击开始抓包,如果看到报文显示区在滚动,同时,在右下角也显示有抓取报文的计数,说明 Wireshark 在正常工作抓取报文了。
执行相应的网络访问操作后,我们点击 Wireshark 左上角的停止按钮,停止抓包。
如果我们想把报文保存成文件存在电脑上,方便以后查看,点击文件—>保存,输入文件名,点击保存就行。
点击 Wireshark 的文件菜单,打开刚刚 tcpdump 抓包产生的 http.pcap 文件,我们就可以查看到报文的详细信息了。在查看报文之前,我们先看看 Wireshark 的整个界面:
Wireshark界面分为以下几个功能区:
主菜单栏: 提供用户操作 Wireshark 的功能菜单,包括启动停止抓包、保存抓包文件等等;
主工具栏: 提供菜单栏中用户经常使用的功能;
过滤器工具栏: 用户可以在此输入各种过滤条件,过滤选择自己想看的报文;
报文列表区: 根据过滤工具栏的过滤条件,展示报文列表,默认展示所有报文;
报文详细信息区: 按照网络层次,展示选中报文的报文头部和数据;
报文二进制字节区: 展示选中报文的二进制字节数;
状态栏: 显示用户选中信息的状态,以及报文会话数和报文数的统计;
数据包列表区展示了报文编号、时间戳、源 IP 地址、目的 IP 地址、协议、报文长度和报文信息:
报文详细信息区,可以很清晰的看到网络五层模型中各个层次的信息:
Frame: 物理层信息
Ethernet II: 数据链路层以太网头部信息
Internet Protocol Version 4: 网络层 IP 包头部信息
Transmission Control Protocol: 传输层 TCP 头部信息
Hypertext Transfer Protocol: 应用层 HTTP 协议
之前讲的 MAC 地址、IP 地址和端口,这些各个层次关键的通信标识是不是看起来就一目了然了呢?
现在有一个问题,报文列表区那么多报文,如果我们现在只想查看访问 cern 网站首页的报文,该怎么办呢?
这个时候就该使用 Wireshark 的报文过滤功能了。Wireshark 的报文过滤功能非常强大,支持按报文中的各个字段以及字段组合进行过滤。最常见的比如按照 MAC 地址过滤、按照 IP 地址过滤、按照端口过滤等等。
这里我们选择根据IP地址过滤,按住 win+R 键,输入 cmd 后选择确定,ping info.cern.ch,可以查看到它的IP地址是 188.184.100.82。
在过滤工具栏里输入 ip.addr == 188.184.100.82,选择过滤栏右侧箭头,应用过滤条件:
关于Wireshark常用的过滤条件,小智也总结了一下:
IP地址过滤: ip.addr、ip.src、ip.dst,例如:ip.addr == 192.168.1.2;
协议过滤: tcp、udp、dns、ftp、http;
端口过滤: tcp.port、tcp.srcport、tcp.dstport,例如:tcp.port == 80;
逻辑表达式: &&、||、!,例如:ip.src== 192.168.1.200 && tcp;
运算符:>、>=、<、<=,例如tcp.len == 20;
访问 info.cern.ch 网站,应用层使用的是 HTTP 协议。现在我们通过抓取的报文,来简单看一下 HTTP是如何工作的。
1)由于 HTTP 下层使用传输层的 TCP 协议,所以前面三个报文是 TCP 的三次握手报文(编号81-83的报文,后面讲 TCP 协议的时候会讲到),还可以看到目的端口使用的是 80。
2)编号 84 的报文,看到的是浏览器发起了一个GET请求"GET / HTTP1.1",请求的网站资源路径是"/",也就是根路径,使用的 HTTP 版本是 1.1。
3)编号 96 的报文,网站服务器响应应了该请求 “HTTP/1.1 200 OK”,即把网站首页的内容返回给了浏览器客户端。
就这样,浏览器通过 GET 请求,获取到了 cern 网站服务器返回的内容。如果想详细查看 HTTP 请求和响应的字段,可以选中相应的报文后,在数据包详细信息区点开 HTTP 头部信息。
好了,到这里,网络报文分析工具的使用,小智就讲完了。让我们一起再回顾一下吧:
首先,我们在 CentOS 上安装了 tcpdump,安装使用的是在线安装工具 yum。
接着,我们使用 tcpdump 抓取 curl 访问 cern 网站首页的 http 报文,保存成了 pcap 文件。
然后,我们在 Windows 上下载安装了 Wireshark 软件。
再接着,我们学习了 Wireshark 的使用,包括如何抓包、查看包和过滤包。
最后,我们简单分析了一下 HTTP 报文的交互过程,为后面深入学习 HTTP 协议做好准备。
现在,小伙伴们,你们是不是感到既兴奋又困惑呢?兴奋的是原来网络还可以这样学,困惑的是还有这么多不明白的地方。不过不要紧,这一路上,小智我都会一直陪着你,给你指明方向,为你答疑解惑,和你一起探索奇妙的网络世界。