ip.addr 在做什么
ip.addr 是 Wireshark 里最常用的地址字段,匹配网络层任一方向上出现过的地址;ip.src 与 ip.dst 用来限定方向,IPv6 对应 ipv6.addr、ipv6.src、ipv6.dst。它匹配的是报文里实际出现的地址,NAT 或代理前后看到的值不同,所以跨设备分析前要先确认抓包点在链路哪一侧。网段匹配写 CIDR 前缀,例如 ip.addr == 10.0.0.0/24。ARP 与部分隧道外层没有 IPv4 头,用这个字段会整类漏掉。
基本信息
| 双向匹配 | ip.addr == 10.0.0.9 |
|---|---|
| 方向限定 | ip.src == A / ip.dst == B |
| IPv6 | ipv6.addr / ipv6.src / ipv6.dst |
| 集合写法 | ip.addr in {10.0.0.9, 10.0.0.10} |
| 网段写法 | ip.addr == 10.0.0.0/24,不能用 contains |
典型使用场景
- 只看一台客户端与所有服务端的往来:ip.addr == 10.0.0.9
- 只看单向 A 发往 B:ip.src == A && ip.dst == B
- 筛整个业务网段:ip.addr == 10.10.0.0/16
- 排除监控与健康检查来源的噪音:!(ip.addr == 10.0.0.5)
- 双栈环境核对 IPv6 路径:ipv6.addr == 2001:db8::10
常用示例
常用示例
ip.addr == 10.0.0.9 # 与该主机的全部往来
ip.src == 10.0.0.9 && ip.dst == 10.0.0.20 # 只看单向 A 发往 B
ip.addr == 10.0.0.0/24 # 整个网段
ip.addr in {10.0.0.9, 10.0.0.10} # 多台设备一起看
!(ip.addr == 10.0.0.5) # 排除某台主机
ipv6.addr == 2001:db8::10 # IPv6 地址
ip.addr == 10.0.0.9 && tcp.port == 443 # 与端口条件叠加
ip.addr == 172.16.0.0/12 && !dns # 内网流量里排除 DNS 查询方向组合含义
| 表达式 | 含义 | 使用提示 |
|---|---|---|
| ip.addr == A | 源或目的任一为 A | 抓与 A 的全部往来,最保险的起手式 |
| ip.src == A && ip.dst == B | 只有 A 发往 B | 判断请求方向用它;看回包要反写源与目的 |
| ip.addr == 10.0.0.0/24 | 按 CIDR 前缀匹配网段 | 写成 contains 或省略前缀长度都得不到预期结果 |
| ip.addr in {A, B} | 多地址集合匹配 | 多台设备对照时的简写方式 |
| !(ip.addr == A) | 排除该地址 | 否定要连括号一起写,直接写 !ip.addr == A 语义可能相反 |
| ipv6.addr == 2001:db8::10 | IPv6 地址匹配 | 双栈环境里两个地址族都要单独查一遍 |
地址比较是精确相等,不是包含。想按域名筛选,要么先用 nslookup 解析出地址,要么在首选项里启用名称解析,代价是每个地址都会触发一次反查。
否定条件务必写成 !(ip.addr == A)。缺括号时表达式会被解析成对字段本身取反,在大文件上可能返回空结果而不报错,让人误以为没有流量。
典型组合
典型组合
ip.addr == 10.0.0.9 && tcp.port == 443 && tcp.flags.syn == 1 # 该主机的建连请求
ip.src == 10.0.0.9 && tcp.analysis.flags # 它发出的异常包
ip.addr == 10.0.0.0/24 && !dns && !arp # 网段内的业务流量
ip.addr == 10.0.0.9 && http.response.code >= 500 # 它收到的服务端错误与其他字段配合
- 与 tcp.stream 组合可以把一台主机的多条会话拆开逐条看,定位是哪条连接出了问题
- 与 frame.time_relative 组合可切出故障发生的那段时间窗,避免被前后正常流量干扰
- 与 tcp.analysis.flags 组合能立刻看出该主机参与的传输异常,是排障的高频组合
- 与 dns 组合可判断某台主机的解析行为是否异常,例如是否存在大量失败查询
常见场景表达式
| 场景 | 表达式 | 判读要点 |
|---|---|---|
| 某台客户端访问全部服务 | ip.addr == 10.0.0.9 | 先看它都连了哪些目的地址,再逐个深入哪条不通 |
| 两个地址之间的单向流量 | ip.src == A && ip.dst == B | 只看请求方向,回包要用相反的源与目的再看一遍 |
| 只看内网某网段 | ip.addr == 10.10.0.0/16 | 注意排除 DNS 与健康检查才能看清业务流量 |
| 排除已知噪音来源 | !(ip.addr == 10.0.0.5) | 否定必须连括号一起写,否则语义不同 |
| 双栈主机按 IPv6 查 | ipv6.addr == 2001:db8::10 | IPv4 与 IPv6 是两套字段,要分别筛 |
| 查找某地址参与的异常 | ip.addr == A && tcp.analysis.flags | 异常标注是启发式结果,仍需回到序列号确认 |
把一台主机的地址当作分析起点很高效:先统计它参与了哪些会话(Statistics 会话列表),再对可疑的那条叠加 tcp.stream 深入,比逐条翻报文快得多。
地址字段也是拼装复杂条件的基础:先按主机收窄范围,再叠加端口、标志位或协议字段,逐层收窄比一开始就写一长串条件更容易排查表达式本身的问题。