Wireshark过滤器详解:从入门到精通的完整指南
Wireshark过滤器详解:从入门到精通的完整指南
Wireshark过滤器是数据包分析的核心功能之一,掌握其使用方法对于网络工程师和安全分析师至关重要。本文将从过滤器的基本概念、原理、分类,到具体的使用方法和高级技巧,为您详细讲解Wireshark过滤器的方方面面。
前言
年底工作繁忙,终于抽出时间来更新这篇关于Wireshark过滤器的重要内容。Wireshark过滤器是工具使用的核心之一,掌握它能让你在数据包分析中事半功倍。本文将从过滤器介绍(概念、原理、分类)、过滤语句编写(基础语法)、过滤器使用举例(实践)到高级过滤技巧(提升)四个方面,帮助你全面掌握Wireshark过滤技术。
一、了解Wireshark过滤器概念、原理及分类
首先来看看Wireshark是如何捕获到数据包的:
- 如果是在网络拓扑中间的网元设备上抓包,为了不影响生产环境,我们一般是在交换机上做端口镜像,复制一份流量到分析主机的网卡;
- 如果是在网络终端设备上抓包(终端设备直接安装Wireshark),则无需做镜像,直接选择网卡进行抓包即可(网卡需设置为混杂模式);
- 在安装Wireshark时,需要安装npcap(winpcap)或Linux系统的libpcap。这是一个抓包工具(或者说是抓包驱动、数据包分析库),它真正负责抓包,然后再把包给到Wireshark来进行分析;
- 当网络流量特别大时,分析主机可能无法承受。这时,我们就只能选择性放弃一些不关注的数据包,只抓需要的数据包,来减小流量过大给分析主机带来的负担。这时,我们就要对流量进行“过滤”处理,即“捕获过滤”。
Wireshark的过滤器分为两种:捕获过滤器和显示过滤器。
捕获过滤器是在流量大的场景下使用,直接用BPF(Berkley Packet Filter)进行过滤,语法相对简单直接,但不能满足复杂的过滤场景。显示过滤器则能满足各种复杂的过滤需求,分析师可以根据各种不同的分析场景对已捕获的数据包进行筛选。
特别需要说明的是:Wireshark的捕获过滤器和显示过滤器使用的是2套不同的语法。捕获过滤器使用BPF语法,显示过滤器则使用Wireshark自主开发的一套更加复杂、灵活的过滤语法。
国产的科来过滤器有三种:分析(就是捕获)、显示和存储过滤器,都是用的同一套语法。科来过滤器功能不如Wireshark强大,但有些过滤条件设置更简单,还可以针对端点、会话和日志等进行过滤。
二、过滤语句编写
(一)捕获过滤器
捕获过滤器的位置:在Wireshark打开时,选择网卡的上方,可以输入捕获过滤条件。捕获过滤器语法规则如下:
捕获过滤的应用场景不多,不用过于浪费时间。Wireshark不是企业级的产品,一般是临时分析故障等才使用,不要想着用一台服务器直接安装Wireshark,部署到园区网或数据中心的固定位置去进行监控,这是一种得不偿失的选择。如果真有需要长期监控,请考虑企业级的流量分析解决方案。
(二)显示过滤器
显示过滤器的位置:分析主界面的最上方。点击前面蓝色的图标,可以选择Wireshark集成好的一些显示过滤语句:
显示过滤语法规则:
显示过滤器可以这样写:
- ip.addr == 192.168.0.1
- ip.len le 1500
比较运算符:
- ==
- le
逻辑运算符:
- and
- or
- not
显示过滤器的背景颜色:当输入的过滤条件错误(或不完整)时,背景色为红色;当输入的过滤条件正确时,背景色变味绿色!
还有更简单的过滤条件生成办法:
- 在Wireshark的数据包分析视图中,选中某个数据包的某一个指标,点击鼠标右键,右键菜单中有“作为过滤器应用”和“准备作为过滤器”;
- 在数据包的字段解码视图中,选中具体的一个字段点右键,可以直接生成针对某个字段的过滤语句;
- 点击显示过滤器右侧的加号,对过滤条件进行命名,下一次就可以直接选择调用了。
三、过滤器使用举例
(1)mac地址的过滤表达式写法
用“:”,“-”,“.”做分隔符号都行。
(2)IPv4过滤表达式写法
支持无类域间路由CIDR,直接过滤网段。
(3)IPv6过滤表达式写法
和IPv4类似。
(4)过滤字符串
字符串需要用双引号扩起来,可以使用lower()取小写字母这种函数匹配ASCii码的文本。可以用转义字符\x和\d表示16进制和十进制(匹配数据包原始数据)。
可以用“contains”做精确的字符串匹配;可以用“matches”做字符串模糊匹配,并且matches支持用正则输入过滤条件。
(5)时间过滤
时间格式如上图例所示,照着写就行了。
四、高级过滤技巧
(1)切片操作符
用[ ]进行切片操作,第一个数字代表从这个字段开始位置的偏移值(可以取负数,代表从末尾开始倒着数偏移值),第二个数字代表要取的字节数。
(2)“层”操作符
简单说,就是如果一个数据包(比如VPN),有2层2IP包头,在过滤IP地址的时候默认以第一层为准,那我们需要过滤内层的IP地址信息呢?答案就是添加“层”操作符,如下:
ip.addr#2 == 192.168.30.40
(3)成员操作符
成员很好理解,比如我要过滤端口80、443和8080,如果按之前的讲解,过滤表达式应该写为:
tcp.port == 80 || tcp.port == 443 || tcp.port == 8080
用成员操作符,可以这样写:
tcp.port in {80, 443, 8080}
(4)运算符号
没啥多说的,就是注意使用“-”减号时,必须在被减数和减号中间有个空格,否则会报错。
(5)函数
找出http.server字段为“apache”的数据包:
lower(http.server) contains "apache";
过滤出http请求中uri长度大于100的请求包:
len(http.request.uri) > 100;
将含有超过2个IP的数据包过滤出来:
count(ip.addr) > 2;
把帧号匹配13579的过滤出来:
string(frame.number) matches "[13579]$"
把目的IP在172.16.X.X-172.31.X.X范围中,且以255结尾的IP包过滤出来:
string(ip.dst) matches r"^172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.255"
将tcp的源端口及目的端口都不大于1024的包过滤出来:
max(tcp.srcport, tcp.dstport) <= 1024
(6)字段引用
可以在表达式中直接引用一个字段的值。
(7)字段名改变
有的协议名或字段名进行了更新,以新的名字还是旧的名字为标准,要以wireshark版本更新为标准。
(8)协议名不明确的
如果协议名和字段取值都为"fc",则它会优先按协议名进行识别过滤。如果想把字段中“fc”过虑出来,请用分片的方式过滤,如:
frame[10:] contains .fc or frame[10] == :fc
总结
本文详细介绍了Wireshark过滤器的使用方法和高级技巧,希望能帮助你掌握这一重要功能。临近年底,大家都在冲绩效,行内工作也是忙得不行,下次更新不知道是什么时候了,大家且看且珍惜!如果觉得本文对你有用,不要忘了收藏点赞!