一、简介
tcpdump 是一款强大的网络抓包工具,dump the traffice on anetwork,对网络上的数据包进行截获的包分析工具。熟练掌握 tcpdump 可以方便我们跟踪解决网络丢包,重传,数据库链路调用等问题。
二、使用 tcpdump
2.1 语法
tcpdump 的语法如下:
Usage: tcpdump [-aAdDefhIJKlLnNOpqRStuUvxX] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ] [ -y datalinktype ] [ -z command ]
[ -Z user ] [ expression ]
我们重点说一下表达式 expression,tcpdump 通过表达式对不同类型的网络流量进行过滤,以获取到需要的信息。tcpdump 主要支持3种类型的表达式:
1. Type(类型)选项包括 host,net 和 port,缺省为 host
host(缺省类型): 指明一台主机,如:host 10.215.20.13
net: 指定网络地址,net 10.215.20.0
port: 指明端口号,port 3306
2. Direction(方向)选项包括 src 和 dst 以及它们的组合
确定方向的关键字
dst or src(缺省值) 指定源或者目标地址是 10.215.20.13的流量包
src: src 10.9.51.13, 指定源地址是10.9.51.13
dst: dst net 172.0.0.0, 指定目标网络地址是172.0.0.0
dst and src 比如: src host 10.9.51.13 and dst host 10.215.20.13
3. Proto(协议)包括 tcp 、udp 、ICMP 和 ah 等
协议的关键字:缺省值是监听所有协议的信息包
ip
arp
tcp
udp
icmp
其他关键字 gateway broadcast less greater
常用表达式:多条件时可以用括号,但是要用转义
2.2 参数
以一个实际例子说明
tcpdump tcp -i bond0 -tttt -s 0 -c 100 and dst port ! 22 and src net 10.10.1.0/24 -w 20190131.tcpdump
解释
(1)tcp: 协议类型,用来过滤数据报的协议类型
(2)-i bond0: 只抓取经过接口bond0的包
(3)-tttt: 使用格式 2019-02-02 10:37:37.120297,便于分析
(4)-s 0: 抓取数据包时默认抓取长度为68字节。加上-s 0 后可以抓到完整的数据包
(5)-c 100: 只抓取100个数据包
(6)dst port ! 22: 不抓取目标端口是22的数据包
(7)src net 10.10.1.0/24: 数据包的源网络地址为10.10.1.0/24
(8)-w 20190131.tcpdump: 保存成tcpdump文件中,方便使用wireshark分析抓包结果。
还有其他常用的参数:
-D:列出所有可用的网络接口
-n:禁用域名解析,让tcpdump直接输出IP地址.
-X:以16进制格式输出数据包的内容,不加该参数,会只输出iptcp/udp头部信息。加上该选项会将整个数据包输出。-vvvv 该参数其实是-v与-vvv的组合。-v会输出稍微详细一点的信息包括校验和ttl之类的;-vvv会尝试解析应用层协议,输出详细信息。二者组合就能完整的详细信息。-A:以ASCII值显示抓到的包,比如和MySQL的交互时,可以通过-A查看包的文本内容.
tcpdump 的功能结合参数排列组合非常多,感兴趣的朋友可以自己多动手实践。毕竟,纸上来得终觉浅,绝知此事要躬行。
三、解析包
知道如何使用tcpdump命令,我们接下来分析抓到的报文。抓包命令:
tcpdump -i bond0 -n -s 0 port 3312 -c 10 -tttt
第一列是时间 2019-02-02 10:46:13.447563
第二列 IP是网络协议名称。
10.215.20.13.appman-server > 10.9.51.13.25569 表示 数据包发送的源端十进制地址和接收端的ip地址10.9.51.13和端口号25569。其中 > 表示数据包的流向。
Flags [P.] 包的状态标志,
S=SYN 发起连接标志。P=PUSH 传送数据标志。F=FIN, 关闭连接标志。ack, 表示确认包。RST=RESET,异常关闭连接。., 表示没有任何标志。
seq 3771602051:3771602105 请求同步的序列号,注意3771602105-3771602051=54 表示数据包的大小和后面的length的大小一致。
ack 1872251807 确认已经同步的序列号+1
win 1857 当前可用的窗口大小,
注释:window size:窗口大小,16bits,窗口字段用来控制对方发送的数据量,单位为字节。TCP 连接的一端根据设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的上限。
length 54 tcp 包体的长度。
一图胜千言,tcp结构了解一下
四、案例分析
利用 tcpdump 和 wireshark 分析 MySQL 交互。利用如下命令收集数据包,
# tcpdump -i bond0 -n -s 0 port 3320 -tttt -A -w /tmp/20190202.tcpdump
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes
32 packets captured
36 packets received by filter
0 packets dropped by kernel
同时在通过其他窗口执行sql,进行抓包。
获取 20190202.tcpdump 使用 wrieshark 进行分析。忽略三次握手啥的,我们直接分析MySQL交互协议。要查看MySQL协议,要使用右键
设置 MySQL 协议
确定之后,可以看到协议那部分出现 MySQL,info 部分有我们比较熟悉的 select ,show tables 等语句。
登陆数据库的
执行查询的数据流,其实我们可以通过26 ,27两个包的时间差计算 sql 的执行时间,用于性能问题分析或者故障排查。
执行退出命令 exit
上面的举例只是利用 tcpdump 简单分析 MySQL 的交互,实际生产中可能更复杂,出现问题的场景不一定稳定复现,要抓很多包来分析定位。所以出现问题的时候抓包和分析包是个体力活。
来源:本文转自公众号 yangyidba(ID:yangyidba),转载请联系原作者。
GOPS 2019 · 上海站,11月1-2日,近70位AIOps、DevOps、自动化运维专家,全面深入为您介绍国内外名企落地案例,通信、金融、互联网运维明星导师等你来~