内容简介:tcpdump 是一款强大的网络抓包工具,dump the traffice on anetwork,对网络上的数据包进行截获的包分析工具。熟练掌握tcpdump 可以方便我们跟踪解决网络丢包,重传,数据库链路调用等问题。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
[4] 通过实例学习 tcpdump 命令 Linux 学习
以上所述就是小编给大家介绍的《作为 DBA,你有必要了解一下 tcpdump》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 作为PHP开发者请务必了解Composer
- 作为前端的你了解多少tcp的内容
- Kafka作为大数据的核心技术,你了解多少?
- 作为高级 Java,你应该了解的 Linux 知识
- 简单认识并使用JavaScript【供后端人员作为了解】
- 作为一名程序员,你真正了解 CDN 技术吗?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。