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




返回软件开发辅助网 | 常用命令列表

shell语法手册