tcpdump 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
tcpdump——网络基础命令族(见网络基础与远程访问命令族)。当"ping 通、端口也开、但业务就是不对"时,抓包看实际流量是终极手段。
tcpdump 捕获网卡上的数据包并按表达式过滤、打印或存盘。它是命令行下最强大的抓包工具,复杂场景常抓下来再用 Wireshark 图形分析。
一、基本用法
bash
tcpdump -i eth0 # -i 指定网卡(any 抓所有)
tcpdump -i any port 80 # 只抓 80 端口
tcpdump -i any host 10.0.0.5 # 只抓和某主机相关的包
tcpdump -i any -n # -n 不解析主机名/端口名,输出更快更纯
tcpdump -i any -nn port 443 # -nn 连端口号也不解析成服务名默认抓包很多且慢(会做反向 DNS 解析),调试时必加
-n/-nn关掉解析。-i any抓所有接口最省事;只关心某端口/某主机时用表达式缩小范围,否则输出刷屏。
二、保存与读取(配合 Wireshark)
bash
tcpdump -i any -w capture.pcap port 3306 # -w 存成 pcap 文件
tcpdump -r capture.pcap # -r 读回文件分析
-w把原始包存成 pcap,之后可以拉到本地用 Wireshark 深度解析(图形界面看 TLS、HTTP/2 等更方便)。服务器端通常只负责抓,分析在桌面端做。
三、常用过滤表达式
bash
tcpdump -i any 'tcp[tcpflags] & tcp-syn != 0' # 只看 SYN 包(看连接建立)
tcpdump -i any 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' # 只看带 payload 的 HTTP
tcpdump -i any 'icmp' # 只看 ICMP(配合 ping 排障)表达式语法较强:
host/port/net是基础,and/or/not组合,tcp[...]能做字节级匹配。日常够用的是"端口 + 主机 + 协议"组合,复杂字节匹配可查手册或存成别名。
四、踩坑:需要权限与性能
bash
# tcpdump 需要 root(或 CAP_NET_RAW 能力),普通用户直接跑会报权限不足
sudo tcpdump -i any port 80
# 高流量网卡抓全量包可能丢包/拖慢系统,务必加过滤、限制数量
tcpdump -i any -c 100 port 80 # -c 抓满 100 个包就停两个现实坑:① 要 root,否则起不来;② 在繁忙网卡上无过滤抓包会丢包甚至影响性能。线上排障务必加
port/host过滤,或用-c限个数、-G限时、-W限文件数,避免把生产机拖垮。
五、实战:抓某服务的握手包
bash
sudo tcpdump -i any -nn -c 200 'tcp port 6379' -w redis.pcap # 抓 200 个 Redis 包存盘分析一句话总结
tcpdump = 命令行抓包终极手段:-i 选网卡、-n/-nn 关解析、-w 存 pcap 供 [Wireshark] 分析、-c 限包数;表达式按 host/port/协议过滤。注意需 root、高流量下务必加过滤否则丢包拖慢系统。配合 ping/mtr 分层排障。