首页/网络/抓包与流量分析速查/tcpdump host 主机过滤

tcpdump host 主机过滤

按主机过滤:host 匹配双向,src host / dst host 限定方向;主机可以是 IP 或可解析的域名(建议直接用 IP 配 -n)。

host 在做什么

host 是 BPF 里最常用的原语之一,匹配地址字段,默认双向:只要报文里源地址或目的地址是它就算命中。加 src host 或 dst host 可以限定单向。值可以直接写 IP,也可以写主机名,但主机名会触发解析,内网 DNS 不可用时可能解析失败或得到错误地址,排障时统一写 IP。IPv6 地址同样用 host 匹配,也可以用 ip6 host 明确限定地址族,避免与 IPv4 结果混在一起。

基本信息

双向匹配host 10.0.0.9
单向匹配src host 10.0.0.9 / dst host 10.0.0.9
地址族限定ip host / ip6 host 或 ip proto 组合
等价写法host A 等于 src host A or dst host A
值的形式推荐点分十进制 IP;写域名会触发解析

典型使用场景

  • 定位一台客户端的全部往来流量,作为分析起点
  • 只看单向请求:src host 加目的端口组合,确认请求是否发出
  • 看某台服务被哪些客户端访问:dst host 加服务端口
  • 排除已知的监控或探测来源:not host 10.0.0.5
  • 抓两台设备之间的对话:host A and host B
  • 按网段内某台主机的地址核对策略:与 dst net 一起使用

常用示例

常用示例
tcpdump -i eth0 -nn host 10.0.0.9                            # 双向,先摸底
tcpdump -i eth0 -nn 'src host 10.0.0.9 and dst port 3306'    # 只看它发往数据库的请求
tcpdump -i eth0 -nn 'dst host 10.0.0.9 and tcp port 443'     # 看谁在访问它
tcpdump -i eth0 -nn 'host 10.0.0.9 and host 10.0.0.10'       # 两台之间
tcpdump -i eth0 -nn 'not host 10.0.0.5'                      # 排除探测主机
tcpdump -i eth0 -nn 'host 10.0.0.9 or host 10.0.0.10'        # 多台一起看

方向写法与含义

写法匹配范围典型用途
host 10.0.0.9源或目的任一为该地址第一轮摸底,掌握这台机器的全部流量
src host 10.0.0.9只有源地址匹配确认请求是否真的发出去了
dst host 10.0.0.9只有目的地址匹配看有哪些客户端在访问它
host A and host B两台设备之间的双向流量分析两点之间的通信是否成对完整
not host 10.0.0.9排除该地址相关的报文去掉已知噪音,让视图聚焦业务
host A or host B任一地址命中多台设备并行观察
host 是双向匹配,这既是它方便的原因,也是误用的主要来源:以为在看「某台机器发出的包」,实际连它的回包都在结果里。需要单向时明确加 src 或 dst。
表达式里写域名会触发解析,抓包机上没有可用 DNS 时会等待反查超时,高流量下直接造成丢包。过滤条件一律写 IP,需要名字时另外查。

与其他原语组合

与其他原语组合
tcpdump -i eth0 -nn 'host 10.0.0.9 and dst net 172.16.0.0/12'      # 它访问某个网段
tcpdump -i eth0 -nn 'host 10.0.0.9 and tcp[tcpflags] & tcp-rst != 0' # 它与谁发生了重置
tcpdump -i eth0 -nn 'src host 10.0.0.9 and not port 22'            # 排除管理流量
tcpdump -nn -r a.pcap 'host 10.0.0.9 and port 443' | wc -l         # 离线统计条数

判读要点

  • 双栈主机同时具备 IPv4 与 IPv6 地址,只写其中一个会漏掉另一半流量
  • 带虚拟地址或漂移地址的网关要按实际会话两端的地址分别过滤
  • 多网卡主机上不同业务绑定不同地址,按业务地址过滤比按主机名更准
  • 抓包点在三层设备之后时 MAC 会被改写但地址不变,host 依然有效
  • 经过地址转换后源地址可能已被改写,看到的地址未必是原始客户端
  • 一台机器在多个网段都有地址时,按业务网段地址过滤才能得到干净结果
先看 host 再逐步收窄是很有效的排查节奏:第一步确认这台机器的流量是否出现在抓包点上,出现之后再叠加端口与标志位条件,每一次都只改一个变量,结论才可复现。
同一个地址在不同抓包点上语义不同:在客户端出口抓到的是原始源地址,在服务端入口抓到的可能已经过地址转换,把两台机器的结果放在一起比较之前要先确认这一点。

易错点

  • 把 host 当成单向条件使用,结果里混进回包,统计请求量时会偏大
  • 过滤条件里写域名会触发解析,无 DNS 时等待超时导致丢包与输出异常
  • 多网卡或双栈主机只按一个地址过滤会漏流量,先列清该主机的全部地址
  • 带虚拟地址的网关要按会话实际地址分别过滤,否则会漏掉其中一侧
  • 经过地址转换后源地址已改写,用抓包结果反推客户端地址会得到错误结论

数据来源与参考

  • man 8 pcap-filter(host 原语)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