一、概述
tcpdump
是一个功能强大的,用于抓取网络数据包的命令行工具,与带界面的Wireshark
一样,基于libpcap
库构建。这篇文章主要介绍tcpdump
的使用。关于如何使用tcpdump
的资料中,最有用的就是tcpdump的两个手册。
tcpdump
使用手册:https://www.tcpdump.org/manpages/tcpdump.1.html
pcap
包过滤手册:https://www.tcpdump.org/manpages/pcap-filter.7.html
二、tcpdump选项介绍
在命令行输入./tcpdump -h
,就可以看到tcpdump的命令行参数选项。
$ ./tcpdump -h
tcpdump version 4.99.4
libpcap version 1.10.4 (with TPACKET_V3)
OpenSSL 1.0.1f 6 Jan 2014
Usage: tcpdump [-AbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ] [--count][ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ][ -i interface ] [ --immediate-mode ] [ -j tstamptype ][ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ][ -r file ] [ -s snaplen ] [ -T type ] [ --version ][ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ][ --time-stamp-precision precision ] [ --micro ] [ --nano ][ -z postrotate-command ] [ -Z user ] [ expression ]
参数选项 | 选项说明 |
---|---|
-A | 以ASCII格式打印每个数据包(减去其链路层报头)。方便捕捉网页。 |
-B buffer_size | 将操作系统捕获缓冲区大小设置为buffer_size,单位为KiB (1024字节)。 |
-c count | 收到count个数据包后退出。 |
-C file_size | 与 -w 选项配合使用,指定抓包文件大小,若抓取到的文件大于file_size,就创建下个文件保存 |
-d | 将编译好的数据包匹配代码以人类可读的形式转储到标准输出并停止。 |
-dd | 将数据包匹配代码作为C程序片段转储 |
-ddd | 将数据包匹配代码作为十进制数转储(前面有一个计数) |
-D | 打印系统上可用的网络接口列表,tcpdump可以在这些接口上捕获数据包。对于每个网络接口,都会打印一个编号和一个接口名称,后面可能还会有接口的文本描述。可以将接口名称或编号提供给-i标志,以指定要捕获的接口。 |
-e | 每行打印都加上数据链路层头部信息。例如,这可用于打印以太网和IEEE 802.11等协议的MAC层地址。 |
-E | 使用spi@ipaddr algo:secret对寻址到addr并包含安全参数索引值spi的IPsec ESP数据包进行解密。这种组合可以用逗号或换行符分隔。 |
-f | 用数字显示外部IPV4地址,而不是名字(此选项是用来对付Sun公司的NIS服务器的缺陷,此NIS服务器在查询非本地地址名字时,常常会陷入无尽的查询循环) |
-F file | 使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略. |
-h,–help | 打印tcpdump和libpcap版本,打印用法信息,然后退出。 |
-i interface | -i 指定 tcpdump 要监听的接口. 如果没有指定, tcpdump 会从系统接口列表中搜寻编号最小的已配置好的接口(不包括 loopback 接口).一但找到第一个符合条件的接口, 搜寻马上结束. |
-I | 将界面置于“监控模式”;这仅在IEEE 802.11 Wi-Fi接口上受支持,并且仅在某些操作系统上受支持。 |
-J | 列出接口和出口支持的时间戳类型。如果无法为接口设置时间戳类型,则不会列出时间戳类型。 |
-l | 对标准输出进行行缓冲,在需要同时观察抓包打印以及保存抓包记录的时候很有用. |
-L | 列出指定网络接口所支持的数据链路层的类型后退出. |
-m module | 从module指定的文件加载SMI MIB模块定义。可以多次使用该选项将几个MIB模块加载到tcpdump中。 |
-M secret | 如果TCP 数据包(TCP segments)有TCP-MD5选项(在RFC 2385有相关描述), 则为其摘要的验证指定一个公共的密钥secret. |
-n | 不将地址(比如, 主机地址, 端口号)进行数字表示到名字表示的转换. |
-N | 不打印出 host 的域名部分. 比如, 如果设置了此选现, tcpdump 将会打印’nic’ 而不是 ‘nic.ddn.mil’. |
-# | 在行首打印一个可选的数据包编号。 |
-O | 不启用进行包匹配时所用的优化代码. 当怀疑某些bug是由优化代码引起的, 此选项将很有用. |
-p | 不要将接口置于混杂模式。请注意,接口可能由于其他原因处于混杂模式;因此,-p 不能用作 “以太网主机{local-hw-addr}或以太网广播” 的缩写。 |
打印解析的数据包输出,即使原始数据包保存到带有-w标志的文件中。 | |
-q | 快速(或是 安静?)输出。打印更少的协议信息,因此输出行更短。 |
-r file | 从文件file 中读取包数据. 如果file 字段为 ‘-’ 符号, 则tcpdump 会从标准输入中读取包数据. |
-S | 打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号. |
-s snaplen | 设置tcpdump的数据包抓取长度为snaplen,,而不是默认的262144字节。 |
-T type | 强制将“表达式”选择的数据包解释为指定的类型。目前已知的type 可取的协议为: aodv, carp , cnfp, domain, lmp , pgm , pgm_zmtp1 , ptp , quic (QUIC), radius (RADIUS), resp , rpc , rtcp , rtp , snmp , someip (SOME/IP), tftp , vat , vxlan , wb and zmtp1 . |
-t | 不要在每行打印时间戳。 |
-tt | 在每行打印时间戳时,从1970年1月1日00:00:00(UTC)开始的秒数,以及从该时间开始的几分之一秒。 |
-ttt | 在每行打印时间戳时,打印与上一行的时间增量(默认单位:微秒) |
-tttt | 在每行打印的时间戳之前添加日期的打印 |
-ttttt | 在每行打印时间戳时,打印与第一行的时间增量(默认单位:微秒) |
-u | 打印出未解密的 NFS 句柄 |
-U | 如果指定了-w选项,则使保存的原始数据包输出到包缓存;即,当每个分组被保存时,它将被写入输出文件,而不是仅当输出缓冲器填满时才被写入。 |
-v | 当分析和打印的时候, 产生详细的输出. 比如, 包的生存时间, 标识, 总长度以及IP包的一些选项. 这也会打开一些附加的包完整性检测, 比如对IP或ICMP包头部的校验和. |
-vv | 更详细的输出。例如,从NFS回复数据包中打印附加字段,SMB数据包被完全解码。 |
-vvv | 产生比-vv更详细的输出. 比如, telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来. |
-V file | 从文件中读取文件名列表。如果file是- ,则使用标准输入。 |
-w file | 将原始数据包写入文件,而不是解析并打印出来。以后可以用-r 选项打印它们。如果文件是- ,则使用标准输出。 |
-W filecount | 此选项与-C 选项配合使用, 这将限制可打开的文件数目, 并且当文件数据超过这里设置的限制时, 依次循环替代之前的文件, 这相当于一个拥有filecount 个文件的文件缓冲池. 同时, 该选项会使得每个文件名的开头会出现足够多并用来占位的0, 这可以方便这些文件被正确的排序. |
-x | 解析和打印时,除了打印每个包的头部数据以外,还要以十六进制打印每个包的数据(减去其链路层头)。打印的数据大小不会超过整个数据包的大小与 snaplen 中的最小值。请注意,这是整个链路层数据包,因此对于填充的链路层(例如以太网),当较高层数据包比所需的填充短时,也会打印填充字节。在当前的实现中,如果分组被截断,该标志可能具有与-xx相同的效果。 |
-xx | 解析和打印时,除了打印每个包的头部数据之外,还要以十六进制打印每个数据包的数据,包括其链路层头部数据。 |
-X | 解析和打印时,除了打印每个包的头部数据以外,还要以十六进制和ASCII打印每个包的数据(减去它的链路层头)。这对于分析新协议非常方便。在当前的实现中,如果分组被截断,该标志可能具有与-XX相同的效果。 |
-XX | 解析和打印时,除了打印每个包的头部数据以外,还要以十六进制和ASCII格式打印每个包的数据,包括它的链路层头部数据。 |
-y datalinktype | 设置tcpdump 只捕获数据链路层协议类型是datalinktype的数据包 |
-z postrotate-command | 与-C或-G选项一起使用,这将使tcpdump运行“postrotate-command file ”命令,其中file是每次轮换后关闭的保存文件。例如,指定-z gzip或-z bzip2将使用gzip或bzip2压缩每个保存文件。 |
-Z user | 如果tcpdump以root用户身份运行,则在打开捕获设备或输入保存文件之后,但在打开任何输出保存文件之前,将用户ID更改为user,将组ID更改为主要用户组。 |
expression(表达式) | 选择要捕获的数据包。如果没有给出表达式,网络上的所有数据包都将被捕获。否则,只有表达式为“真”的数据包才会被捕获。有关表达式语法,请参见pcap-filter(7)。expression参数可以作为单个Shell参数传递给tcpdump,也可以作为多个Shell参数传递给tcpdump,以更方便的方式为准。通常,如果表达式包含Shell元字符,例如用于转义协议名称的反斜杠,那么将其作为单引号参数传递比转义Shell元字符更容易。多个参数在被解析之前用空格连接起来。 |
三、tcpdump 选项表达式(过滤器)
tcpdump
是使用 libpcap
库捕获网络包的,可以通过传入表达式来过滤不必要的网络包,关于过滤表达式的英文手册在这个网址:https://www.tcpdump.org/manpages/pcap-filter.7.html,这一小节就讲一讲这个表达式由什么组成的,怎么使用。
过滤器表达式由一个或多个表达元(primitives)组成。表达元(primitives)通常由一个id(名称或编号)组成,前面有一个或多个限定符。有三种不同的限定词:
type、dir、proto
type
限定符说明id名称或编号所指的是什么。可能的类型有:host、net、port、portrange
。例如,“host foo’”、“net 128.3”、“port 20”、“portrange 6000-6008”。如果没有type
限定符,则假定为host
。dir
限定符指定一个特定的传输方向到和/或来自id。可能的方向是:src、dst、src or dst、src and dst、ra、ta、addr1、addr2、addr3 、addr4
。例如,“src foo”、“dst net 128.3”、“src或dst端口ftp-data”。如果没有dir限定符,则假定为“src或dst”。ra、ta、addr1、addr2、addr3和addr4限定符仅对IEEE 802.11无线LAN链路层有效。proto
限定符将匹配限制在特定的协议。可能的协议有:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, sctp, tcp 和 udp
。例如, ether src foo,arp net 128.3, tcp port 21,udp portrange 7000-7009,wlan addr2 0:2:3:4:5:6。
如果没有proto限定符,则假定所有协议都符合该类型。例如,src foo
意思是(ip6 or ip or arp or rarp) src foo
,net bar
意思是(ip or arp or rarp) net bar
,port 53
意思是(tcp or udp or sctp) port 53
。 (请注意,这些示例使用了无效的语法来说明原理).- 除了以上所述,还有一些特殊的“表达元”关键字不遵循这种模式:
gateway, broadcast, less, greater 和 算数表达式
。
更复杂的过滤器表达式是通过使用and、or和not(或者等价地: && 、||、和 !分别)
来组合表达元。例如,host foo and not port ftp and not port ftp-data
。
为了节省输入,可以省略相同的限定符列表,例如,tcp dst port ftp or ftp-data or domain
和tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain
是完全相同的。
允许的表达元有下表这些:
表达元 | 说明 |
---|---|
dst host hostnameaddr | 如果数据包的IPv4/v6目标字段是hostnameaddr(可以是地址或名称),则为True。 |
src host hostnameaddr | 如果数据包的IPv4/v6源字段是hostnameaddr,则为True。 |
host hostnameaddr | 如果数据包的IPv4/v6源或目标是hostnameaddr,则为True。上述任何host表达式都可以加上关键字:ip、arp、rarp或ip6,如: ip host hostnameaddr 相当于ether proto \ip and host hostnameaddr |
ether dst ethernameaddr | 如果以太网目的地址是ethernameaddr,则为True。 |
ether src ethernameaddr | 如果以太网源地址是ethernameaddr,则为True。 |
ether host ethernameaddr | 如果以太网源地址或目的地址是ethernameaddr,则为True。 |
gateway host | 如果数据包使用host作为网关,则为True。这里是指以太网源或目标地址是host,而不是IP源或IP目标地址是host |
dst net netnameaddr | 如果数据包的IPv4/v6目的地址的网络号为netnameaddr,则为True。 |
src net netnameaddr | 如果数据包的IPv4/v6源地址的网络号为netnameaddr,则为True。 |
net netnameaddr | 如果数据包的IPv4/v6源地址或目的地址的网络号为netnameaddr,则为True。 |
net netaddr mask netmask | 如果IPv4地址与指定的netmask的地址匹配,则为True。可能符合src或dst标准。请注意,此语法对于IPv6网络地址无效。 |
net netaddr/len | 如果IPv4/v6地址与网络掩码len位宽的netaddr匹配,则为True。可能符合src或dst标准。 |
dst port portnamenum | 如果数据包是IPv4/v6 TCP、UDP或SCTP,并且目标端口值为portnamenum,则为True。portnamenum可以是/etc/services中使用的数字或名称(请参见tcp(4P)和udp(4P))。如果使用了名称,则检查端口号和协议。如果使用了数字或不明确的名称,则只检查端口号(例如,“dst port 513”将打印TCP/login流量和udp/who流量,而“port domain”将打印TCP/domain和UDP/domain流量)。 |
src port portnamenum | 如果数据包的源端口值为portnamenum,则为True。 |
port portnamenum | 如果数据包的源端口或目的端口是portnamenum,则为True。 |
dst portrange portnamenum1-portnamenum2 | 如果数据包是IPv4/v6 TCP、UDP或SCTP,并且目标端口值在portnamenum1和portnamenum2之间(包括这两个值),则为True。portnamenum1和portnamenum2的解释方式与port的portnamenum参数相同。 |
portrange portnamenum1-portnamenum2 | 如果数据包的源端口或目的端口在portnamenum1和portnamenum2之间(包括两者),则为True。 上述任何端口或端口范围表达式都可以加上关键字tcp、udp或sctp,如:tcp src port portnamenum |
less length | 如果数据包的长度小于或等于length,则为True。这相当于:len <= length |
greater length | 如果数据包的长度大于或等于length,则为True。这相当于:len >= length |
ip proto protocol | 如果数据包是协议类型为protocol的IPv4数据包(参见ip(4P)),则为True。protocol可以是由getprotobyname(3)识别的数字或名称之一(例如“getent(1) protocols”),通常来自/etc/protocols中的条目,例如:ah、esp、eigrp(仅在Linux、FreeBSD、NetBSD、DragonFly BSD和macOS中)、icmp、igmp、igrp(仅在OpenBSD中)、pim、sctp、tcp、udp或vrrp。请注意,这些示例标识符中的大多数也是关键字,必须通过反斜杠(\ )进行转义。注意,这个表达元不跟踪协议头链。 |
icmp | 缩略为:ip proto 1 |
ip6 proto protocol | 如果数据包是协议类型为 protocol 的IPv6数据包,则为真。(参见上面的“ip proto”以了解protocol 的含义。)请注意,ICMP的IPv6变体使用不同的协议号,在AIX、FreeBSD、illumos、Linux、macOS、NetBSD、OpenBSD、Solaris和Windows中称为ipv6-icmp。注意,这个表达元不跟踪协议头链。 |
icmp6 | 缩略为:ip6 proto 58 |
proto protocol | 如果数据包是协议类型为 protocol 的IPv4或IPv6数据包,则为真。 |
tcpdump的选项介绍完了,东拼西凑、或存疏漏,如有不慎,欢迎指正。如果对你有帮忙,欢迎点赞👍及➕收藏⭐。
参考:
https://blog.csdn.net/qq_23327993/article/details/109673974
https://blog.csdn.net/ljbcharles/article/details/122256796