抓包是指通过一些常用工具截获网络通信中的数据包,主要目的是排查通信过程中产生的问题,如:
通过charles、chrome浏览器抓取http的数据包,分析请求和响应。
通过tcpdump、wireshark抓取tcp、udp的数据包,分析协议、分析网络请求超时问题。
charles和chrome浏览器抓包都比较简单。这里只介绍tcpdump和wireshark的使用。
tcpdump是命令行形式的。wireshark有一个不错的图形界面可以用来分析tcpdump抓包生成的文件,也可以直接进行抓包。
一般情况下,我们的Linux服务器不会安装图形界面,所以抓包需要使用tcpdump命令生成文件,然后传到开发机上通过wireshark打开进行分析。
大多数Linux发行版都会安装tcpdump,如果没装过可以使用如下命令进行安装:
yum install tcpdump -y #rhel、centos上安装
apt-get install tcpdump -y # ubuntu、debian上安装
pacman -S tcpdump -y # arch、manjaro上安装
在使用tcpdump之前,先简单了解其工作原理:
Linux内核收包流程
简单解释下发包流程:
这里的一个重点:tcpdump在收包场景中位于iptables之前,所以能抓到被iptables INPUT链拦截的数据包。
Linue内核发包流程
简单解释下收包流程:
这里的一个重点:tcpdump在发包场景中位于iptables之后,所以不能抓到iptables OUTPUT链拦截的数据包。
数据包在内核里转换为struct sk_buff
结构体,所以tcpdump处理的就是这个结构体。
有了以上基础知识,再来看看tcpdump怎么使用。tcpdump有很强大的过滤规则,如:过滤给定目标ip和端口的数据包、过滤特定协议的包等。这里给出常用的使用方法:
tcpdump -i eth0 -nn -w 1.cap //-i eth0是指抓eth0网卡的包;-nn表示不解析域名和端口 这样方便查看结果;-w 1.cap是将抓到的包写到当前目录1.cap这个文件中
tcpdump -i eth0 -nn -w 1.cap tcp and host 10.182.1.1 and port 80 or port 443 //-w 1.cap后面跟着的tcp代表只抓tcp包;and和or组合多个条件;host 10.182.1.1代表只抓取这个ip的数据包(包括来自或发给这个ip的包);port 80和port 443代表只抓取这俩个端口的包(包括来自或发给这俩个端口的包)
tcpdump -i eth0 -nn -w 1.cap tcp and dst 10.182.1.1 and dst port 80 or dst port 443 // dst 10.182.1.1代表只抓取这个ip的包,dst port代表只抓取目标端口为443的包
tcpdump过滤规则可以写的很复杂,不过如果不是产生很多的包,建议使用简单规则抓下来后传回开发机,通过wireshark进行分析。
题外话,从服务器传到开发机有很多方法,如:开发机用nc启动一个端口,服务器通过nc把包文件传输到开发机。也可以使用scp命令传输。
wireshark需要下载,官网地址
wireshark有着直观且美观的图形界面,支持丰富的通信协议(甚至可以抓蓝牙、串口的包),强大的过滤器和数据流跟踪功能。以下介绍一些常用技巧:
wireshark的过滤器也支持算数运算符和逻辑运算符:
同时可以使用()控制规则的优先级
常用的过滤器写法:
跟踪数据流,选中一个包,右键follow->tcp stream查看tcp的请求和响应,follow->http stream查看http的请求和响应
修改显示的时间格式,菜单栏Edit->Preferences->Appearance->Columns,修改Title为Time的Type列。这样有助于分析请求的耗时和发生时间
总结一下,掌握抓包更有利于分析问题,包括:
wireshark还有很多技巧,可以参考《Wireshark网络分析就这么简单》这本书。