tcpdump抓包核心依赖BPF语法过滤表达式,由原语(如host、port、net)与逻辑运算符(and/or/not)组合构成,需加单引号防shell解析错误,并常配合-nn、-s0、-c、-w等选项提升实用性。

Linux 中用 tcpdump 抓取复杂网络包,核心靠过滤表达式组合。它不是简单拼接,而是基于 BPF(Berkeley Packet Filter)语法,用逻辑运算符连接原语,实现精准预过滤。
常用原语:明确抓什么
原语是表达式的基本单元,代表数据包的某个特征:
- host 192.168.1.100:匹配源或目的 IP 是该地址的包(双向)
- src host 192.168.1.100:仅匹配从该 IP 发出的包
- dst host 192.168.1.100:仅匹配发往该 IP 的包
- port 443:匹配源或目的端口为 443 的 TCP/UDP 包
- src port 53:仅匹配源端口为 53(如 DNS 查询)的包
- net 10.0.0.0/8:匹配目标或源属于该网段的包
- icmp、tcp、udp:按协议类型过滤
逻辑运算符:把条件串起来
用 and、or、not(或 !)连接多个原语,注意空格和引号:
- and:两个条件都必须满足。例如:tcpdump -i eth0 'tcp and port 80 and src host 192.168.1.50' —— 只抓 192.168.1.50 发出的 HTTP 请求
- or:满足任一即可。例如:tcpdump -i eth0 'port 22 or port 80' —— 抓 SSH 或 HTTP 流量
- not 或 !:取反。例如:tcpdump -i eth0 'not port 22' —— 排除所有 SSH 流量
- 组合使用时建议加单引号,避免 shell 解析错误;多层逻辑可用括号分组,如:'(tcp and port 443) or (udp and port 53)'
实用组合示例
真实场景中常见组合方式:
- 只看某台服务器对外发起的 HTTPS 连接:tcpdump -i eth0 -nn 'tcp and src host 10.0.1.20 and dst port 443'
- 抓某客户端与特定服务端之间的全部交互(含响应):tcpdump -i eth0 -nn 'host 192.168.1.100 and host 10.20.30.40'
- 排除内网流量,只关注公网通信:tcpdump -i eth0 'not net 192.168.0.0/16 and not net 10.0.0.0/8'
- 抓 DNS 查询但不包括响应(只看 query):tcpdump -i eth0 'udp and port 53 and (src port 53) = 0'(更可靠写法需结合 udp[10:2] 等偏移判断,但基础组合已覆盖多数需求)
配合选项提升实用性
单独靠表达式还不够,常搭配以下选项:
- -nn:避免 DNS 和端口名解析,输出更快更稳定
- -s 0:捕获完整数据包(默认只截前 68 字节),分析 HTTP 内容或 TLS 握手必须加
- -c N:限制抓包数量,防止刷屏或占满磁盘
- -w file.pcap:保存为 pcap 文件,后续用 Wireshark 深度分析


















