澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

澳门新萄京官方网站:抓包工具,DNS剖析进度

2019-06-08 作者:澳门新萄京官方网站   |   浏览(100)

环境:VMware-Workstation-12-Pro,Windows-10,CentOS-6.9-x86_64,Xshell5

环境:VMware-Workstation-12-Pro,Windows-10,CentOS-6.9-x86_64,Xshell5

标签(空格分隔): wireshark数据包分析过程 DNS解析 TCP三次握手

Wireshark和 TcpDump抓包分析心得 

聊聊 tcpdump 与 Wireshark 抓包分析 

基本介绍

tcpdump是Linux自带的抓包工具,可以详细看到计算机通信中详细报文内容,如果读者熟悉另一款
强大的抓包工具wireshark,tcpdump相当于是wireshark的命令行版本。dump这个单词有垃圾堆,
倒垃圾的意思,在计算机英语中的含义是转存。

tcpdump官网:
This is the official web site of tcpdump, a powerful command-line packet analyzer;

查看本机tcpdump的版本

[root@as4k html]# tcpdump --version  
tcpdump version 4.1-PRE-CVS_2017_03_21  

tcpdump的最新版本
Version: 4.9.2
Release Date: September 3, 2017

官方文档:
的教程,很多大牛的博客都有借鉴此文的内容。

基本介绍

tcpdump是Linux自带的抓包工具,可以详细看到计算机通信中详细报文内容,如果读者熟悉另一款强大的抓包工具wireshark,tcpdump相当于是wireshark的命令行版本。dump这个单词有垃圾堆,倒垃圾的意思,在计算机英语中的含义是转存。

tcpdump官网:
This is the official web site of tcpdump, a powerful command-line packet analyzer;

查看本机tcpdump的版本]

[root@linuxidc html]# tcpdump --version 
tcpdump version 4.1-PRE-CVS_2017_03_21 

tcpdump的最新版本
Version: 4.9.2
Release Date: September 3, 2017

官方文档:
的教程,很多大牛的博客都有借鉴此文的内容。

题外话:正值白色情人节,她说,暖壶瓶里的热气,发出撕心裂肺的呻吟,刺耳却充满期待,打开瓶塞的时候,便像彩虹一样飘荡在天空,一霎那的热气扑鼻,你满怀欣喜,转瞬间,她便也消失得无影无踪,沸腾的热水,慢慢等待着衰老,等待着凋零。

 

1 起因

这是什么鬼

TCPDUMP(8)                                                          TCPDUMP(8)  

NAME  
       tcpdump - dump traffic on a network  

SYNOPSIS  
       tcpdump [ -AdDefIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]  
               [ -C file_size ] [ -G rotate_seconds ] [ -F file ]  
               [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]  
               [ -Q|-P in|out|inout ]  
               [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]  
               [ -W filecount ]  
               [ -E spi@ipaddr algo:secret,...  ]  
               [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]  
               [ expression ]  

上面是tcpdump,man page里面的内容,oh my god!这么多参数,本文当然不可能逐一介绍上面的内容,
我们先直接通过一些简单的案例看看效果,然后给出一些常见参数的用法。

这是什么鬼

TCPDUMP(8)                                                          TCPDUMP(8) 

NAME 
      tcpdump - dump traffic on a network 

SYNOPSIS 
      tcpdump [ -AdDefIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] 
              [ -C file_size ] [ -G rotate_seconds ] [ -F file ] 
              [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] 
              [ -Q|-P in|out|inout ] 
              [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] 
              [ -W filecount ] 
              [ -E spi@ipaddr algo:secret,...  ] 
              [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] 
              [ expression ] 

上面是tcpdump,man page里面的内容,oh my god!这么多参数,本文当然不可能逐一介绍上面的内容,
我们先直接通过一些简单的案例看看效果,然后给出一些常见参数的用法。

背景:近期打算求职,于是便闷头闷脑的收集各类知识点,恰巧看到一篇讲解通过实例学习tcpdump命令,就引申出这些相关知识。

  1. Wireshark与tcpdump介绍

前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的状况。这个问题是偶发性的,大概发生的几率为5%-10%左右,这个概率已经相当高了。在排查问题的过程中使用到了tcpdump和Wireshark进行抓包分析。感觉这两个工具搭配起来干活,非常完美。所有的网络传输在这两个工具搭配下,都无处遁形。

基础案例

基础案例

一.tcpdump命令

1.从指定的网卡bond0中捕获数据包
tupdump -i bond0
2.将捕获的包写入文件
tupdump -i bond0 -w packets_file
3.读取之前产生的tcpdump文件
tupdump -r packets_file
4.查看源地址192.168.1.110或者目标地址192.168.1.50,端口为22,写入到ssh_packets文件中
tcpdump src 192.168.1.110 or dst 192.168.1.50 && port 22 -w ssh_packets

具体详细实例请看tcpdump实用手册

 Wireshark是一个网络协议检测工具,支持Windows平台和Unix平台,我一般只在Windows平台下使用Wireshark,如果是Linux的话,我直接用tcpdump了,因为我工作环境中的Linux一般只有字符界面,且一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析。

