-Q 是干什么的
-Q 让 tcpdump 按方向过滤报文:in 只抓进入本机的包,out 只抓本机发出的包,inout 是默认行为。单机抓包时经常要回答「请求发出去没有」「对端回了没有」这类问题,靠方向过滤能直接把另一侧的噪音去掉,比事后在结果里翻找省事得多。
基本信息
| 适用平台 | Linux / macOS / BSD 上的较新版本 tcpdump |
|---|---|
| 语法 | tcpdump -Q in|out|inout [选项] [过滤表达式] |
| 默认取值 | inout(两个方向都抓) |
| 已知限制 | 抓 any 伪接口时部分版本不生效 |
| 常用搭配 | -nn 不解析名字、-c 限量、-w 落盘 |
典型使用场景
- 确认应用是否真的发出了请求:只看 out 方向有没有对应流量
- 确认对端是否回应:只看 in 方向是否收到响应包
- 区分重传来自哪一侧,避免把本机重传算到对端头上
- 转发设备上分开统计两个方向的包数,核对是否单向丢失
- 现场只关心出向流量时减少无关包的干扰
常用示例
常用示例
tcpdump -i eth0 -nn -Q out -c 10 'tcp port 443' # 只看本机发出的包
tcpdump -i eth0 -nn -Q in -c 10 icmp # 只看进入本机的包
tcpdump -i eth0 -nn -Q out 'tcp[13] & 2 != 0' -c 10 # 只看本机发起的建连
tcpdump -i eth0 -nn -Q in -c 20 'host 10.0.0.9' # 只看该主机发来的流量取值含义与用途
| 取值 | 含义 | 典型用途 |
|---|---|---|
| in | 只抓进入本机的报文 | 验证对端是否真的回应 |
| out | 只抓本机发出的报文 | 验证本机是否真的发出请求 |
| inout | 两个方向都抓(默认) | 常规抓包与离线分析 |
| (any 接口) | 部分版本会忽略该选项 | 换具体网卡名称再验证 |
-Q 按本机视角判定方向,转发流量会在两个方向各出现一次,做计数时先想清楚要不要去重。
使用 any 伪接口时,内核记录的方向信息可能缺失,选项会被静默忽略,抓几行输出确认后再依赖它。
补充要点
- 抓包前先明确要回答的问题:是本机没发出去,还是对端没有回过来
- 把 -Q 与 -c 搭配使用,避免在高速链路上无意中抓下海量报文
- 转发场景做方向统计时两个方向分别计数,才能看出是否单向丢失
- 一台机器多张网卡时指定网卡名称,比用 any 伪接口更可靠
链路聚合与多路径环境下同一会话的报文可能分散在不同网卡,用 any 抓包再按方向切分更稳妥。