使用wireshark的客户端进行抓包,或者tcpdump抓包再用wireshark分析,网上已经有很多资料了,这里就不再赘述了。不熟悉的可以看看网上的资料: http://www.jianshu.com/p/a62ed1bb5b20 或者官方文档user guide: https://www.wireshark.org/docs/wsug_html_chunked/
线上问题排查,有时候时间争分夺秒,或者一些私有云环境完全隔离,根本没法让你导出抓包的文件,这时候需要直接使用命令行进行抓包分析。今天我们就来学习下tshark的使用。PS: tshark基本上可以替代tcpdump,抓包的文件也可以直接用于wireshark来分析
主要先通过yum install wireshark安装后才能使用tshark
这么多参数肯定懒得看,我们继续下一节,掌握最常用的一些参数的用法。
TShark (Wireshark) 2.5.0 (v2.5.0rc0-1500-g78f9a07f) Dump and analyze network traffic. See https://www.wireshark.org for more information. Usage: tshark [options] ... Capture interface: -iname or idx of interface (def: first non-loopback) -f packet filter in libpcap filter syntax -s packet snapshot length (def: appropriate maximum) -p don't capture in promiscuous mode -I capture in monitor mode, if available -B size of kernel buffer (def: 2MB) -y link layer type (def: first appropriate) --time-stamp-type timestamp method for interface -D print list of interfaces and exit -L print list of link-layer types of iface and exit --list-time-stamp-types print list of timestamp types for iface and exit Capture stop conditions: -c stop after n packets (def: infinite) -a ... duration:NUM - stop after NUM seconds filesize:NUM - stop this file after NUM KB files:NUM - stop after NUM files Capture output: -b ... duration:NUM - switch to next file after NUM secs interval:NUM - create time intervals of NUM secs filesize:NUM - switch to next file after NUM KB files:NUM - ringbuffer: replace after NUM files Input file: -r set the filename to read from (- to read from stdin) Processing: -2 perform a two-pass analysis -M perform session auto reset -R packet Read filter in Wireshark display filter syntax (requires -2) -Y packet displaY filter in Wireshark display filter syntax -n disable all name resolutions (def: all enabled) -N enable specific name resolution(s): "mnNtCd" -d == , ... "Decode As", see the man page for details Example: tcp.port==8888,http -H read a list of entries from a hosts file, which will then be written to a capture file. (Implies -W n) --enable-protocol enable dissection of proto_name --disable-protocol disable dissection of proto_name --enable-heuristic enable dissection of heuristic protocol --disable-heuristic disable dissection of heuristic protocol Output: -w write packets to a pcap-format file named "outfile" (or to the standard output for "-") -C start with specified configuration profile -F
我们通过一步步的增加命令的复杂度,使用更多的过滤条件从而来学习tshark。
直接使用tshark,会抓取第一个非回环网卡的所有网络包,本机时候用效果如下
可以看到包含源和目标的地址和端口信息,还有协议和标志位等信息,和wireshark客户端上看到的效果是一样的
PS: 这里可以用tshark -D查看有哪些设备,当然也可以通过ifconfig来查看
tshark -i的
tshark -i en0
抓包的时候根据协议和端口来过滤是比较常见的用法,比如要抓取HTTP的网络包,或者抓取TCP的网络包等等。
capature filter实际使用的参数为-f,也是默认的过滤器,所以一般不带这个参数也是可以的。
tshark支持不带参数就可以使用的过滤表达式,和tcpdump的用法很接近,详情参考: https://www.wireshark.org/docs/wsug_html_chunked/ChCapCaptureFilterSection.html
使用格式为:
[not] primitive [and|or [not] primitive ...]
几种原语(primitive)
上面文档中4.2节罗列了可以使用的原语,为了方便学习,下面表格总结了最常见的几种原语,多个原语之间可以采用逻辑表达式and、or和not。PS:注意不能使用|| &&等符号
原语 | 说明 | 例子 |
---|---|---|
[src | dst] host | 根据源端和目标端的IP进行过滤 |
[tcp | udp] [src | dst] port |
原语之间可以通过逻辑运算符结合起来使用:
首先采用一条原语抓包获取发往其他主机80端口的TCP网络包:
tshark tcp dst port 80
在上面原语的基础上增加目标端host ip的过滤条件
tshark tcp dst port 80 and dst host 60.190.116.48
PS: ip|ether proto 这个原语也挺有意思,你可以用命令tshark -G protocols查看支持哪些协议,这里有这些协议的缩写和全称
这个选项应该是这个命令中比较复杂的一个选项了,通过指定表达式可以支持非常复杂的过滤条件。-f的过滤表达式应该是2.4.2节功能的超集。表达式支持更加细粒度的过滤,例如http.request.url或者mysql.query等等。可以按照packet类型过滤,也可以按照一些等值条件进行过滤。这些针对特定应用层协议(HTTP协议、MYSQL协议)的过滤字段需要参考官方文档。
协议与过滤字段
所有支持协议的表达式
https://www.wireshark.org/docs/dfref/
比较常用的是HTTP和MYSQL,可以参考如下官方文档:
因为最常用的过滤可以用不带参数的方式过滤,关于这种带参数的过滤方法,有兴趣的话可以参考文档: https://www.wireshark.org/docs/man-pages/wireshark-filter.html
准备知识
文档里面几个会用到的关系符,我这里先罗列下,建议直接使用第二列的数学符号,比较直观也好记
比较表达式
eq, == Equal ne, != Not Equal gt, > Greater Than lt, < Less Than ge, >= Greater than or Equal to le, <= Less than or Equal to
逻辑表达式
and, && Logical AND or, || Logical OR not, ! Logical NOT
配合两种过滤器使用的-T参数
-Y参数必须配合-T参数使用才能成功打印出过滤后的结果,-T参数支持多种不同的输出格式,比如json、fields等等,最常用的是fileds,我们这里也只介绍和演示这种格式。fields的输出格式需要通过-e来指定需要打印的filed value,具体使用方法可以参考后面的使用案例。-T参数可以配合-f 或者-Y两种类型的过滤器。
PS:-T参数指定field打印存在一些局限性,就是打印之后能只能在标准输出查看,或者将输出记录到文件,没法通过指定-w写入cap类型文件供wireshark来分析。
使用案例1: 获取HTTP请求的类型、URL、HOST等信息
这里同时使用了两种过滤器
使用案例2: 获取SQL语句
我这里用的field是mysq.query和,配个的过滤器是表达式过滤器
实际经过测试发现,基本上也就mysql.query、mysql.login_request这两个field比较有用,大部分MYSQL协议的packet都是这两种类型的。
抓包不指定停止条件会一直抓,tshark提供了几种停止的条件,常用的就是用-c来指定需要抓几个包,使用效果可以参考3.2节
-V参数可以将packet展看查看详情,效果如下:
PS:-V参数无法和-T一起使用,-T指定的filed之后只会输出field的信息了
-w选项后可以接路径和文件名,保存到文件,默认按照cap格式保存。另外指定-T参数之后无法再使用-w,请注意。
一般情况下,针对一次抓包之后,我们很有可能进行多个维度的分析,所以先存到文件,再进行分析,是很常见的使用方法。下面通过一个实际案例来学习下这种抓包分析分发。
PS: -Y指定的表达式过滤不能配合写文件使用,要在写文件前进行过滤,可以使用-f的capture filter
需求
小明同学在排查问题的时候,突然有个需求,就是需要知道当前网络包抓取的SQL来源于哪个源端,并且需要知道SQL的内容。
分析
通过mysql.query可以来获取SQL内容,但是无法直接依靠-T参数输出指定field来满足该需求。因为-T指定输出格式后,无法知道SQL来自于哪个源端。
思考后可行的方案为: 直接先用-f过滤,先过滤出指定类型和port上的packet,存入到文件,然后利用-V展开后再来分析。这种方式既可以按照条件过滤网络包,然后又可以采用tshark来分析,知道packet的源端信息。
操作
tshark -c 50 -f 'tcp dst port 3306 and dst host 10.195.33.7 ' -w mysql_test.cap
tshark -r mysql_test.cap -V | egrep 'Internet|Statement'
通过一步步由简单到复杂,并且学习了最常用的选项之后,相信大家已经基本掌握了tshark的用法。
针对简单的、单一维度查询的抓包需求,可以直接通过-f 和-Y来进行过滤,按照-T进行输出。
针对需要多维度查询、查看packet详情的,可以直接通过-w导出抓包结果,再使用-r结合grep来查看分析。
自行准备测试环境,包含主机A和主机B,其中主机B上有DB可以进行SQL操作。在主机A上启动tshark进行抓包,将满足以下过滤条件的抓包结果全部写入文件tshark_x_y.pcap,其中x为下面习题的编号,如果一个习题下需要产生多个dump文件,可以用y进行编号,否则直接写成tshark_x.pcap即可。