tcpdump 是 linux/unix 下轻量级命令行抓包工具,支持网卡指定、包数限制、pcap 读写、协议/端口/ip 过滤及高级 bpf 表达式,适用于快速定位网络问题。

tcpdump 是 Linux/Unix 系统中最经典、最轻量的命令行抓包工具,无需图形界面,直接在终端中捕获和分析网络流量。掌握它的基础语法和过滤表达式,能快速定位连接异常、端口不通、DNS 解析失败、HTTP 请求卡顿等常见问题。
基础语法:从指定网卡抓包开始
最简命令是 tcpdump -i eth0,其中 -i 指定监听网卡(可用 ip link 或 ifconfig 查看)。不加任何参数会持续抓包直到手动中断(Ctrl+C),输出为原始协议摘要,含时间、源/目的 IP 和端口、协议类型、包长度等。
常用基础选项:
- -c N:只抓 N 个包后自动退出,适合批量测试
- -w file.pcap:将原始数据保存为 pcap 文件,供 Wireshark 后续分析
- -r file.pcap:读取本地 pcap 文件并解析显示
- -nn:禁用主机名和服务名解析(避免 DNS 查询延迟,显示纯 IP 和端口号)
- -v / -vv / -vvv:逐级增加详细程度,如显示 TTL、TCP 标志位、IP 分片信息等
按协议和端口过滤:精准定位目标流量
过滤表达式写在命令末尾,tcpdump 默认使用 Berkeley Packet Filter(BPF)语法,大小写敏感,支持逻辑组合。
典型场景示例:
- 只看 HTTP 流量:tcpdump -i eth0 port 80
- 排除某个端口(如跳过 SSH):tcpdump -i eth0 not port 22
- 抓 HTTPS + DNS:tcpdump -i eth0 port 443 or port 53
- 只抓 TCP 协议:tcpdump -i eth0 tcp(同理可换为 udp、icmp)
- 限制协议层:tcpdump -i eth0 ip6 抓 IPv6,tcpdump -i eth0 arp 抓地址解析过程
按 IP 和主机名过滤:聚焦特定通信双方
定位某台服务器或客户端的交互行为时,IP 过滤最直接。注意:host、net、src、dst 可组合使用。
- 抓与某 IP 的所有往来:tcpdump -i eth0 host 192.168.1.100
- 只抓发往该 IP 的包(不包括返回):tcpdump -i eth0 dst host 192.168.1.100
- 只抓来自该网段的流量:tcpdump -i eth0 src net 10.0.0.0/8
- 结合端口和方向:tcpdump -i eth0 src host 172.16.0.5 and dst port 3306(查某客户端连 MySQL)
- 支持域名(需解析成 IP,且仅首次解析):tcpdump -i eth0 host www.example.com
高级组合与实用技巧:提升排查效率
真实环境中常需多条件叠加,注意括号转义(shell 中需用反斜杠 \ 或单引号包裹整个表达式)。
- 抓非 ACK 的 TCP 包(常用于发现 SYN/FIN/RST):tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0'
- 抓大于 1000 字节的大包(排查 MTU 或分片问题):tcpdump -i eth0 'greater 1000'
- 同时排除广播、组播和本地回环:tcpdump -i eth0 'not broadcast and not multicast and not host 127.0.0.1'
- 实时过滤并高亮关键字(配合 less 或 grep):tcpdump -i eth0 -nn -A port 80 | grep -i "404\|POST\|User-Agent"
- 抓包同时记录时间戳到文件:tcpdump -i eth0 -nn -tttt port 53 -w dns.log(-tttt 输出完整日期时间)
tcpdump 不依赖 GUI,资源占用低,是服务器环境网络排障的第一选择。熟练使用过滤表达式,能把海量流量压缩到关键几条,大幅缩短定位时间。实际使用中建议先用简单条件验证抓包范围,再逐步叠加逻辑,避免表达式出错导致无数据输出。










