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保存到文件,然后离线分析 - 过滤优先:尽量在抓包时使用精确过滤,减少不必要的数据
