首页/网络/抓包与流量分析速查/tcpdump -Q 按方向抓包

tcpdump -Q 按方向抓包

按流量方向过滤:in 只抓进入本机的包,out 只抓本机发出的包,inout 两者都抓。区分请求与响应、确认重传来自哪一侧时很有用。

-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 抓包再按方向切分更稳妥。

易错点

  • 在 any 接口上用 -Q 却未验证:老版本会静默忽略该选项,误以为过滤已生效
  • 只看 out 方向就断言对端没回应:回包属于 in 方向,单方向过滤必然看不到证据
  • 把转发流量的两个方向都算成本机收发,导致包数翻倍、结论失真

数据来源与参考

  • man 8 tcpdump(-Q 选项)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