简介:本文深入解析tcpdump工具的使用方法,涵盖基础抓包、过滤规则、协议分析、高级功能及实战案例,帮助开发者高效诊断网络问题。
tcpdump 是 Linux/Unix 环境下最强大的网络抓包工具之一,支持对网络数据包进行实时捕获、过滤和分析。本文从基础语法到高级技巧,系统讲解 tcpdump 的使用方法,涵盖过滤表达式、协议解析、输出格式控制等核心功能,并结合实际场景提供故障排查案例,帮助开发者快速掌握网络诊断能力。
tcpdump 通常预装在大多数 Linux 发行版中,若未安装可通过包管理器安装:
# Debian/Ubuntusudo apt install tcpdump# CentOS/RHELsudo yum install tcpdump
启动抓包的最简命令:
sudo tcpdump -i eth0
参数说明:
-i eth0:指定监听网卡(不指定则默认第一个非环回接口)sudo 执行捕获 10 个数据包后自动停止:
sudo tcpdump -i eth0 -c 10
将抓包结果保存到文件:
sudo tcpdump -i eth0 -w capture.pcap
从文件读取并显示抓包内容:
tcpdump -r capture.pcap
捕获源/目的 IP 为 192.168.1.1 的流量:
tcpdump -i eth0 host 192.168.1.1
仅捕获源 IP 为 192.168.1.1 的流量:
tcpdump -i eth0 src 192.168.1.1
捕获除特定 IP 外的流量:
tcpdump -i eth0 not host 192.168.1.1
捕获 80 端口的 TCP 流量:
tcpdump -i eth0 tcp port 80
捕获 UDP 协议流量:
tcpdump -i eth0 udp
组合过滤条件(捕获 80 端口或 443 端口的流量):
tcpdump -i eth0 'tcp port 80 or tcp port 443'
捕获 192.168.1.0/24 网段的流量:
tcpdump -i eth0 net 192.168.1.0/24
捕获两个网段之间的流量:
tcpdump -i eth0 'src net 192.168.1.0/24 and dst net 10.0.0.0/8'
显示详细的 TCP 标志位(SYN/ACK/FIN 等):
tcpdump -i eth0 'tcp[13] & 0x02 != 0' # 显示 SYN 包tcpdump -i eth0 'tcp[13] & 0x12 != 0' # 显示 SYN-ACK 包
解析 ICMP 协议类型:
tcpdump -i eth0 icmp
以 ASCII 格式显示数据包内容:
tcpdump -i eth0 -A -c 5
以十六进制和 ASCII 混合格式显示:
tcpdump -i eth0 -X -c 5
显示时间戳(精确到微秒):
tcpdump -i eth0 -tttt
捕获 HTTP GET 请求:
tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420)'
捕获 DNS 查询:
tcpdump -i eth0 udp port 53
统计流量分布:
tcpdump -i eth0 -q -c 1000 | awk '{print $3}' | sort | uniq -c | sort -nr
统计各协议占比:
tcpdump -i eth0 -q -c 1000 | awk '{print $NF}' | sort | uniq -c | sort -nr
通过 SSH 在远程服务器抓包并本地显示:
ssh user@remote-server "sudo tcpdump -i eth0 -w -" | tcpdump -r -
tcpdump -i eth0 -s 0 -A -w http_capture.pcap 'tcp port 80'
tcpdump -r http_capture.pcap | grep "HTTP/1.1" | grep "502"
tcpdump -r http_capture.pcap 'tcp[20:2] = 0x4745' | grep "502"
-s 0 捕获完整数据包(默认 96 字节)-c N)避免生成过大文件-C N 按大小轮转文件(如 -C 10 表示每 10MB 轮转)promiscuous 模式(-p 参数关闭混杂模式)
tcpdump -i eth0 -s 0 -w capture.pcap
在 Wireshark 中打开 capture.pcap 进行图形化分析
tcpdump 表达式与 Wireshark 显示过滤器的对应关系:
| tcpdump 表达式 | Wireshark 显示过滤器 |
|———————————|———————————|
| tcp port 80 | tcp.port == 80 |
| host 192.168.1.1 | ip.addr == 192.168.1.1 |
| icmp | icmp |
tcpdump: eth0: You don't have permission to capture on that device
解决方案:
sudo 执行pcap 组:
sudo usermod -aG pcap $USER
tcpdump: eth0: No such device exists
解决方案:
ip link show 确认网卡名称wlan0 或 wlp3s0可能原因:
iptables/nftables 规则)ifconfig eth0 promisc)-i, -c, -w)man tcpdump 手册页tcpdump + Wireshark:快速定位+深度分析tcpdump + tshark:自动化脚本处理tcpdump + Elasticsearch:长期流量监控通过系统掌握 tcpdump 的使用方法,开发者可以高效诊断网络问题、分析协议交互、监控异常流量,成为网络故障排查的专家。