1 起因前段时间,一直在调线上的一个问题:线上应用接受POST请求,请求body中的参数获取不全,存在丢失的状况。这个问题是偶发性的,大概发生的几率为5%-10%左右,这个概率已经相当高了。在排查问题的过程中使用到了tcpdump和Wireshark进行抓包分析。感觉这两个工具搭配起来干活,非常完美。所有的网络传输在这两个工具搭配下,都无处遁形。 为了更好、更顺手地能够用好这两个工具,特整理本篇文章,希望也能给大家带来收获。为大家之后排查问题,添一利器。 2 tcpdump与Wireshark介绍在网络问题的调试中,tcpdump应该说是一个必不可少的工具,和大部分linux下优秀工具一样,它的特点就是简单而强大。它是基于Unix系统的命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。 默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。【比如本机的TCP通信,也必须要socket通信的基本要素:src ip port dst ip port】 如果要使用tcpdump抓取其他主机MAC地址的数据包,必须开启网卡混杂模式,所谓混杂模式,用最简单的语言就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的。一般而言,Unix不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如telnet的用户名和密码,这样会引起一些安全上的问题,所以只有root用户可以开启混杂模式,开启混杂模式的命令是:ifconfig en0 promisc, en0是你要打开混杂模式的网卡。 Linux抓包原理:
Wireshark是一个网络协议检测工具,支持Windows平台、Unix平台、Mac平台,一般只在图形界面平台下使用Wireshark,如果是Linux的话,直接使用tcpdump了,因为一般而言Linux都自带的tcpdump,或者用tcpdump抓包以后用Wireshark打开分析。 在Mac平台下,Wireshark通过WinPcap进行抓包,封装的很好,使用起来很方便,可以很容易的制定抓包过滤器或者显示过滤器,具体简单使用下面会介绍。Wireshark是一个免费的工具,只要google一下就能很容易找到下载的地方。 所以,tcpdump是用来抓取数据非常方便,Wireshark则是用于分析抓取到的数据比较方便。 3 tcpdump使用3.1 语法
3.2 选项3.3 命令实践1、直接启动tcpdump,将抓取所有经过第一个网络接口上的数据包 2、抓取所有经过指定网络接口上的数据包 3、抓取所有经过 en0,目的或源地址是 10.37.63.255 的网络数据: 4、抓取主机10.37.63.255和主机10.37.63.61或10.37.63.95的通信: 5、抓取主机192.168.13.210除了和主机10.37.63.61之外所有主机通信的数据包: 6、抓取主机10.37.63.255除了和主机10.37.63.61之外所有主机通信的ip包 7、抓取主机10.37.63.3发送的所有数据: 8、抓取主机10.37.63.3接收的所有数据: 9、抓取主机10.37.63.3所有在TCP 80端口的数据包: 10、抓取HTTP主机10.37.63.3在80端口接收到的数据包: 11、抓取所有经过 en0,目的或源端口是 25 的网络数据 12、抓取所有经过 en0,网络是 192.168上的数据包 13、协议过滤 14、抓取所有经过 en0,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据 15、抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据 16、抓取所有经过 en0,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据 17、只抓 SYN 包 18、抓 SYN, ACK 19、抓 SMTP 数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为 0x4d41494c 20、抓 HTTP GET 数据,”GET “的十六进制是 0x47455420 21、抓 SSH 返回,”SSH-“的十六进制是 0x5353482D 22、高级包头过滤如前两个的包头过滤,首先了解如何从包头过滤信息: 23、抓 DNS 请求数据 24、其他-c 参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工 CTRL+C 还是抓的太多,于是可以用-c 参数指定抓多少个包。 3.4 抓个网站练练想抓取访问某个网站时的网络数据。比如网站 http://www.baidu.com/ 怎么做? 1、通过tcpdump截获主机www.baidu.com发送与接收所有的数据包 2、访问这个网站 3、想要看到详细的http报文。怎么做? 4、分析抓取到的报文 4 tcpdump抓取TCP包分析TCP传输控制协议是面向连接的可靠的传输层协议,在进行数据传输之前,需要在传输数据的两端(客户端和服务器端)创建一个连接,这个连接由一对插口地址唯一标识,即是在IP报文首部的源IP地址、目的IP地址,以及TCP数据报首部的源端口地址和目的端口地址。TCP首部结构如下:
其中在TCP连接和断开连接过程中的关键部分如下:
4.1 TCP三次握手三次握手的过程如下:
tcpdump抓TCP三次握手抓包分析:
控制台输出: 每一行中间都有这个包所携带的标志:
第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连接上互相传输数据,因此在断开时存在一个半关闭状态,即有有一方失去发送数据的能力,却还能接收数据。因此,断开连接需要分为四次。主要过程如下:
5 Wireshark分析tcpdump抓包结果1、启动8080端口,tcpdump抓包命令如下:
2、使用Wireshark打开tcpdump_10.37.63.3_8080_20160525.cap文件
3、顺便说一个查看 http 请求和响应的方法: 弹窗如下图所示,上面红色部分为请求信息,下面蓝色部分为响应信息: 以上是Wireshark分析tcpdump的简单使用,Wireshark更强大的是过滤器工具,大家可以自行去多研究学习Wireshark,用起来还是比较爽的。 推荐几个关于Wireshark的文章:
专栏作者简介 ( 点击 → 加入专栏作者 ) |
|