为了更好、更顺手地能够用好这两个工具,特整理本篇文章,希望也能给大家带来收获。为大家之后排查问题,添一利器。

观察DNS解析情况

我们知道,Linux系统要想正常访问互联网,需要正确配置DNS解析,现在我们已经配置了阿里云的DNS
223.6.6.6,我们想看一下DNS解析是否正常,就可以使用tcpdump来抓取DNS包,准备好两个xshell
窗口,按照如下方式操作

步骤1 tcpdump -n -i any port 53

澳门新萄京官方网站 1

尽量在root用户下使用tcpdump命令,-n表示不要把IP地址解析成域名,-i表示抓取哪块网卡的通信
数据包,any表示任意一块,port是指定要抓取数据包的端口,DNS服务工作在53端口上,执行完毕之
后,我们切换到第2个窗口,进行步骤2

步骤2 ping -c3 baidu.com
-c3表示和ping次停下,这时候我们的计算机和百度产生的通信,窗口1的tcpdump就会监听到我们的通信
数据,也就是所谓的抓包,切换到窗口1,看到的数据大致如下

澳门新萄京官方网站 2

在上图中我们可看到本地192.168.56.11,端口42711进程向阿里云DNS服务器223.6.6.6,请求告知
baidu.com的IP地址是什么?阿里云的DNS服务器成功给了我们答复,由此可以说明,我们的DNS工作
正常。

如果抓取的DNS数据包,看起来向下面这样:

澳门新萄京官方网站 3

从上图可以看出,我们一共发起了三次DNS查询请求,服务器才最终给我们返回了IP地址,这显然是不太正常的,
由此我们可以判断,这次网络卡慢的原因,应该出在DNS解析上。

以上就是使用tcpdump抓包来简单判断网络通信状况。

观察DNS解析情况

我们知道,Linux系统要想正常访问互联网,需要正确配置DNS解析,现在我们已经配置了阿里云的DNS
223.6.6.6,我们想看一下DNS解析是否正常,就可以使用tcpdump来抓取DNS包,准备好两个xshell
窗口,按照如下方式操作

步骤1 tcpdump -n -i any port 53

澳门新萄京官方网站 4

尽量在root用户下使用tcpdump命令,-n表示不要把IP地址解析成域名,-i表示抓取哪块网卡的通信
数据包,any表示任意一块,port是指定要抓取数据包的端口,DNS服务工作在53端口上,执行完毕之
后,我们切换到第2个窗口,进行步骤2

步骤2 ping -c3 baidu.com
-c3表示和ping次停下,这时候我们的计算机和百度产生的通信,窗口1的tcpdump就会监听到我们的通信
数据,也就是所谓的抓包,切换到窗口1,看到的数据大致如下

澳门新萄京官方网站 5

在上图中我们可看到本地192.168.56.11,端口42711进程向阿里云DNS服务器223.6.6.6,请求告知
baidu.com的IP地址是什么?阿里云的DNS服务器成功给了我们答复,由此可以说明,我们的DNS工作
正常。

如果抓取的DNS数据包,看起来向下面这样:

澳门新萄京官方网站 6

从上图可以看出,我们一共发起了三次DNS查询请求,服务器才最终给我们返回了IP地址,这显然是不太正常的,
由此我们可以判断,这次网络卡慢的原因,应该出在DNS解析上。

以上就是使用tcpdump抓包来简单判断网络通信状况。

二.wireshark抓包分析

在Windows平台下,Wireshark通过WinPcap进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器,具体在下面介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。

2 tcpdump与Wireshark介绍

抓取一个TCP包

首先我们知道TCP三次握手分别是:ACK,SYN-ACK,ACK。下面我们就在Linux中简单搭建nginx服务器,
然后使用tcpdump抓取tcp包看下。

安装nginx服务并启动

yum install nginx -y  
/etc/init.d/nginx start  

然后在windows浏览器中输入自己的IP地址,将会看到如下界面

澳门新萄京官方网站 7

在xshell中执行tcpdump -n -i eth0 port 80,eth0是我当前网卡的名称,然后在浏览器中刷新一下,
可以看到抓取到了如下内容

澳门新萄京官方网站 8

可以看到,我们熟悉的ACK,SYN-ACK,ACK三次握手的信息都出现了,说明我们TCP连接成功建立了。

不要太过纠结于抓包细节,事实上tcp协议包含相当多的内容,无法在此展开

抓取一个TCP包

首先我们知道TCP三次握手分别是:ACK,SYN-ACK,ACK。下面我们就在Linux中简单搭建nginx服务器,
然后使用tcpdump抓取tcp包看下。

安装nginx服务并启动

yum install nginx -y 
/etc/init.d/nginx start 

然后在windows浏览器中输入自己的IP地址,将会看到如下界面

澳门新萄京官方网站 9

在xshell中执行tcpdump -n -i eth0 port 80,eth0是我当前网卡的名称,然后在浏览器中刷新一下,
可以看到抓取到了如下内容

澳门新萄京官方网站 10

可以看到,我们熟悉的ACK,SYN-ACK,ACK三次握手的信息都出现了,说明我们TCP连接成功建立了。

不要太过纠结于抓包细节,事实上tcp协议包含相当多的内容,无法在此展开

