tcpdump
是一个非常强大的命令行工具,用于捕获和分析网络流量。它允许用户指定复杂的过滤条件来选择性地捕获数据包,并可以以多种格式输出捕获结果。
基本语法
tcpdump [选项] [表达式]
- 选项:用来控制
tcpdump
的行为。 - 表达式:用来定义要捕获的数据包的条件。
常用选项
-
-i interface:指定要监听的网络接口,默认是第一个非环回的接口。
-
-w file:将捕获的数据包直接写入文件中而不打印到标准输出。这可用于以后使用
-r
选项读取。 -
-r file:从文件中读取捕获的数据包,而不是实时捕获。
-
-c count: 在捕获了指定数量的数据包后停止。
-
-s snaplen:设置每个数据包的捕捉长度(快照长度)。默认值通常为68字节或96字节。设置为0表示捕获完整的数据包。
-
-n, -nn:不解析主机名或端口号,仅显示数字形式的IP地址和端口。第二个
-nn
还会阻止协议名称的解析。 -
-v, -vv, -vvv:增加输出信息的详细程度,每增加一个
-v
输出更详细的信息。 -
-e:打印出链路层头部信息,对于以太网就是MAC地址。
-
-tttt:显示详细的日期时间戳,格式为
年-月-日 时:分:秒.毫秒
。 -
-l:对标准输出进行行缓冲,使得与管道一起使用时能立即看到输出。
表达式
tcpdump
使用一种类似于 C 语言的表达式语法来定义捕获条件。这些表达式可以包含以下元素:
- 类型:如
host
,net
,port
,portrange
等,分别代表主机、网络、端口、端口范围。 - 方向:
src
,dst
,src and dst
,src or dst
分别代表源、目的、源且目的、源或目的。 - 协议:如
tcp
,udp
,icmp
等,用于限定特定协议的数据包。 - 逻辑运算符:
and
,or
,not
或它们的简写形式&&
,||
,!
,用于组合多个条件。
示例
-
捕获所有流量
tcpdump -i any
这个命令会监听所有的网络接口。
-
指定网络接口捕获
tcpdump -i eth0
指定在
eth0
网络接口上捕获数据包。 -
只捕获特定数量的数据包
tcpdump -c 10
只捕获前10个数据包然后停止。
-
保存到文件中
tcpdump -w capture_file.pcap
将捕获的数据包保存到名为
capture_file.pcap
的文件中。 -
从文件读取数据包
tcpdump -r capture_file.pcap
从文件中读取并显示之前捕获的数据包。
-
查看详细的输出
tcpdump -v
使用
-v
,-vv
, 或-vvv
来增加输出的详细程度。
高级用法
-
基于协议过滤
tcpdump tcp tcpdump udp tcpdump icmp
分别只捕获 TCP、UDP 或 ICMP 协议的数据包。
-
基于端口过滤
tcpdump port 80
捕获目标或源端口为80(HTTP)的所有数据包。
-
基于主机过滤
tcpdump host 192.168.1.1
捕获来自或发往 IP 地址
192.168.1.1
的所有数据包。 -
基于网络过滤
tcpdump net 192.168.1.0/24
捕获涉及整个
192.168.1.0/24
网段的数据包。 -
基于端口范围过滤
tcpdump 'portrange 1024-65535'
捕获端口号在1024到65535之间的所有数据包。
-
基于源或目的地址过滤
tcpdump src host 192.168.1.1 tcpdump dst host 192.168.1.1
分别捕获来自或发往指定主机的数据包。
-
组合条件过滤
tcpdump 'tcp and (port 80 or port 443)'
捕获TCP协议且目标或源端口是80或443的数据包。
-
排除某些流量
tcpdump 'not port 22'
排除所有SSH流量。
-
使用表达式捕获复杂模式
tcpdump 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
捕获包含特定字节序列的数据包,例如 HTTP GET 请求。
-
设置最大截取长度
tcpdump -s 0
捕获完整的数据包,而不是默认的96字节。
-
实时监控连接状态
tcpdump -nn -tttt -r capture_file.pcap
以人类可读的时间格式显示时间戳,不解析主机名和端口名称。
-
与grep等其他工具结合使用
tcpdump -l | grep 'something'
实时将
tcpdump
输出传递给grep
进行过滤。