tcpdump使用教程

news/2024/11/15 4:01:57/

在这里插入图片描述

一、概述

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}或以太网广播” 的缩写。
–print打印解析的数据包输出,即使原始数据包保存到带有-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 foonet bar 意思是(ip or arp or rarp) net barport 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 domaintcp 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


http://www.ppmy.cn/news/58209.html

相关文章

在VM VirtualBox6.1中安装redhat7.3过程实录

最近试用皕杰报表工具&#xff0c;需要把报表部署到linux系统&#xff0c;因而在VM VirtualBox虚拟机上安装linux操作系统&#xff0c;现把过程记录下来&#xff0c;作为今后的备忘。 打开VM VirtualBox虚拟机&#xff0c;见下图&#xff1a; 点击控制菜单选择新建&#xff1…

C#基础(显示转换——>手动处理 强制转换)

括号强转 作用&#xff1a;一般情况下 将高精度的类型强制转换为低精度 语法&#xff1a;变量类型 变量名 &#xff08;变量类型&#xff09;变量; 注意&#xff1a;精度、范围 有符号整型 int i 40000;long l 1;i (int)l; 无符号整型 byte b 1; uint ui 1; b (byte)u…

( 字符串) 647. 回文子串 ——【Leetcode每日一题】

❓647. 回文子串 难度&#xff1a;中等 给你一个字符串 s &#xff0c;请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串&#xff0c;即使…

字节跳动发放年终奖,远超预期~

最近一段时间&#xff0c;国内互联网大厂接连公布年终奖情况&#xff0c;整个后厂村都洋溢在春节般的喜庆气氛里。 虽然由于各种各样的顾虑&#xff08;主要是人员流失问题&#xff09;&#xff0c;大部分公司都将年终奖发放时间调整到了年中&#xff0c;但好饭不怕晚&#xf…

C语言选择语句

在C语言中&#xff0c;选择语句是程序控制流程的重要部分之一。选择语句可以根据指定的条件进行分支判断&#xff0c;并根据判断结果执行相应的代码。C语言中的选择语句主要包括if语句、if-else语句、nested if语句和switch-case语句。接下来将会对这些语句进行详细介绍。 if语…

3.1 存储系统概述

学习目标&#xff1a; 以下是一个关于存储系统概述的具体学习目标&#xff1a; 理解计算机存储器的基本概念&#xff0c;包括存储器的分类、存储单元、存储器容量等基本概念。 掌握存储器的存取原理&#xff0c;包括地址结构、存取周期、存取速度等相关概念。 熟悉常见的存储…

网络工程师 - 面试手册

网络工程师 - 面试手册 岗位概述 网络工程师主要负责企业或组织的网络基础设施建设、维护和优化。他们需要确保网络的稳定运行&#xff0c;以支持组织内部的通信和业务需求。网络工程师通常需要掌握计算机网络原理、网络设备配置和故障排除等方面的知识。 常见的职位招聘描述…

TouchGFX开发(1)----安装软件

TouchGFX开发.1----安装软件 概述TouchGFX 特点下载&安装 概述 TouchGFX 是一个高性能的嵌入式图形库&#xff0c;主要用于为微控制器&#xff08;MCU&#xff09;驱动的设备创建现代用户界面&#xff08;UI&#xff09;。它提供了一套丰富的图形功能&#xff0c;使开发者…