tcpdump 是网络故障排查和安全分析中最强大、最常用的工具之一。它能捕获流经网络接口的原始数据包,并提供详细的解读。
下面我将从基础使用 、输出信息解读 和常用命令示例三个方面为你进行解读。
1. tcpdump 基础使用
基本语法
tcpdump [选项] [过滤表达式]
常用选项
-i: 指定要监听的网络接口(如eth0,en0,any)。使用any可以捕获所有接口的流量。-n: 不要 将地址(IP、端口)转换为主机名、服务名。强烈建议始终使用此选项,因为DNS查找会降低性能并可能误导输出。-nn: 比-n更彻底,既不解析主机名,也不解析端口号对应的服务名(如 80 端口不会显示为http)。-v,-vv,-vvv: 提供更详细(Verbose)的输出信息。-c: 捕获指定数量的数据包后自动停止。-s: 设置捕获每个数据包的字节长度(快照长度)。-s0表示捕获完整的包(默认只捕获前96字节,可能丢失应用层数据)。-w: 将原始数据包写入文件,而不是在屏幕上解读。文件后缀通常是.pcap。-r: 读取之前通过-w选项保存的.pcap文件进行分析,而不是从网络接口捕获。-X: 同时以十六进制和 ASCII 格式打印数据包的数据(Payload)。-A: 以 ASCII 格式打印数据包的数据(Payload),适用于查看文本协议(如 HTTP)。-l: 使标准输出变为行缓冲,方便在捕获时通过管道(|)传输给其他命令(如grep)。
过滤表达式
这是 tcpdump 的核心功能,用于只捕获你关心的流量。表达式由限定词 和值组成。
- 类型限定词 :
host,net,port,portrange - 方向限定词 :
src,dst,src or dst,src and dst - 协议限定词 :
tcp,udp,icmp,arp,ip,ip6等
示例:
port 80: 所有经过80端口的流量(HTTP)host 192.168.1.1: 所有与192.168.1.1通信的流量src net 192.168.1.0/24: 源IP属于192.168.1.0/24网段的流量dst port 443: 目标端口是443(HTTPS)的流量icmp: 所有ICMP流量(Ping命令等)tcp port 22: SSH流量- 组合使用:
tcp and (port 80 or port 443)或host example.com and not port 22
2. 输出信息解读
这是一条典型的 tcpdump 输出行(使用命令 tcpdump -nni any tcp port 80):
13:45:22.123456 IP 192.168.1.100.52336 > 93.184.216.34.80: Flags [S], seq 123456789, win 64240, options [mss 1460,sackOK,TS val 100 ecr 0,nop,wscale 7], length 0
我们来逐段分解:
-
13:45:22.123456- 时间戳:小时:分钟:秒.微秒。这是数据包被捕获的绝对时间。
-
IP- 网络层协议。这里表示 IPv4。也可能是
ARP,IPv6等。
- 网络层协议。这里表示 IPv4。也可能是
-
192.168.1.100.52336- 源IP地址和源端口号。
52336是一个临时(ephemeral)端口,由客户端操作系统随机分配。
- 源IP地址和源端口号。
-
>- 数据流向:从源发送到目标。
-
93.184.216.34.80- 目标IP地址和目标端口号。
80是著名的HTTP服务端口。
- 目标IP地址和目标端口号。
-
Flags [S]- TCP标志位(控制位),这是解读TCP会话状态的关键:
S: SYN - 同步序列号,表示"发起一个连接请求"。F: FIN - 结束连接,表示"发送方已完成数据发送"。P: PSH - 推送数据,表示接收方应尽快将数据传递给应用层。R: RST - 重置连接,表示"立即中断连接",通常表示异常。.: ACK - 确认,表示确认号字段有效。它几乎总是被设置,有时会单独显示为[.],但通常与其他标志组合,如[S.]表示SYN-ACK。- 本例中的
[S]表示这是一个TCP三次握手的第一个包。
-
seq 123456789- TCP序列号(Sequence Number)。这是该数据包中数据的第一个字节的序列号。对于初始SYN包,这是一个随机初始序列号(ISN),其数据长度为0。
-
win 64240- 接收窗口大小(Window Size)。表示发送此数据包的主机(这里是客户端)的可用接收缓冲区大小,用于流量控制。
-
options [...]- TCP选项。例如:
mss 1460: 最大段大小(Maximum Segment Size)。sackOK: 支持选择性确认(Selective ACK)。TS val 100 ecr 0: 时间戳值和时间戳回显回复。
-
length 0- 该数据包中数据载荷(Payload) 的长度(字节)。SYN包没有应用层数据,所以长度为0。一个包含HTTP请求的包这里会显示具体长度。
3. 常用命令示例
-
捕获所有经过 eth0 网卡的流量
tcpdump -i eth0
-
捕获所有与特定主机(如 8.8.8.8)的通信,不解析域名
tcpdump -ni eth0 host 8.8.8.8
-
捕获所有HTTP流量(端口80)并显示数据内容
tcpdump -nni any -A tcp port 80
-
捕获所有到达端口443(HTTPS)的流量,并以十六进制显示
tcpdump -nni any -X dst port 443
-
捕获ICMP包(Ping命令)
tcpdump -ni eth0 icmp
-
将流量保存到文件,以供后续分析(如用Wireshark打开)
tcpdump -ni any -w my_capture.pcap
-
读取之前保存的pcap文件进行分析
tcpdump -r my_capture.pcap
-
复杂组合:捕获来自网段 10.0.0.0/24,且目标端口不是22(SSH)的流量
tcpdump -ni any src net 10.0.0.0/24 and not dst port 22
希望这个详细的解读能帮助你更好地使用和理解 tcpdump。实践是最好的学习方式,多尝试这些命令,并结合图形化工具(如 Wireshark)一起使用,效果会更好。