作为DBA,你有必要了解一下tcpdump

时间:2022-07-23
本文章向大家介绍作为DBA,你有必要了解一下tcpdump,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一 简介

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种类型的表达式:

Type(类型)选项包括 host,net和port,缺省为host
host(缺省类型): 指明一台主机,如:
host 10.215.20.13
net: 指定网络地址,net 10.215.20.0
port: 指明端口号,port 3306
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
Proto(协议)包括 tcp 、udp 、ICMP 和 ah 等

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

ip
arp
tcp
udp
icmp
其他关键字 gateway broadcast less greater

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

非 : ! 、not
且 : && 、 and
或 : || 、 or
例子: 抓取所有经过 bond0,目的地址是 10.10.1.254 或 10.10.1.200 端口是 80 的 TCP 数据
# tcpdump -i bond0 '((tcp) and (port 80) and ((dst host 10.10.1.254) or (dst host
10.10.1.200)))'

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结构了解一下

图片来自 https://www.cnblogs.com/the-tops/p/6587498.html

四 案例分析

利用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的交互,实际生产中可能更复杂,出现问题的场景不一定稳定复现,要抓很多包来分析定位。所以出现问题的时候抓包和分析包是个体力活。

五 推荐阅读

[1] https://www.tcpdump.org/

[2] https://zhuanlan.zhihu.com/p/33580437

[3] Tcpdump在数据库中的使用实践

[4] 通过实例学习 tcpdump 命令 Linux学习