Skip to content

tcpdump 工具

一.tcpdump简介

tcpdump 是一个强大的网络抓包工具,用于捕获和分析网络数据包。它支持多种网络协议,并可以将数据包以人类可读的格式显示出来,是网络故障排除和安全审计的利器。tcpdump 允许用户指定过滤条件,只显示满足条件的数据包。

二.tcpdump工具安装

bash
sudo apt-get install tcpdump

三.tcpdump使用

1.tcpdump命令的参数

(1).基本参数(捕获控制)

参数说明示例
-i <interface>指定监听的网络接口-i eth0-i any
-c <count>捕获指定数量数据包后停止-c 10
-s <snaplen>设置抓包快照长度,-s 0 抓完整包-s 0-s 68
-w <file>将原始数据包写入文件(.pcap 格式)-w capture.pcap
-r <file>从文件中读取并分析数据包-r capture.pcap
-C <size>限制抓包文件大小(单位:MB)-C 10
-D列出所有可用网络接口tcpdump -D

(2).显示控制参数

参数说明示例
-n不解析域名,直接显示 IP 地址-n
-nn不解析 IP 和端口,显示纯数字-nn
-v / -vv / -vvv增加输出详细程度-vv
-A以 ASCII 格式显示数据包内容-A
-X / -XX以十六进制和 ASCII 格式显示-X-XX
-x以十六进制格式显示-x
-e显示数据链路层头部(MAC 地址)-e
-q快速输出,减少协议信息-q
-t不显示时间戳-t
-tt显示 Unix 时间戳-tt
-ttt显示相对时间间隔-ttt
-tttt显示更详细的时间戳-tttt
-l行缓冲输出,便于管道处理-l

(3).过滤表达式(BPF 语法)

表达式说明示例
host <ip>捕获与指定主机相关的数据包host 192.168.1.1
src <ip>捕获源 IP 为指定地址的数据包src 192.168.1.100
dst <ip>捕获目标 IP 为指定地址的数据包dst 192.168.1.200
port <port>捕获指定端口的数据包port 80
src port <port>捕获源端口为指定端口的数据包src port 12345
dst port <port>捕获目标端口为指定端口的数据包dst port 443
portrange <start>-<end>捕获端口范围的数据包portrange 20-24
tcp捕获 TCP 协议数据包tcp
udp捕获 UDP 协议数据包udp
icmp捕获 ICMP 协议数据包icmp
arp捕获 ARP 协议数据包arp
net <network>捕获指定网络段的数据包net 192.168.1.0/24
and / or / not逻辑运算符组合条件host 192.168.1.1 and port 80

2.tcpdump命令的用法

(1).监听所有数据包

bash
tcpdump

(2).监听指定接口的数据包

bash
tcpdump -i eth0

(3).监听指定端口的数据包

bash
tcpdump port 80

(4).监听指定源IP地址的数据包

bash
tcpdump src 192.168.1.1

(5).监听包含特定字符串的数据包

bash
sudo tcpdump -i any -s 0 -A -l 'port 80' | grep --line-buffered "a.php"

命令参数解读:

  • -i any:监听所有网络接口的流量。
  • -s 0:确保抓取完整的数据包,避免内容被截断。
  • -A:以ASCII码形式打印数据,方便直接读取文本内容(如HTTP请求)。
  • -l:启用行缓冲模式,让抓取到的数据能够实时通过管道(|)传递给 grep处理。
  • 'port 80':伯克利数据包过滤器(BPF)语法,只捕获HTTP流量。
  • | grep --line-buffered "a.php":将 tcpdump的输出实时传递给 grep,--line-buffered确保 grep也逐行处理,及时显示包含 "a.php" 的结果。

3.tcpdump实用命令

例1: 监测8425端口的 http 数据包, 并打印出 http 请求头和请求体

bash
sudo tcpdump -i any -n -A -s 0 'tcp port 8425 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

命令参数解读:

  • -i any:监听所有网络接口的流量。
  • -n:不解析主机名和端口名。
  • -A:以 ASCII 格式打印数据包内容。
  • -s 0:抓取完整的数据包,避免数据包截断。
  • 'tcp port 8425 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)':BPF 过滤表达式,只捕获 HTTP 请求。

例2: 监测8425端口的 http 数据包, 并打印出 http 请求的地址,不显示具体的内容

bash
sudo tcpdump  -n -A -l 'port 8425' | grep --line-buffered "HTTP/1.1"

命令参数解读:

  • -n:不解析主机名和端口名。
  • -A:以 ASCII 格式打印数据包内容。
  • -l:启用行缓冲模式,让抓取到的数据能够实时通过管道(|)传递给 grep处理。
  • 'port 8425':BPF 过滤表达式,只捕获 HTTP 请求。
  • | grep --line-buffered "HTTP/1.1":将 tcpdump 的输出实时传递给 grep,--line-buffered 确保 grep 也逐行处理,及时显示包含 "HTTP/1.1" 的结果。

四.实用建议

  • 权限要求:tcpdump 通常需要 root 权限,建议使用 sudo 执行
  • 接口选择:使用 -D 查看可用接口,或用 -i any 抓取所有接口
  • 完整抓包:使用 -s 0 避免数据包截断
  • 减少解析:排查问题时使用 -nn 避免 DNS 查询影响实时分析
  • 文件保存:长时间抓包时使用 -w 保存到文件,然后离线分析
  • 过滤优先:尽量在抓包时使用精确过滤,减少不必要的数据