tcpdump 必须用 sudo 运行,否则静默失败;安装需匹配发行版包管理器(apt/yum/dnf/apk),装后验证 version;抓包须指定网卡(推荐 -i lo 或 -i eth0 而非 -i any);过滤表达式必须用单引号包裹;保存用 -w 写 pcap 文件便于后续分析。

tcpdump 必须用 sudo 运行,否则会报错 socket: Operation not permitted 或直接无输出——这不是安装问题,而是权限缺失导致的静默失败。
安装 tcpdump 前先确认系统包管理器类型
不同发行版命令不兼容,硬套 apt 到 CentOS 会失败,反之亦然:
- Ubuntu/Debian 系:运行
sudo apt install tcpdump - CentOS/RHEL 7/8:用
sudo yum install tcpdump;RHEL 9+ 或 Fedora 改用sudo dnf install tcpdump - Alpine Linux(常见于容器):执行
apk add tcpdump
装完立刻验证:tcpdump --version。若提示 command not found,说明安装未成功或 PATH 未刷新,不要跳过这步。
抓包前必须指定网卡,-i any 在某些内核版本下不可靠
-i any 看似方便,但可能漏掉 loopback 流量(如 curl http://localhost),或在多网卡机器上捕获到无关接口的噪声。更稳妥的做法是:
- 先查可用接口:
sudo tcpdump -D,输出类似1.eth0、2.lo、3.docker0 - 抓本机服务通信(如本地 API 调用):明确用
sudo tcpdump -i lo port 8080 - 抓外部请求:选物理网卡,如
sudo tcpdump -i eth0 port 443
不指定 -i 时,tcpdump 默认选第一个非 loopback 接口,行为不可控,线上排查时不建议依赖默认值。
过滤表达式里空格和引号容易出错
像 tcpdump tcp and host 192.168.1.100 and port 80 这类命令,在 shell 中若没加引号,and 可能被当成 shell 逻辑操作符,导致语法错误或过滤失效。正确写法是:
- 用单引号包裹整个表达式:
sudo tcpdump 'tcp and host 192.168.1.100 and port 80' - 避免混用大小写:
TCP和tcp都可,但host必须小写,大写会报unknown filter keyword - 组合条件优先用
and/or,不用&&或||——那是 shell 语法,不是 BPF 过滤语法
常见错误现象:tcpdump: syntax error,八成是引号漏了或关键字拼错。
保存抓包文件供后续分析,别只盯着实时输出
实时滚动输出难以回溯,尤其排查偶发问题时。用 -w 直接写二进制 pcap 文件,之后可用 wireshark 或 tshark 深度分析:
- 保存 100 个包:
sudo tcpdump -c 100 -w capture.pcap port 3306 - 限制单文件大小并轮转(防磁盘打满):
sudo tcpdump -G 300 -w 'capture-%Y-%m-%d_%H:%M:%S.pcap' port 22(每 5 分钟新建一个文件) - 读取时加
-r:tcpdump -r capture.pcap -nn -A(-A显示 ASCII 内容,适合看 HTTP)
注意:-w 不输出到终端,也不受 -v 或 -X 影响;想边存边看,得另起一个终端跑实时命令。
真正难的不是记参数,而是理解每个过滤条件对应的链路层/网络层/传输层行为。比如 src port 53 抓的是 DNS 查询响应端口,而 dst port 53 才是客户端发出去的请求——方向搞反,就永远看不到你要的包。











