tcpdump 命令
tcpdump 是Linux系统中强大的网络抓包与分析工具
语法
tcpdump [-aAbdDefhHIJKlLnNOpqRStuUvxX][-c<数据包数目>][-dd][-ddd][-F<表达文件>][-i<网络接口>][-r<数据包文件>][-s<数据包大小>][-tt][-T<数据包类型>][-vv][-w<数据包文件>][输出数据栏位]
选项:
- -a 尝试将网络和广播地址转换成名称。
- -A 以ASCII格式打印出所有分组,并将链路层的头最小化
- -c<数据包数目> 在收到指定的数量的分组后,tcpdump就会停止。
- -d 把编译过的数据包编码转换成可阅读的格式,并打印到标准输出。
- -dd 把编译过的数据包编码转换成 C 语言的格式,并打印到标准输出。
- -ddd 把编译过的数据包编码转换成十进制数字的格式,并打印到标准输出。
- -e 显示数据链路层部信息。该选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息.
- -f 将外部的ip地址以数字的形式打印出来。
- -F<表达文件> 从指定的文件中读取表达式,忽略命令行中给出的表达式。
- -i<网络接口> 指定监听的网络接口。
- -l 使标准输出变为缓冲行形式,可以把数据导出到文件。
- -n 不解析域名,直接显示IP。
- -N 不解析域名和端口。
- -O 不将数据包编码最佳化。
- -p 不让网络界面进入混杂模式。默认情况下使用tcpdump抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序.
- -q 快速输出,仅列出少数的传输协议信息。
- -r<数据包文件> 从指定的文件读取数据包数据。
- -s<数据包大小> 设置每个数据包的大小,tcpdump默认只会截取前96字节的内容,要想截取所有的报文内容,可以使用 -s number, number就是你要截取的报文字节数,如果是0的话,表示截取报文全部内容。
- -S 用绝对而非相对数值列出 TCP 关联数。
- -t 在输出的每一行不打印时间戳。
- -tt 在每一行中输出非格式化的时间戳。
- -T<数据包类型> 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
- -v 详细显示指令执行过程。
- -vv 更详细显示指令执行过程。
- -x 用十六进制字码列出数据包资料。
- -w<数据包文件> 把数据包数据写入指定的文件。
过滤器
机器上的网络报文数量异常的多,我们需要筛选出自己关心的数据报文,这时就需要用到过滤器了。tcpdump提供了灵活的语法可以精确地截取关心的数据报,简化分析的工作量,这些选择数据包的语句就是过滤器(filter)。
host过滤器
host过滤器用于过滤某个主机的数据报文,语法示例示例:
$ tcpdump host 10.18.200.34 #抓取发往该主机或从该主机发出的数据
$ tcpdump src host 10.18.200.34 #抓取从该主机发出的数据
$ tcpdump dst host 10.18.200.34 #抓取发往该主机的数据
Network 过滤器
Network 过滤器用来过滤某个网段的数据,使用的是 CIDR[2] 模式。可以使用四元组(x.x.x.x)、三元组(x.x.x)、二元组(x.x)和一元组(x)。四元组就是指定某个主机,三元组表示子网掩码为 255.255.255.0,二元组表示子网掩码为 255.255.0.0,一元组表示子网掩码为 255.0.0.0。例如,
抓取所有发往网段 192.168.1.x 或从网段 192.168.1.x 发出的流量:
$ tcpdump net 192.168.1
抓取所有发往网段 10.x.x.x 或从网段 10.x.x.x 发出的流量:
$ tcpdump net 10
$ tcpdump src net 172.16.0.0/12
和host过滤器一样,这里也可以指定源src和目的dst
Proto协议过滤器
Proto过滤器用来过滤某个协议的数据,关键字为proto,可省略。proto 后面可以跟上协议号或协议名称,支持 icmp, igmp, igrp, pim, ah, esp, carp, vrrp, udp和 tcp。因为通常的协议名称是保留字段,所以在与 proto 指令一起使用时,必须根据 shell 类型使用一个或两个反斜杠(/)来转义。Linux 中的 shell 需要使用两个反斜杠来转义,MacOS 只需要一个。
例如,抓取icmp协议的报文:
$ tcpdump -n proto \\icmp
# 或者
$ tcpdump -n icmp
Port过滤器
Port端口过滤器用来过滤通过某个端口的数据报文,关键字为 port,如抓取80端口数据:
$ tcpdump port 80
组合过滤器
可能使用常用逻辑符组合使用过滤器,逻辑符:
and &&
or ||
not !
实例
#抓取网络接口ens33下的udp协议数据
$ tcpdump -i ens33 udp
#抓取80端品数据
$ tcpdump -i ens33 -s0 -v port 80
# 如果想要获取主机10.18.200.1接收或发出的telnet包
$ tcpdump tcp port 23 host 10.18.200.1
获取主机10.18.200.1除了和主机10.18.200.2之外所有主机通信的ip包
tcpdump ip host 10.18.200.1 and ! 10.18.200.1
显示链路层信息,源和目的MAC地址
$ tcpdump -i ens33 -n -e -c 5 not ip6
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
11:50:13.354146 00:0c:29:4f:3b:e2 > 00:0c:29:b0:49:26, ethertype IPv4 (0x0800), length 79: 10.18.200.96.38500 > 10.18.200.95.mysql: Flags [P.], seq 321967392:321967405, ack 1459449300, win 1424, options [nop,nop,TS val 2503624738 ecr 2503615155], length 13
11:50:13.354311 00:0c:29:b0:49:26 > 00:0c:29:4f:3b:e2, ethertype IPv4 (0x0800), length 115: 10.18.200.95.mysql > 10.18.200.96.38500: Flags [P.], seq 1:50, ack 13, win 1432, options [nop,nop,TS val 2503618505 ecr 2503624738], length 49
11:50:13.354499 00:0c:29:4f:3b:e2 > 00:0c:29:b0:49:26, ethertype IPv4 (0x0800), length 66: 10.18.200.96.38500 > 10.18.200.95.mysql: Flags [.], ack 50, win 1424, options [nop,nop,TS val 2503624739 ecr 2503618505], length 0
11:50:13.354748 00:0c:29:4f:3b:e2 > 00:0c:29:b0:49:26, ethertype IPv4 (0x0800), length 261: 10.18.200.96.38500 > 10.18.200.95.mysql: Flags [P.], seq 13:208, ack 50, win 1424, options [nop,nop,TS val 2503624739 ecr 2503618505], length 195
11:50:13.355115 00:0c:29:b0:49:26 > 00:0c:29:4f:3b:e2, ethertype IPv4 (0x0800), length 837: 10.18.200.95.mysql > 10.18.200.96.38500: Flags [P.], seq 50:821, ack 208, win 1432, options [nop,nop,TS val 2503618506 ecr 2503624739], length 771
5 packets captured
12 packets received by filter
0 packets dropped by kernel