一、介绍
tcpdump 是一个在命令行下运行的网络数据包嗅探工具 。它能实时捕获和分析网络中传输的数据包。无需安装linux下自带(但是需要root权限)
二、原理

tcpdump依赖于操作系统底层的包捕获机制(在Linux上是 libpcap ,在Windows上是WinPcap/Npcap)。它通过将网卡设置为混杂模式,可以捕获所有经过该网卡的数据包,而不仅仅是发往本机的包。然后转换可读的格式输出。
三、使用场景
1、服务器突然变慢,是请求太高了吗?
2、发送的网络请求没收到?还是没发出去?
3、服务器 CPU 飙升,流量异常,怀疑被攻击。
4、前端传了一个 JSON 参数给后端,但后端一直报参数错误
5、出现偶发一次的短暂故障,无法实时捕捉
6、抓取流量保存,之后进行重放测试,或压力测试
7、测试程序在"网络超时"或"丢包 "的场景下会不会崩溃。
四、命令参数及过滤方法
命令格式
tcpdump -aAbdDefhHIJKlLnNOpqStuUvxX# -B size -c count
-C file_size \] \[ -E algo:secret \] \[ -F file \] \[ -G seconds
-i interface \] \[ -j tstamptype \] \[ -M secret \] \[ --number
-Q\|-P in\|out\|inout
-r file \] \[ -s snaplen \] \[ --time-stamp-precision precision
--immediate-mode \] \[ -T type \] \[ --version \] \[ -V file
-w file \] \[ -W filecount \] \[ -y datalinktype \] \[ -z postrotate-command
-Z user \] \[ expression
常用参数
-i 指定网卡:sudo tcpdump -i eth0(只抓取eth0接口)。用 -i any 可监听所有接口。
-n 不解析域名:sudo tcpdump -n。强烈推荐加这个,避免DNS反向查询,让显示速度更快,输出更清晰。
-v / -vv / -vvv 详细输出:显示更详细的协议信息。
-c 限制捕获数量:sudo tcpdump -c 10(只抓10个包后自动退出)。
-s 抓取长度:sudo tcpdump -s 0(抓取整个数据包,而不是默认的68或96字节)。为了完整分析,通常设为0。
-w 写入文件:sudo tcpdump -w capture.pcap(把原始包保存下来,供Wireshark等工具离线分析)。
-r 读取文件:sudo tcpdump -r capture.pcap(读取之前保存的pcap文件)。
过滤表达式
按主机:host 192.168.1.100(只抓与这个IP相关的包)
按网络:net 192.168.0.0/24
按端口:port 80 或 portrange 8000-9000
按协议:tcp、udp、icmp
组合逻辑:and(&&)、or(||)、not(!)
五、常用命令
列出所有的网络接口
bash
tcpdump -D

抓取eth0数据包,并过滤80端口或ICMP数据,并显示数据
bash
tcpdump -i eth0 port 80 or icmp -A
抓取eth0数据包,并过滤目标host为192.168.0.101的数据
bash
tcpdump -i eth0 dst host 192.168.0.101
src为原地址
抓取高频流量
bash
tcpdump -i any -n
抓取SYN包
bash
tcpdump 'tcp[tcpflags] & tcp-syn != 0'
滚动抓包,并保存到pcap文件中
bash
tcpdump -w /var/log/capture.pcap -G 3600 -C 100 -W 10
-
-G 3600:时间轮转 。每隔 3600秒(1小时),创建一个新的抓包文件。 -
-C 100:大小轮转 。当单个文件大小达到 100 MB 时,创建一个新的抓包文件。 -
-W 10:最多保留 10个 文件(即capture.pcap0到capture.pcap9)。
导出,并使用wireshark分析
抓取HTTP GET请求
bash
tcpdump -i any -n -A 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'
六、抓包内容说明
