linux 网络管理之tcpdump命令详解
一、tcpdump的作用
tcpdump 是linux环境的网络数据采集分析工具, 也就是所谓的抓包工具,与tcpdump只有命令行格式不同,Windows有个图形可视化工具Wireshark
所谓的抓包工具就是从网络数据包中抓取我们需要的数据包,就需要定义一些过滤器,从庞大的网络流量中抓取符合条件的目标数据包,学习抓包工具的使用其实就是了解怎么定义和使用过滤规则
二、语法格式
[root@host114 home]# tcpdump -h
tcpdump version 4.9.3
libpcap version 1.9.1 (with TPACKET_V3)
OpenSSL 1.1.1k FIPS 25 Mar 2021
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
参数说明
-a #将网络地址和广播地址转变成名字
-A 以ASCII码方式显示每一个数据包
-b #数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层
-c 指定收取数据包的次数,在收到指定数量的数据包后退出tcpdump
-d 将匹配信息包的代码以人们能够理解的汇编格式输出
-dd #将匹配信息包的代码以c语言程序段的格式输出
-ddd #将匹配信息包的代码以十进制的形式输出
-D #打印系统中所有可以监控的网络接口
-e 每行的打印信息包括数据链路层的头部信息
-f #将外部的Internet地址以数字的形式打印出来,即不显示主机名
-F #从指定的文件中读取表达式,忽略其他的表达式
-i 指定tcpdump 需要监听的接口
-l #使标准输出变为缓冲形式,可以数据导出到文件
-L #列出网络接口已知的数据链路
-n #不把网络地址转换为名字
-N 不输出主机名中的域名部分,例如www.baidu.com只输出www
-nn #不进行端口名称的转换
-P #不将网络接口设置为混杂模式
-q #快速输出,即只输出较少的协议信息
-r #从指定的文件中读取数据,一般是-w保存的文件
-w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
-s #从每个组中读取在开始的snaplen个字节,而不是默认的68个字节
-S #将tcp的序列号以绝对值形式输出,而不是相对值
-T #将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议)
-t #在输出的每一行不打印时间戳
-tt #在每一行中输出非格式化的时间戳
-ttt #输出本行和前面以后之间的时间差
-tttt #在每一行中输出data处理的默认格式的时间戳
-u #输出未解码的NFS句柄
-v #输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息
-vv#输出相信的保报文信息
三、参数解析
图片来自网络,把过滤规则分为几类:按协议、按类型、按数据流向
- 协议过滤:包括 tcp, udp, icmp, ip, ip6, arp, rarp,ether
- 类型过滤:包括host, net, port, portrange
- 流向过滤:包括src, dst
- 还可以用以上几种类型组合成过滤条件:当用到多个过滤器进行过滤时,有可能用到括号,而括号在shell中是特殊符号,还需要在括号外添加引号
3.1 显示数据包的头部
- -x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)
- -xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部)
- -X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
- -XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。
3.2 控制时间的显示
- -t:在每行的输出中不输出时间
- -tt:在每行的输出中会输出时间戳
- -ttt:输出每两行打印的时间间隔(以毫秒为单位)
- -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
3.3 常用的逻辑表达式
- 非 : ! or "not"
- 且 : && or "and"
- 或 : || or "or"
四、输出解析
输出实例
20:52:07.384759 IP 192.168.190.113.45020 > 439e3f58d19ff2d.samdom.znas.com.ssh: Flags [P.], seq 1405:1441, ack 2334348, win 9155, options [nop,nop,TS val 2882487051 ecr 3923644672], length 36
- 第一列:抓包时间,如果在输出的每一行不打印时间戳,可以添加-t
- 第二列:使用的网络协议
- 第三列:源地址和端口号,可能是主机名或者IP地址
- 第四列的箭头> :表示数据流向
- 第五列:目的地址和端口号
- 第6列:冒号
- 第7列:剩余数据为数据包内容,包括Flags标识符号、seq序列号、ack号、Win窗口、以及最后表示的数据长度
Flag 标识
- [S] : SYN(开始连接)
- [P] : PSH(推送数据)
- [F] : FIN (结束连接)
- [R] : RST(重置连接)
- [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)
五、使用实例
- tcpdump 默认抓取流经第一个网络接口的数据包
[root@host114 home]# tcpdump
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s1, link-type EN10MB (Ethernet), capture size 262144 bytes
20:58:50.538560 IP 439e3f58d19ff2d.samdom.znas.com.ssh > 192.168.190.113.45020: Flags [P.], seq 4119706794:4119707022, ack 374
5487054, win 304, options [nop,nop,TS val 3924048273 ecr 2882890622], length 228
20:58:50.538760 IP 192.168.190.113.45020 > 439e3f58d19ff2d.samdom.znas.com.ssh: Flags [.], ack 228, win 9155, options [nop,nop
,TS val 2882890652 ecr 3924048273], length 0
- tcpdump -i 网络接口 抓取流经指定网络接口的数据包
[root@host114 home]# tcpdump -i enp2s1
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s1, link-type EN10MB (Ethernet), capture size 262144 bytes
20:59:29.768941 IP 10.229.37.245.57553 > 228.0.168.245.ha-cluster: UDP, length 202
20:59:29.775424 IP 439e3f58d19ff2d.samdom.znas.com.48620 > 192.168.190.129.49159: Flags [P.], seq 114548774:114548942, ack 298
308690, win 253, options [nop,nop,TS val 3618941989 ecr 52696109], length 168
20:59:29.776702 IP 192.168.190.129.49159 > 439e3f58d19ff2d.samdom.znas.com.48620: Flags [P.], seq 1:217, ack 168, win 513, opt
ions [nop,nop,TS val 52700349 ecr 3618941989], length 216
20:59:29.776767 IP 439e3f58d19ff2d.samdom.znas.com.48620 > 192.168.190.129.49159: Flags [.], ack 217, win 261, options [nop,no
p,TS val 3618941991 ecr 52700349], length 0
- tcpdump host 指定IP 抓取流经指定IP的数据包,此时默认是流经当前主机第一个网络接口的数据包,示例是enp2s1
[root@host114 home]# tcpdump host 192.168.190.126
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp2s1, link-type EN10MB (Ethernet), capture size 262144 bytes
21:01:32.179594 IP 192.168.190.126.55203 > 439e3f58d19ff2d.samdom.znas.com.ctdb: Flags [S], seq 636612926, win 29200, options
[mss 1460,sackOK,TS val 1754330146 ecr 0,nop,wscale 7], length 0
21:01:32.179659 IP 439e3f58d19ff2d.samdom.znas.com.ctdb > 192.168.190.126.55203: Flags [R.], seq 0, ack 636612927, win 0, leng
th 0
- tcpdump host 192.168.190.126 -X -X以十六进制和ASCII格式显示数据包的头部
09:36:31.833101 IP BHBGSTOR01.58048 > 10.2.32.11.ldap: UDP, length 104
0x0000: 4500 0084 8e77 4000 4011 5857 0a02 1f8c E....w@.@.XW....
0x0010: 0a02 200b e2c0 0185 0070 541c 3066 0203 .........pT.0f..
0x0020: 008b 9363 5f04 000a 0100 0a01 0002 0100 ...c_...........
0x0030: 0201 0001 0100 a040 a30d 0405 4e74 5665 .......@....NtVe
0x0040: 7204 0406 0000 00a3 2204 0944 6e73 446f r......."..DnsDo
0x0050: 6d61 696e 0415 4342 4842 2e52 4f4f 542e main..CBHB.ROOT.
0x0060: 4342 4842 414e 4b2e 4e45 54a3 0b04 0341 CBHBANK.NET....A
0x0070: 4143 0404 0000 0000 300a 0408 4e65 744c AC......0...NetL
0x0080: 6f67 6f6e ogon
- 条件组合过滤抓包 多个条件组合,括号外须用引号
tcpdump '((tcp) and (port 80) and ((dst 192.168.190.113) or (dst host 192.168.1.1)))'