tcpdump命令学习总结
1. 背景
前段时间线网在运行过程中kafka消费者中消费到了一些异常数据,由于不清楚这些异常数据的来源,所以需要定位该数据来源是从哪里来的,使用了一系列的方法配合tcpdump进行定位,最终发现数据来源。因为之前都是断断续续在使用tcpdump,对其中的一些用法还是不是特别了解,所以这次详细的总结了tcpdump用法的一些相关知识,以作记录。
2. 简介
tcpdump是Linux自带的一款常用的抓包工具,在工作和运维的过程中,我们常使用该命令定位、分析和测试网络问题。tcpdump命令在日常工作中常见的使用场景:
- redis集群机器裁撤需要将数据和业务等迁移到新的redis集群场景,由于访问该redis集群的业务繁多,不能保证一次性将所有的业务完全切换干净,这个时候为了保证相关业务不受影响,需要验证是否还有其他业务访问旧的redis集群,这个时候一种常用的方法就是使用tcpdump等网络分析工具对redis访问端口进行抓包,若还有数据包过来,就说明还有业务在访问旧的redis集群,然后再根据包信息分析出是哪些业务在访问。
- 当业务收到不明数据,但是又不知道该数据是从何而来,此时最简单的方法就是使用tcpdump进行抓包分析,分析出数据的来源
- tcpdump有助于帮我们调试网络程序,分析新的网络协议,分析网络负载等等
- …
tcpdump可以抓取经过该机器所有网卡的数据包头信息,它允许我们编写bool表达式对抓取的数据包进行过滤,可以通过指定过滤条件对网卡、端口、ip地址以及协议等进行过滤,获取我们对我们有用的信息。
需要注意的是tcpdump命令只能由具备root权限的用户来执行,原因是它需要将网络界面设置为混杂模式(一台机器的网卡能够接收所有经过它的数据流,而不论其目的地址是否是它),普通用户不能正常执行。
3. tcpdump参数解析说明
tcpdump工具提供了一些有用的参数,参数的作用主要分为几类,我们可以通过对下面参数组合进行使用,其中一些参数可能互相影响,一些我认为基本用不到的参数这里就没有赘述,为了便于记忆和搜索,我简单将参数控制归为一下几类,可能会有些偏差。显示类参数将给出相关显示截图,其他不提供。
- 数据显示格式控制参数
- 数据写入读取文件控制参数
- 抓包数据量控制参数
- 过滤条件控制参数
- 帮助类控制参数
3.1 数据显示格式控制参数
-A、-x、-X
- -A说明:将抓取的数据包以ASCAII的形式打印出来(并将数据链路层头部最小化)。
- -A用途:一般抓取网页数据时使用该参数,使用该参数可以打印出human-readable的信息,便于分析包头。
- -x说明:将抓取的数据包以16进制的形式展示出来(并将数据链路层头部最小化)。
- -X说明:将抓取的数据包同时以16进制(hex)和ASCAII的形式展示出来(并将数据链路层头部最小化)。
- -X用途:常用于分析新得网络协议。
-d、-dd、-ddd
- -d:将抓取的数据包按照汇编格式输出。(暂不清楚用途)
- -dd:将抓取的数据包以c语言程序段的格式给出。(暂不清楚用途)
- -ddd:将抓取的数据包以十进制形式输出。(暂不清楚用途)
注意使用上述多个参数的效果会被覆盖,优先级 :ddd > dd > d > X > A
-e
- 说明:打印数据链路层头部信息(未最小化)。可与A、x、X配合使用
- 用途:当使用-A参数和-X参数,或不指定参数时候,打印出的数据链路层信息为简化信息,使用此参数可打印链路层头部完整信息。
-a、-n
- -a:尝试将ip地址转化为名称,如本机的ip转化为主机名进行显示,tcpdump默认行为是转换为名称,若强制显示ip,需要指定-n参数。
- -n:不要将网络地址转换为名字,强制展示ip、port,作用于-a相反。
-t、-tt、-ttt、-tttt
- -t : 不在tcpdump输出结果每一行输出时间戳
- -tt : 在每一行输出非格式化的时间戳
- -ttt : 输出本行和前一行的时间差,而不是时间
- -tttt: 在本行输出由date处理的时间
-v、-vv、-vvv
- -v:制定该参数可输出较为详细的信息。如IP信息包中的生存时间、标识、总长度和选项。还启用其他信息包完整性检查,例如:验证 IP 和 ICMP 标题校验和。
- -vv:输出比-v更详细的信息,如从NFS显示其他字段,并对应答包进行完全解码。
- -vvv:输出比-vv更详细的信息。完整显示 Telnet SB 至 SE 选项
3.2 数据写入读取文件控制参数
-w [file]
- 说明:将tcpdump的抓取的原始数据包写文件,而不是解析出来之后在写文件。该包只能使用tcpdump -r选项读取并分析
-r [file]
-C [size]
- 说明:-C参数后添加数字指定导出单个文件的大小。当使用-w参数将tcpdump抓取的数据导入到文件的时候,此参数可以限制导出文件的大小,当导出文件超过此大小限制的时候,文件将滚动,如data–>data1、data2… 注意指定数字的单位为兆B(1,000,000 bytes)。
- 用途:限制tcpdump导出数据文件的大小。
-W [number]
- 说明: 该选项与-C配合使用时,用于限制滚动文件的个数,若超过指定文件个数,则覆盖原有文件继续写。
-U
- 说明:通过 -w 选项保存输出(例如,“packet-buffered”)。保存了每个信息包之后,就会将它写入输出文件,而不是仅当输出缓冲区填满时才将它写入。
- 注意:如果tcpdump是使用缺少pcap_dump_flush()函数的旧版libpcap构建的,则不支持-U标志。
-l
- 说明:将tcpdump的输出编程缓冲行形式,并可将缓冲行形式数据导入文件中用于分析。tcpdump -l>dat & tail -f dat
- 用途:当需要将tcpdump显示结果导入文件中的时候可以使用该参数
- 注意:该参数将tcpdump结果导入文件与-w参数导入文件的区别是:使用-w导入文件的数据格式是二进制格式,打开文件看是乱码,必须使用tcpdump -r参数读取才能看到明文数据。而使用缓冲行导入文件存入的数据直接为明文数据。
3.3 抓包数据量控制参数
-c [number]
- 说明:-c参数后需要加数字指定需要抓取数据包的数量,当抓取的数据包达到此数量,tcpdump将自动退出不继续抓包。如-c 10 表示只抓取10个包
- 用途:tcpdump一般刷的很快,所以我们可以指定抓取一定个数的包进行分析。
-s [size]
- 说明:指定抓取的每个数据包的最大大小。若指定-s 0表示打印完整包头,不截断。
3.4 过滤条件控制参数
-F [file]
- 说明:将过滤条件写入文件,使用-F指定过滤参数文件,命令行过滤参数将被忽略
- 用途:当过滤条件较多,或者写通用使用的过滤条件的时候可将过滤条件写入文件然后用该参数指定。
-i [eth_type]
- 说明:指定要监听(抓包)的网络接口。
- 注意:注意若该参数不指定,tcpdump将从系统所有接口中选择编号最小的网络接口进行监听。而不是监听所有的网卡.若需要监听所有网卡,则指定该值为any
-y [linker_type]
-O
- 说明:禁用分组匹配(packet-matching)代码优化程序
- 用途:当你认为分组匹配优化程序有问题时使用该参数将优化程序禁用。
-p
- 说明:不要将网络接口置于混杂模式。
- 注意:网络接口可能由于默写原因处于混杂模式,此参数可以将网络接口不要置于混杂模式
3.5 帮助类控制参数
-D
- 说明:打印当前系统所有可使用tcpdump抓包的网络接口(即网卡名称)
- 用途:当不清楚当前机器的网卡接口时,可使用该命令查看。当然,ifconfig也可以.
-L
4. tcpdump过滤表达式
tcpdump提供了一些源语用于书写过滤表达式,可以通过组合这些源语得到更加复杂精准的表达式,作为过滤条件。只有符合过滤表达式的包才会被截获,否则被过滤掉。若不指定过滤表达式将截获经过该网卡的所有数据包。
协议
由于可过滤的协议过多,大部分较不常用,所以此处只介绍几种常用的协议,具体其他协议可通过man tcpdump查看。注意:协议必须放到过滤条件的第一个参数位置.
- tcp : tcp传输协议。
- tcpdump tcp:截获所有tcp数据包头
- tcpdump tcp port 6379:截获所有源或目的端口为6379的tcp数据包头
- udp : udp传输协议。
- tcpdump udp:截获所有udp协议数据包头
- tcpdump udp port 6379:截获所有源或目的端口为6379的udp数据包头
- ether : 以太网协议。
- tcpdump ether host CB:14:4E:EF:B5:88 : 截获所有目的或源以太网址(MAC地址)为CB:14:4E:EF:B5:88的数据包。
- arp : arp协议
- tcpdump arp : 截获所有使用arp协议的数据包
数据流向
tcpdump在过滤的过程中,提供了两个参数用于指明数据包的来源和去向。
- src:只有数据包的数据来源与过滤条件匹配的才被截获
- tcpdump src host 127.0.0.1
- tcpdump src port 6379
- dst:只有数据包的去向与过滤条件匹配的才被截获
- tcpdump dst host 127.0.0.1 8686
- tcpdump dst port 6379
- src or dst :数据包的去向和来源有一个符合即匹配。默认为该中情况
- tcpdum dst or src port 6379 : 等效于tcpdump port 6379
- src and dst:数据包来源和去向都匹配才被截获
- tcpdump dst and src port 6379
过滤方式
tcpdump提供了不同的方式过滤数据包,其中常用的包括主机host,端口,网络地址等。其中不同的过滤方式需要与协议也是相互搭配的。
- host : 主机地址,ip地址或MAC地址等
- tcpdump host 127.0.0.1 : 以ip地址过滤
- tcpdump ether host CB:14:4E:EF:B5:88 : 以MAC地址过滤
- port : 端口
- tcpdump port 6379 : 以端口过滤
- portrange:端口范围
- tcpdump portrange 6379-6800 : 过滤6379-6800之间端口的数据包头
- net : 网络地址(可通过ip地址和子网掩码计算当前计算机所属网络的网络地址)
逻辑运算符
- ! 或not : 否定
- tcpdump host not 127.0.0.1
- tcpdump host !127.0.0.1
- &&或and : 并且
- tcpdump host 127.0.0.1 and port 6379
- tcpdumphost 127.0.0.1 && port 6379
- ||或or : 或
- tcpdump host 127.0.0.1 or port 6379
- tcpdump host 127.0.0.1 || port 6379
5. tcpdump高级过滤
tcpdump除了可以通过上述通过协议,ip、端口等方式过滤之外,还提供了对协议保内数据内容的过滤,可以称为高级过滤。
语法
- proto[x:y] : 指定过滤协议为proto的包,并取出协议头中数据从x位置开始y个字符。我们可以通过该字符进行过滤
- 表达式:>, <, >=, <=, =, !=,&,|
如:过滤条件可以写成tcp[0:2] = 80 : 即过滤包中数据前两位为80的数据包,如果对tcp协议比较熟悉的同学可能知道前两位表示的是源端口,即该过滤条件的作用于src port 80相同。
6. tcpdump输出详解
我们可以通过一个例子解析输出信息:
test_host:/data/test
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
16:32:48.283360 ca:23:xx:xx:xx:98 > 58:xx:xx:xx:xx:71, ethertype IPv4 (0x0800), length 286: 10.40.xx.xx.36000 > 10.41.xx.xx.9783: P 2015870443:2015870675(232) ack 574064968 win 501
0x0000: 4500 0110 8c5a 4000 4006 2653 0a7d 1c6f E....Z@.@.&S.}.o
0x0010: 0xx9 5x26 8cx0 2637 7827 bdeb 2237 8948 .)V&..&7x'.."7.H
0x0020: 5018 01f5 883d 0000 6936 e8d9 5053 ea53 P....=..i6..PS.S
0x0030: 4840 7c3e 0e45 d460 11ce 4e3e 9d04 03e6 H@|>.E.`..N>....
0x0040: 9d92 8c00 d6a2 9188 bd73 fe13 ae58 3c81 .........s...X<.
0x0050: d02a .*
1 packets captured
2 packets received by filter
0 packets dropped by kernel
截取数据分析:
- 第一行:tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
- 提示我们可以使用-v或-vv来获取更详细的信息,具体可参考上面的参数部分
- 第二行:listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
- listening on eth0:表示监听的网卡为eth0
- link-type EN10MB (Ethernet):链路层是基于以太网的
- capture size 96 bytes : 包大小限制为96.可通过-s 参数修改
- 第三行:16:32:48.283360 ca:23:xx:xx:xx:98 > 58:xx:xx:xx:xx:71, ethertype IPv4 (0x0800), length 286: 10.40.xx.xx.36000 > 10.41.xx.xx.9783: P 2015870443:2015870675(232) ack 574064968 win 501
- 16:32:48.283360 : 时间(时分秒微妙)
- ca:23:xx:xx:xx:98 > 58:xx:xx:xx:xx:71 : 该数据包传递的机器的Mac地址信息。源MAC > 目的MAC
- ethertype IPv4 (0x0800) : Ethernet帧的协议类型为ipv4(即代码为0x0800)。
- length 286 : 包的长度为286
- 10.40.xx.xx.36000 > 10.41.xx.xx.9783 : 该数据包传递的ip&port信息。源ip&port > 目的ip&port
- 第四行 :http和tcp头部信息
7. tcpdump 常用案例
上面几节详细介绍了tcpdump的参数,过滤表达式和高级过滤的方法,不过在日常使用中,我们常用的命令也就那么几个。这里列出来几个常用的命令一遍后面拿来即用,其他情况使用各种过滤条件组合即可。
7.1 tcpdump抓取经过指定网卡的http包
tcpdump -i eth1 -Xens 0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
7.2 tcpdump抓取目的端口为6379的数据包
tcpdump -i eth1 -Xens 0 dst port 80
7.3 tcpdump抓取源ip为10.xx.xx.1 或 10.xx.xx.2的数据bao
tcpdump -i eth1 -Xens 0 src host 10.xx.xx.1 or 10.xx.xx.2
8.参考资料:
man tcpdump
https://my.oschina.net/xinxingegeya/blog/325806
https://blog.csdn.net/gatieme/article/details/50989257
http://github.tiankonguse.com/blog/2016/08/13/tcpdump.html
https://www.cnblogs.com/chris-cp/p/5082514.html
https://blog.csdn.net/hzhsan/article/details/43445787