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 再逐步收窄是很有效的排查节奏:第一步确认这台机器的流量是否出现在抓包点上,出现之后再叠加端口与标志位条件,每一次都只改一个变量,结论才可复现。
同一个地址在不同抓包点上语义不同:在客户端出口抓到的是原始源地址,在服务端入口抓到的可能已经过地址转换,把两台机器的结果放在一起比较之前要先确认这一点。