1.过滤出dns信息

DNS服务器不设转发
在DNS服务器上安装上wireshark软件,并打开它,设置数据包为UDP过滤,在客户机上用nslookup命令查询一下[http://www.sohu.com/],马上可以看到本地DNS服务器直接查全球13台根域中的某几台,然后一步步解析,通过递代的方式,直到找到www .sohu .com对应的IP为220.181.118.87。
具体过程有待明天验证。

澳门新萄京官方网站 11

dns.png

tcpdump是基于Unix系统的命令行式的数据包嗅探工具。如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的,点击【】获取更多有关混杂模式的资料。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfigeth0 promisc, eth0是你要打开混杂模式的网卡。肯定有人要问如果在windows下要不要打开混杂模式,windows下网卡没有什么混杂模式不混杂模式,在于应用程序本身,如使用Wireshark抓包的时候可以通过设置为在混杂模式下抓包(这就是为什么该死的ARP欺骗病毒可以猖狂的原因)。tcpdump当然也可以指定抓包过滤器,而且其过滤器语言非常著名,叫做Berkeley包过滤,简称BPF语言。

在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优秀工具一样,它的特点就是简单而强大。它是基于Unix系统的命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。

tcpdump中最常见的几个参数

-i 指定要抓取数据包的网卡名称

tcpdump -i eth0 # 抓取eth0网卡的数据包  

-c 指定抓取包的个数

tcpdump -i eth0 -c 10 # 只抓取10个包  

-w 把抓取到的数据存放到文件中供以后分析

# tcpdump -i eth0 -c 10 -w my-packets.pcap  
# file my-packets.pcap   
my-packets.pcap: tcpdump capture file ....  

可以看到,我们保存的my-packets.pcap是一种特殊文件,直接使用vim是无法查看的,可以把
该文件拿到windows下,使用wireshark查看,效果如下

澳门新萄京官方网站 12

-n 不解析ip,默认会将ip解析成域名
指定过滤端口(port)和主机名(host)

tcpdump -n -i eth0 port 80  
tcpdump -n -i eth0 host baidu.com  
tcpdump -n -i eth0 host baidu.com and port 80  

tcpdump中最常见的几个参数

-i 指定要抓取数据包的网卡名称

tcpdump -i eth0 # 抓取eth0网卡的数据包 

-c 指定抓取包的个数

tcpdump -i eth0 -c 10 # 只抓取10个包 

-w 把抓取到的数据存放到文件中供以后分析

# tcpdump -i eth0 -c 10 -w my-packets.pcap 
# file my-packets.pcap 
my-packets.pcap: tcpdump capture file .... 

可以看到,我们保存的my-packets.pcap是一种特殊文件,直接使用vim是无法查看的,可以把
该文件拿到windows下,使用wireshark查看,效果如下

澳门新萄京官方网站 13

-n 不解析ip,默认会将ip解析成域名
指定过滤端口(port)和主机名(host)

tcpdump -n -i eth0 port 80 
tcpdump -n -i eth0 host baidu.com 
tcpdump -n -i eth0 host baidu.com and port 80 

Linux公社的RSS地址:

本文永久更新链接地址

澳门新萄京官方网站 14

2.过滤出tcp包分析:

在显示过滤框输入:ip.dst==180.97.33.108 or ip.src==180.97.33.108

澳门新萄京官方网站 15

摘录图片-个人学习使用.png

  1. 简单的例子

默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。【比如本机的TCP通信,也必须要socket通信的基本要素:src ip port dst ip port】

参考资料

官方权威教程

漫画形式介绍tcpdump,非常有趣

TCP通信流程大致如下:

客户端和服务器之间TCP三次握手(4941、4942、4943帧)—->客户端请求的GET主页面(4944帧)—>服务器收到请求(4945帧)—>发送响应包(4946帧)。

说明:

  • 客户端向服务器发送TCP请求建立连接。标识为SYN。

  • 服务器得到请求后向客户端回应确认包的过程。标识为SYN,ACK。

  • 客户端回应服务器发送确认包的过程,将于服务器建立连接。标识为ACK。

  • 客户端向服务器发送HTTP请求内容的过程。标识为GET。

  • 服务器响应客户端请求的过程,收到请求。标识为ACK。

  • 4946帧帧是服务器向客户端回应内容的过程。

我们通过访问www.google.com.hk这个网址来看看抓包结果。

如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。

三.TCP三次握手以及四次挥手详解

澳门新萄京官方网站 16

一次连接的完整周期(图片来自网络).png

2.1  tcpdump

Linux抓包原理:

1.三次握手

澳门新萄京官方网站 17

三次握手-图片源自网络,个人学习.png

(1)第一次握手:Client将标志位SYN置为1,随机产生一个值seq=client_isn,并将该数据包发送给Server,Client进入SYN_SENT状态,等待Server确认。
(2)第二次握手:Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=client_isn 1,随机产生一个值seq=server_isn,并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。
(3)第三次握手:Client收到确认后,检查ack是否为server_isn 1,ACK是否为1,如果正确则将标志位ACK置为1,ack=server_isn 1,并将该数据包发送给Server,Server检查ack是否为server_isn 1,ACK是否为1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

前面说过一般情况下Linux都自带了tcpdump,但是如果发生了小概率事件,发现没有tcpdump的话,可以到http://www.tcpdump.org下载源代码,编译安装。

Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。

实战(通过wireshark抓包,观察tcp三次握手情况)

澳门新萄京官方网站 18

wireshark三次握手.png

图片中有上一个tcp连接的关闭,涉及到四次握手,之后会提及,现在不作说明。

第一次握手:16088,客户端发送SYN=1,seq=0
第二次握手:16091,服务端发送SYN=1,ACK=1,ack(client的seq 1)=1,seq=0
第三次握手:16092,ACK=1,ack(server的seq 1)=1,seq(client的seq 1)=1

使用root用户登录,运行tcpdump命令就可以开始抓包。这里说明一下,如果使用SSH登录到远程Linux,然后直接运行tcpdump,会发现抓到大量的数据包,速度快的都看不清楚,这是因为tcpdump抓到的包发送给远程的终端显示,同时又抓了这个包,再显示,再抓取,造成了循环抓取。当然,这样抓包没有任何意义,除了证明你的网络是通的。

当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块。

SYN攻击:

在三次握手过程中,Server发送SYN-ACK之后,收到Client的ACK之前的TCP连接称为半连接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式非常简单,即当Server上有大量半连接状态且源IP地址是随机的,则可以断定遭到SYN攻击了,使用如下命令可以让之现行:
netstat -nap | grep SYN_RECV

因为没有打开网卡的混杂模式,所以如果本机没有任何进程访问网络,是抓不到包的,如果在字符界面下,用wgethttp://www.google.com.hk 访问网址,如果有GUI,可以打开firefox浏览器访问http://www.google.com.hk。

Wireshark是一个网络协议检测工具,支持Windows平台、Unix平台、Mac平台,一般只在图形界面平台下使用Wireshark,如果是Linux的话,直接使用tcpdump了,因为一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析。

2.四次挥手

澳门新萄京官方网站 19

tcp四次挥手(图片来自网络).png

(1)第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
(2)第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号 1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
(3)第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
(4)第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号 1,Server进入CLOSED状态,完成四次挥手。
(5)Client端等待了2MSL(最大报文段生存时间)后,依然没有收到回复,则证明Server端已正常关闭,那好,Client端也可以关闭连接了。

【注意】 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送。TIME_WAIT状态中所需要的时间是依赖于实现方法的。典型的值为30秒、1分钟和2分钟。等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放。

假设Client端发起中断连接请求,也就是发送FIN报文。Server端接到FIN报文后,意思是说"我Client端没有数据要发给你了",但是如果你还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以你先发送ACK,"告诉Client端,你的请求我收到了,但是我还没准备好,请继续你等我的消息"。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,"告诉Client端,好了,我这边数据发完了,准备好关闭连接了"。Client端收到FIN报文后,"就知道可以关闭连接了,但是他还是不相信网络,怕Server端不知道要关闭,所以发送ACK后进入TIME_WAIT状态,如果Server端没有收到ACK则可以重传。“,Server端收到ACK后,"就知道可以断开连接了"。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,那好,我Client端也可以关闭连接了。Ok,TCP连接就这样关闭了!

默认情况下,tcpdump会选择第一块网卡,也就是eth0,进行抓包,每行显示一个抓取的数据包,如:

澳门新萄京官方网站:抓包工具,DNS剖析进度。在Mac平台下,Wireshark通过WinPcap进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器,具体简单使用下面会介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。

实战(通过wireshark抓包,观察tcp四次挥手情况一)

澳门新萄京官方网站 20

wireshark四次挥手.png

【设想的】第0次挥手,client端发送[ACK],seq=136125,ack=192
第一次挥手,client端发送[FIN,ACK],seq=136125,ack=192
第二次挥手,server端发送[ACK],seq=193,ack(client的seq 1)=136126
第三次挥手,server端发送[FIN,ACK],seq=192(这个值的变化有待商榷),ack(client的seq 1)=136126
第四次挥手,client端发送[ACK],seq=136126(因为又一次携带了一个ack包,需要在最后确认关闭时, 1),ack(client的seq 1)=193
【备注】这里也可以观察端口的变化,定位到这四次挥手

还有一种情况和上述描述的四次挥手恰好不一样,属于实际中还会出现同时发起主动关闭的情况

澳门新萄京官方网站 21

四次挥手(图片来自网络).png

0.003183              192.168.21.137  72.14.203.147     TCP        38039 > http [SYN] Seq=0 Win=5840Len=0 MSS=1460 SACK_PERM=1 TSV=36941509 TSER=0 WS=6

所以,tcpdump是用来抓取数据非常方便,Wireshark则是用于分析抓取到的数据比较方便。

实战(通过wireshark抓包,观察tcp四次挥手情况二)

澳门新萄京官方网站 22

image.png

seq是从开始(tcp三次握手)到最终结束(服务器响应结束)的值,ack是http响应结束的值,可以参见下图
第一次挥手,client端发送[FIN,ACK],seq=203346,ack=192
第二次挥手,server端发送[FIN,ACK],seq=192,ack=203346
第三次挥手,client端发送[ACK],seq=203347,ack=193,进入time_wait状态
第四次挥手,server端发送[ACK],seq=193,ack=203347,进入time_wait状态

0.011707              72.14.203.147     192.168.21.137  TCP        http > 38039[SYN, ACK] Seq=0 Ack=1 Win=64240 Len=0 MSS=1460

3 tcpdump使用

【问题1】为什么连接的时候是三次握手,关闭的时候却是四次握手?

答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

0.011770              192.168.21.137  72.14.203.147     TCP        38039 > http [ACK] Seq=1 Ack=1Win=5840 Len=0

3.1 语法

【问题2】为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

答:虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。

以上三个数据包就是著名的TCP三次握手的数据包,其中38039是客户端的TCP端口,http的默认端口是80,如果tcpdump在/etc/services中发现端口对应的服务名称,那么会自动的转为名字,所以这里会显示为http。表示客户端的38039端口和服务器端的http端口进行TCP三次握手。

类型的关键字

四.DNS解析

前面提到tcpdump默认选择第一块网卡进行抓包,我们可以使用-i参数指定通过哪一个网卡抓包,如(#表示我输入的命令,Linux下root用户的提示符就是#):

host(缺省类型): 指明一台主机,如:host 210.27.48.2

1.摘录一个DNS的解析过程

澳门新萄京官方网站 23

DNS解析(图片来自网络).png

1、在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
2、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
4、如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
5、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(http://qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找http://qq.com域服务器,重复上面的动作,进行查询,直至找到www.qq.com主机。
6、如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询。

# tcpdump –i eth1

net: 指明一个网络地址,如:net 202.0.0.0

2.

澳门新萄京官方网站 24

图片源自知乎.png

或者

port: 指明端口号,如:port 23

五.wireshark数据分析记录

背景:xqd-shw平台成功单的转译文本到观澜机器192.169.51.3的数据推送过程,发起的是HTTP的post请求

#tcpdump –i any

确定方向的关键字

1.执行tupdump拿到抓包文件,然后放在wireshark进行分析

tcpdump -i bond0 -s 0 host 192.169.51.3 -w target8

如果想知道我们可以通过哪几个网卡抓包,可以使用-D参数,如:

src: src 210.27.48.2, IP包源地址是210.27.48.2

2.wireshark的过滤语句

因为是tomcat项目,server.xml中指定对外端口为9098,服务在192.168.50.124上访问192.169.51.3:8080端口时,src地址的端口是随机指定的,不是9098
tcp.port == 60948

# tcpdump –D

dst: dst net 202.0.0.0, 目标网络地址是202.0.0.0

3.记录整个过程
  • DNS的解析,响应

  • TCP的三次握手见上图三次握手

  • TCP的数据包按段发送(拼接下图的35个数据段)

  • 发起http请求

![](https://upload-images.jianshu.io/upload_images/539247-42b6a19e97e1593e.png)

wireshark-Http请求地址.png
  • 响应http请求
![](https://upload-images.jianshu.io/upload_images/539247-7811e0af6f6f750a.png)

wireshark-Http响应.png
  • TCP的四次挥手(见上述四次握手情况二)

1.eth0

dst or src(缺省值)

参考文档:

Wireshark抓包工具使用以及数据包分析
简述TCP的三次握手过程
TCP协议中的三次握手和四次挥手(图解)
DNS解析的过程是什么,求详细的?
DNS解析过程详解,探究百度官网
Wireshark表达式使用技巧——IP过滤
TCP:三次握手,URG、ACK、PSH、RST、SYN、FIN 含义
Tcp抓包以及tcp状态解释
WIRESHARK 实用过滤表达式(针对IP、协议、端口、长度和内容)
Linux tcpdump命令详解
新之助酱
郭无心
Wireshark数据抓包教程之认识捕获分析数据包

2.any

dst and src

3.lo

协议的关键字:缺省值是监听所有协议的信息包

因为我的机器上只有一个网卡,因此只有eth0,如果有多块网卡活动的话,会有eth1,eth2依次下去。any的意思是通过任意一块网卡进行抓包,lo是回环接口。(关于TCP三次握手和回环接口等网络问题,请参考《TCP/IP协议详解》)。

fddi

默认情况下,tcpdump抓包结果显示在屏幕(严格点,专业点应该说是标准输出)上,显然这不利于进一步的数据分析,因此我们需要将抓包结果存放在文件中。可是使用-w命令将结果保存在文件中,如:

ip

#tcpdump –w google.cap

arp

这句命令将抓包结果存放在google.cap文件中,结束以后可以用Wireshark打开查看。同事,tcpdump出了抓包,还可以使用-r参数制定抓包数据文件,结合过滤器对抓包数据分析,如:

rarp

#tcpdump –r google.cap http

tcp

这句命令的意思是让tcpdump读取google.cap文件,把其中http协议的数据包都给过滤出来。关于过滤器在下面详细介绍。

udp

2.2  Wireshark

其他关键字

我在windows系统中使用Wireshark的,首先熟悉一下界面,图1是使用Wireshark打开google.cap文件的界面,

gateway

澳门新萄京官方网站 25

broadcast

图1   Wireshark界面

less

图1中标注出三快区域,R1区域用来显示简单的数据包信息,我们用tcpdump抓包的时候,默认情况下也是显示成这样的;R2区域用来显示选中的数据包的详细信息,细心一点会发现他是按照TCP/IP四层结构显示的,第一行是数据链路层的信息,第二行是网络层信息(IP协议),第三行是传输层信息(TCP协议),第四行是应用层信息(HTTP协议),可以展开每一行用来观察具体的内容;R3区域是用来显示此数据包的真实面目。我们在R1和R2区域看到的信息都是Wireshark整理以后给我们看的,抓包的真实数据实际上是一堆二进制序列,用ultraedit打开google.cap文件可以看到就是一些数字,如图2所示。

greater

澳门新萄京官方网站 26

常用表达式:多条件时可以用括号,但是要用转义

图2  抓包文件长的样子

非 : ! or “not” (去掉双引号)

使用Wireshark抓包非常容易,直接点击按钮澳门新萄京官方网站 27(工具栏第三个按钮)澳门新萄京官方网站 28(工具栏第一个按钮)就开始抓包了,会发现只要一点击这个按钮,立刻就显示抓到包了,这是因为Wireshark默认在混杂模式下抓包,只要经过网卡的数据包都抓取下来(当然这台机器要连在网络中,如果没有数据流过当然没有包可抓),点击按钮澳门新萄京官方网站 29停止此次抓包。

且 : && or “and”

如果机器上安装了多块网卡,Wireshark默认选择第一张网卡抓包,如果等抓包完成了,这是发现选错了网卡是一件极度郁闷的事情。点击按钮可以在抓包之前选择抓哪张网卡。

或 : || or “or”

澳门新萄京官方网站 30

3.2 选项

图3  选择网卡

澳门新萄京官方网站 31

我机器上只有一张网卡,另外两个是安装Vmware时的虚拟网卡,可以看到虽然Packets上面已经有数据了,实际上需要点击Start才开始抓包。

3.3 命令实践

解决了选择网卡的问题以后,考虑如果过滤抓包内容,点击菜单栏上的” Capture” > “Options”可以看到制定抓包规则的界面,如图4所示。

1、直接启动tcpdump,将抓取所有经过第一个网络接口上的数据包

澳门新萄京官方网站 32

澳门新萄京官方网站 33

图4  制定抓包规则

2、抓取所有经过指定网络接口上的数据包

图4可以看到Caputre packets inpromiscuous mode,默认是选中的,表示Wireshark默认在混杂模式下抓包。同样可以选择通过哪张网卡抓包,不过这些都不是重点,最重要的是Caupture Fileter这里,点击该按钮,可以看到弹出一些预定义好的过滤器。比如选择“HTTP TCP port(80)”,下面Filter string: tcp port http就是过滤器的表示。表示抓tcp协议的,端口为80的数据包(http协议的默认端口是80)。

澳门新萄京官方网站 34

  1. 过滤器(BPF语言)的使用

3、抓取所有经过 en0,目的或源地址是 10.37.63.255 的网络数据:

         主要介绍一下在tcpdump中的过滤器使用,因为懂了这个就可以得心应手的使用wireshark了。

澳门新萄京官方网站 35

         从最简单的开始,BPF语言主要有一个标志或者数字和限定词组成,限定词有三种:

4、抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信:

          第一种:指定类型

澳门新萄京官方网站 36

          host, 定义抓取哪个IP地址(也可以给它mac地址,格式是00:00:00:00:00:00)的数据包,比如我想抓有关192.168.0.148这个IP地址的数据包,那么就写成tcpdump host 192.168.0.148, host是限定词,192.168.0.148就是标志。这条命令会抓取从发出或者向192.168.0.148发送的数据包。

5、抓取主机192.168.13.210除了和主机10.37.63.61之外所有主机通信的数据包:

          net, 定义抓取某个网络的数据包,给出网络号就行了,它根据给的网络号字节数是1,2,3来判断A类地址,B类地址或者C类地址,比如tcpdump net 10.1.1 ,它就认为这是一个C类地址。

澳门新萄京官方网站 37

port,指定端口,比如tcpdumphost and port 22, 这是抓端口为22的数据包,不管是TCP还是UDP的,这里我稍微早一点的给出了逻辑操作,andJ,如果只想抓TCP的,那么可以写tcpdump host 192.168.0.148and tcp port 22。

6、抓取主机10.37.63.255除了和主机10.37.63.61之外所有主机通信的ip包

portrange,顾名思义,这个是指定端口范围的,用连字符”-”指定范围,比如tcpdump port 1025-8080

澳门新萄京官方网站 38

         第二种:指定方向

7、抓取主机10.37.63.3发送的所有数据:

我们之前的命令都是说“这条命令会抓取从192.168.0.148发出或者向192.168.0.148发送”,所以,如果指向抓从发出的数据包可以使用限定词src, 命令:tcpdumpsrc host 192.168.0.148,反过来,想抓发向192.168.0.148的数据包,使用限定词dst,命令:tcpdumpdst host 192.168.0.148。

澳门新萄京官方网站 39

        第三种:指定协议

8、抓取主机10.37.63.3接收的所有数据:

我们知道网络协议有N种。。。我列一下常用的几种,其他的可以去google一下J

澳门新萄京官方网站 40

ether和fddi,以太网协议

9、抓取主机10.37.63.3所有在TCP 80端口的数据包:

tr, TR协议

澳门新萄京官方网站 41

ip, IP协议

10、抓取HTTP主机10.37.63.3在80端口接收到的数据包:

ip6,IPv6协议

澳门新萄京官方网站 42

arp,  ARP协议

11、抓取所有经过 en0,目的或源端口是 25 的网络数据

好了,最后还需要注意的是逻辑运算,and,or, not(与,或,非),上面已经有一个例子了, 这里就不再罗嗦了,和普通的编程语言没有什么不同。

澳门新萄京官方网站 43

 

12、抓取所有经过 en0,网络是 192.168上的数据包

除此之外,还有更加牛X的功能,比如指定TCP中的某个标识位是什么,这种应用我一般很少用,不再罗嗦了。

澳门新萄京官方网站 44

13、协议过滤

澳门新萄京官方网站 45

14、抓取所有经过 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据

澳门新萄京官方网站 46

15、抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据

澳门新萄京官方网站 47

16、抓取所有经过 en0,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据

澳门新萄京官方网站 48

17、只抓 SYN 包

澳门新萄京官方网站 49

18、抓 SYN, ACK

澳门新萄京官方网站 50

19、抓 SMTP 数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为 0x4d41494c

澳门新萄京官方网站 51

20、抓 HTTP GET 数据,”GET “的十六进制是 0x47455420

澳门新萄京官方网站 52

21、抓 SSH 返回,”SSH-“的十六进制是 0x5353482D

澳门新萄京官方网站 53

22、高级包头过滤如前两个的包头过滤,首先了解如何从包头过滤信息:

澳门新萄京官方网站 54

23、抓 DNS 请求数据

澳门新萄京官方网站 55

24、其他-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL C 还是抓的太多,于是可以用-c 参数指定抓多少个包。

澳门新萄京官方网站 56

3.4 抓个网站练练

想抓取访问某个网站时的网络数据。比如网站  怎么做?

1、通过tcpdump截获主机www.baidu.com发送与接收所有的数据包

澳门新萄京官方网站 57

2、访问这个网站

澳门新萄京官方网站 58

3、想要看到详细的http报文。怎么做?

澳门新萄京官方网站 59

4、分析抓取到的报文

澳门新萄京官方网站 60

4 tcpdump抓取TCP包分析

TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址、目的IP地址,以及TCP数据报首部的源端口地址和目的端口地址。TCP首部结构如下:

澳门新萄京官方网站 61

注意:通常情况下,一个正常的TCP连接,都会有三个阶段:1、TCP三次握手;2、数据传送;3、TCP四次挥手

其中在TCP连接和断开连接过程中的关键部分如下:

源端口号:即发送方的端口号,在TCP连接过程中,对于客户端,端口号往往由内核分配,无需进程指定;

目的端口号:即发送目的的端口号;

序号:即为发送的数据段首个字节的序号;

确认序号:在收到对方发来的数据报,发送确认时期待对方下一次发送的数据序号;

SYN:同步序列编号,Synchronize Sequence Numbers;

ACK:确认编号,Acknowledgement Number;

FIN:结束标志,FINish;

4.1 TCP三次握手

三次握手的过程如下:

澳门新萄京官方网站 62

step1. 由客户端向服务器端发起TCP连接请求。Client发送:同步序列编号SYN置为1,发送序号Seq为一个随机数,这里假设为X,确认序号ACK置为0;

step2. 服务器端接收到连接请求。Server响应:同步序列编号SYN置为1,并将确认序号ACK置为X 1,然后生成一个随机数Y作为发送序号Seq(因为所确认的数据报的确认序号未初始化);

step3. 客户端对接收到的确认进行确认。Client发送:将确认序号ACK置为Y 1,然后将发送序号Seq置为X 1(即为接收到的数据报的确认序号);

为什么是三次握手而不是两次对于step3的作用,假设一种情况,客户端A向服务器B发送一个连接请求数据报,然后这个数据报在网络中滞留导致其迟到了,虽然迟到了,但是服务器仍然会接收并发回一个确认数据报。但是A却因为久久收不到B的确认而将发送的请求连接置为失效,等到一段时间后,接到B发送过来的确认,A认为自己现在没有发送连接,而B却一直以为连接成功了,于是一直在等待A的动作,而A将不会有任何的动作了。这会导致服务器资源白白浪费掉了,因此,两次握手是不行的,因此需要再加上一次,对B发过来的确认再进行一次确认,即确认这次连接是有效的,从而建立连接。

对于双方,发送序号的初始化为何值有的系统中是显式的初始化序号是0,但是这种已知的初始化值是非常危险的,因为这会使得一些黑客钻漏洞,发送一些数据报来破坏连接。因此,初始化序号因为取随机数会更好一些,并且是越随机越安全。

tcpdump抓TCP三次握手抓包分析:

sudotcpdump-n-S-ilo0host10.37.63.3andtcpport8080

# 接着再运行:

curl

控制台输出:

澳门新萄京官方网站 63

每一行中间都有这个包所携带的标志:

S=SYN,发起连接标志。

P=PUSH,传送数据标志。

F=FIN,关闭连接标志。

ack,表示确认包。

RST=RESET,异常关闭连接。

.,表示没有任何标志。

第1行:16:00:13.486776,从10.37.63.3(client)的临时端口61725向10.37.63.3(server)的8080监听端口发起连接,client初始包序号seq为1944916150,滑动窗口大小为65535字节(滑动窗口即tcp接收缓冲区的大小,用于tcp拥塞控制),mss大小为16344(即可接收的最大包长度,通常为MTU减40字节,IP头和TCP头各20字节)。【seq=1944916150,ack=0,syn=1】

第2行:16:00:13.486850,server响应连接,同时带上第一个包的ack信息,为client端的初始包序号seq加1,即1944916151,即server端下次等待接受这个包序号的包,用于tcp字节流的顺序控制。Server端的初始包序号seq为1119565918,mss也是16344。【seq=1119565918,ack=1944916151,syn=1】

第3行:15:46:13.084161,client再次发送确认连接,tcp连接三次握手完成,等待传输数据包。【ack=1119565919,seq=1944916151】

4.2 TCP四次挥手

连接双方在完成数据传输之后就需要断开连接。由于TCP连接是属于全双工的,即连接双方可以在一条TCP连接上互相传输数据,因此在断开时存在一个半关闭状态,即有有一方失去发送数据的能力,却还能接收数据。因此,断开连接需要分为四次。主要过程如下:

澳门新萄京官方网站 64

step1. 主机A向主机B发起断开连接请求,之后主机A进入FIN-WAIT-1状态;

step2. 主机B收到主机A的请求后,向主机A发回确认,然后进入CLOSE-WAIT状态;

step3. 主机A收到B的确认之后,进入FIN-WAIT-2状态,此时便是半关闭状态,即主机A失去发送能力,但是主机B却还能向A发送数据,并且A可以接收数据。此时主机B占主导位置了,如果需要继续关闭则需要主机B来操作了;

step4. 主机B向A发出断开连接请求,然后进入LAST-ACK状态;

step5. 主机A接收到请求后发送确认,进入TIME-WAIT状态,等待2MSL之后进入CLOSED状态,而主机B则在接受到确认后进入CLOSED状态;

为何主机A在发送了最后的确认后没有进入CLOSED状态,反而进入了一个等待2MSL的TIME-WAIT主要作用有两个:

第一,确保主机A最后发送的确认能够到达主机B。如果处于LAST-ACK状态的主机B一直收不到来自主机A的确认,它会重传断开连接请求,然后主机A就可以有足够的时间去再次发送确认。但是这也只能尽最大力量来确保能够正常断开,如果主机A的确认总是在网络中滞留失效,从而超过了2MSL,最后也无法正常断开;

第二,如果主机A在发送了确认之后立即进入CLOSED状态。假设之后主机A再次向主机B发送一条连接请求,而这条连接请求比之前的确认报文更早地到达主机B,则会使得主机B以为这条连接请求是在旧的连接中A发出的报文,并不看成是一条新的连接请求了,即使得这个连接请求失效了,增加2MSL的时间可以使得这个失效的连接请求报文作废,这样才不影响下次新的连接请求中出现失效的连接请求。

为什么断开连接请求报文只有三个,而不是四个因为在TCP连接过程中,确认的发送有一个延时(即经受延时的确认),一端在发送确认的时候将等待一段时间,如果自己在这段事件内也有数据要发送,就跟确认一起发送,如果没有,则确认单独发送。而我们的抓包实验中,由服务器端先断开连接,之后客户端在确认的延迟时间内,也有请求断开连接需要发送,于是就与上次确认一起发送,因此就只有三个数据报了。

5 Wireshark分析tcpdump抓包结果

1、启动8080端口,tcpdump抓包命令如下:

tcpdump-ilo0-s0-n-Shost10.37.63.3andport8080-w./Desktop/tcpdump_10.37.63.3_8080_20160525.cap

# 然后再执行curl

curl

2、使用Wireshark打开tcpdump_10.37.63.3_8080_20160525.cap文件

澳门新萄京官方网站 65

No. 1-4 行:TCP三次握手环节;

No. 5-8 行:TCP传输数据环节;

No. 9-13 行:TCP四次挥手环节;

3、顺便说一个查看 http 请求和响应的方法:

澳门新萄京官方网站 66

弹窗如下图所示,上面红色部分为请求信息,下面蓝色部分为响应信息:

澳门新萄京官方网站 67

以上是Wireshark分析tcpdump的简单使用,Wireshark更强大的是过滤器工具,大家可以自行去多研究学习Wireshark,用起来还是比较爽的。

推荐几个关于Wireshark的文章:

Wireshark基本介绍和学习TCP三次握手

一站式学习Wireshark

本文由澳门新萄京官方网站发布于澳门新萄京官方网站,转载请注明出处:澳门新萄京官方网站:抓包工具,DNS剖析进度

关键词: