3. 显示过滤器入门:协议过滤、IP过滤、端口过滤的语法
好,咱们进入正题。抓包工具装好了,也抓到一堆数据了。然后呢?
你看着屏幕上密密麻麻的包,是不是有点懵?我刚开始学的时候也是这样。几千个包,根本不知道从哪看起。
这时候,显示过滤器就是你的救星。它不删包,只是帮你把不相关的藏起来。说白了,就是让你只看想看的。
3.1 协议过滤:最常用的三板斧
先讲最简单的。你想看哪种协议,直接打名字就行。
http
dns
arp
icmp
tcp
udp
就这么简单。我在项目里排查网页打不开的问题时,第一件事就是敲个 http,看看有没有请求发出去。
如果你想排除某个协议,加个感叹号就行:
!arp
!icmp
嗯,这里要注意。排除 ARP 包特别有用。因为局域网里 ARP 包太多了,看着心烦。
3.2 IP过滤:盯住你想找的那台机器
协议过滤只是第一步。很多时候,你得盯住某个 IP 地址。比如服务器是 192.168.1.100,你就只想看它的流量。
语法也很直白:
ip.addr == 192.168.1.100
这个 ip.addr 是啥意思?它同时匹配源IP和目标IP。也就是说,不管是这个地址发出去的,还是发给它的,都会显示出来。
如果你只想看它发出的包:
ip.src == 192.168.1.100
只想看发给它的:
ip.dst == 192.168.1.100
我曾经排查过一个故障。内网有一台机器疯狂往外发包,导致整个网段卡死。我当时就用 ip.src == 192.168.1.200 一过滤,好家伙,一秒几千个包往外怼。原来是中了挖矿病毒。
ip.addr = 192.168.1.100,少打了一个等号。Wireshark 里判断相等要用两个等号 ==,一个等号是赋值,语法会报错。记住,两个等号!
3.3 端口过滤:精准定位应用层
IP 地址找到了,但一台机器上跑着好多服务呢。Web 服务、数据库、SSH...你怎么区分?
靠端口。HTTP 默认 80,HTTPS 默认 443,MySQL 默认 3306。
语法和 IP 过滤很像:
tcp.port == 80
udp.port == 53
同样,tcp.port 同时匹配源端口和目标端口。如果你想区分方向:
tcp.srcport == 80
tcp.dstport == 80
举个例子。你想看某台 Web 服务器的 HTTP 流量:
ip.addr == 192.168.1.100 and tcp.port == 80
你看,用 and 把两个条件连起来就行了。这就是组合过滤。
| 过滤目标 | 语法示例 | 说明 |
|---|---|---|
| 只看HTTP | http |
最简单的协议过滤 |
| 只看某个IP | ip.addr == 10.0.0.1 |
双向匹配 |
| 只看某个端口 | tcp.port == 443 |
双向匹配 |
| 排除ARP | !arp |
感叹号表示取反 |
| 组合条件 | ip.src == 10.0.0.1 and tcp.dstport == 80 |
用 and/or 连接 |
3.4 几个我常用的组合拳
光讲语法太干了。我分享几个实战中经常用的组合,你直接拿去用:
-
排查DNS解析问题:
dns or icmpDNS 解析失败时,看看有没有 ICMP 报错。比如 "Destination Unreachable"。
-
看某个IP的TCP连接状态:
ip.addr == 10.0.0.5 and tcp.flags.syn == 1只看 SYN 包,快速判断连接是否建立成功。
-
排除广播和组播:
!broadcast and !multicast这些包太吵了,一般排查时先关掉。
HTTP、http、Http 都行。但协议字段名是区分大小写的,比如 ip.addr 不能写成 IP.Addr。这个坑我踩过。
3.5 快速验证你的过滤器对不对
你写了一个过滤器,怎么知道对不对?
看 Wireshark 界面底部的状态栏。如果过滤器语法正确,背景是绿色的。如果是红色的,说明写错了,检查一下拼写和符号。
另外,过滤器输入框本身也会变色。绿色表示正确,红色表示错误。这个设计很贴心,你想想看,不用等到应用了才知道写错了。
好了,这一节的内容就这些。协议过滤、IP过滤、端口过滤,这三板斧够你应付 80% 的日常场景了。下一节我们聊聊更高级的玩法——字符串匹配和逻辑组合,让你在数据包里大海捞针。