注:该文档从tcpdump的主页上获得,在www.tcpdump.org能够找到它的原始版本。
Wpcap过滤器基于已公开的断言语法。一个过滤器是一串包括过滤表达式的ASCII字符串。Pcap_compile()接受表达式并利用一个程序将之转化为核心层的包过滤器。
表达式选择将要接受的数据包。若未给出表达式,网络上的所有数据包将被核心层的过滤驱动所接受。否则,只有满足表达式为”ture”的数据包会被接受。
表达式可以包括一个或多个原子式。原子式通常由一个带前置限定词的id(名称或数字)所组成。有三种不同的前置限定词:
Type限定词指定名称或数字所指向的类别。可能的类别有host、net和port。例如:’host foo’、’net128.3’、’port20’。若未指定类别限定词,默认为host。
Dir限定词指定一个到和/或从id的特定的传输方向。可能的方向有src、dst、src or dst和src and dst。例如:’src foo’、’dst net128.3’、’src or dst port ftp-data’。若没有该限定词,默认为src or dst。对于’null’链路层(例如像slip这种点对点的协议)inbound和outbound这两上限定词能够指定想要的方向。
Proto限定词限定一个特殊的协议。可能的协议有:ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp和udp。例如:’ether src foo’、’arp net128.3’、’tcp port21’。若没有协议限定词,则默认为所有与类别相一致的协议。例如:’src foo’的意思是’(ip or arp or rarp) src foo’(除非后面的语法不合法),’net bar’的意思是’(ip or arp or rarp) net bar’,’port53’的意思’(tcp or udp) port53’。
[‘fddi’实际上是’ether’的一个别名;解析器将它们的意思处理为“在指定网络接口下使用数据链路层。”FDDI首部包括类以太网的源和目的地址,并且通常包括类以太网的包类型,因此你能够像对以太网一样在这些部分对FDDI进行过滤。FDDI首部还包括其他部分,但你无法在过滤表达式中精确命名它们。
类似的,’tr’是’ether’的一个别名;之前对FDDI首部的解释也适用于令牌环网的首部。]
做为对以上的补充,还有一些特殊的‘原子式’的关键字并不遵循这种模式:gateway、broadcast、less、greater和算术表达式。所有这些将在后面讲到。
更复杂的过滤表达式由and、or和not将原子式组合而成。例如:’host foo and not port ftp and not port ftp-data’。简略起见,样同的限定试列表可以省略。例如:’tcp dst port ftp or ftp-data or domain’与’tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain'完全一样。
合法的原子式有:
dst hosthost
如果IPv4/v6数据包的目的地址是host则表达式值为true,host可以是IP地址或主机名。
src hosthost
如果IPv4/v6数据包的源地址是host则表达式值为true。
hosthost
如果IPv4/v6数据包的源或目的地址是host则表达式值为true。以上的任一主机表达式都能够用关键字如ip、arp、rarp或ip6预先指定,就像以下所示:
Ip hosthost
等价于:
Ether proto/ipand hosthost
如果host是多个IP地址,每个地址都会被做匹配检查。
ether dstehost
若以太网目的地址是ehost则值为true。ehost可以是/etc/ethers中的一个名称或一个数字(请见ethers(3N)的数字格式)。
ether srcehost
若以太网源地址是ehost则值为true。
ether hostehost
若以太网源或目的地址是ehost则值为true。
gatewayhost
若数据包以host为网关则值为true。例如:以太网的源或目的地址是host但无论是IP地址的源还是目的地址都不是host。Host必须是一个名称并且能够在机器的host-name-to-IP-address机制(如主机名文件、DNS、NIS)和host-name-to-Ethernet-address机制(如/ect/ethers)中找到。(一个等价的表达式是:
ether hostehostand not hosthost
它能够使用名称或数字表示host / ehost。)目前来说,这种语法无法在能够运行IPv6的结构下工作。
dst netnet
若IPv4/v6的目的地址的网络号是net,则值为true。Net可以是/etc/networks中的一个名称或是一个网络号(详细内容请见networks(4))。
src netnet
若IPv4/v6的源地址的网络号是net,则值为true。
netnet
若IPv4/v6的源地址或目的地址的网络号是net,则值为true。
netnetmasknetmask
若IP地址根据指定的子网掩码netmask能与net匹配。可以用限定词src或dst限定。注意:这个语法在IPv6中是不合法的。
netnet/len
若IPv4/v6地址根据指定的子网掩码长度能与net匹配。可以用限定词src或dst限定。
dst portport
若数据包是ip/tcp、ip/udp、ip6/tcp或ip6/udp并且目的端口为port,则值为true。端口可以是一个数字或一个在/etc/services(详见tcp(4P)和udp(4P))中的名称。若使用名称,则端口和协议都将被指定。若使用数字或不明确的名称,则只有端口地址被指定(例如:dst port 513将显示tcp/login和udp/who的数据流,port domain将显示tcp/domain和udp/domain的数据流)。
src portport
若数据包的源端口的值是port,则值为true。
portport
若数据包的源或目的端口地址的值是port,则值为true。以上所有关于端口的表达式都可以用关键字,tcp或udp,预先指定,如:
tcp src portport
仅当tcp的数据包的源端口地址为port的时才匹配。
lesslength
若数据包的长度小于等于length,则值为true。这相当于:
len<=length。
greaterlength
若数据包的长度大于等于length,则值为true。这相当于:
len>=length。
ip protoprotocol
若数据包是协议类型为protocol的IP数据包(详见ip(4P))。Protocol可以是一个数字或一个名称:icmp、icmp6、igmp、igrp、pim、ah、esp、vrrp、udp或tcp。注意标识符tcp、udp、和icmp同时又是关键字并且必需经过反斜线(/)过滤(在C-shell中是//)。注意这个原子式不对协议首部进行分析。(这段话理解不太清楚,原文如下:Note that the identifierstcp,udp, andicmpare also keywords and must be escaped via backslash (/), which is // in the C-shell. Note that this primitive does not chase the protocol header chain.)
ip6 protoprotocol
若数据包是协议类型为protocol的IPv6数据包。注意这个原子式不对协议首部进行分析。
ip6 protochainprotocol
若数据包是IPv6数据包,并且在它的协议首部串中包括类型为protocol的协议首部,则值为ture。例如:
ip6 protochain 6
与任何在协议首部串中包括TCP协议首部的IPv6数据包匹配。数据包可能包括,例如:在IPv6首部和TCP首部之间包括authentication首部,routing首部或hop-by-hop option首部。由该原子式发送的BPF编码是很复杂的并且在tcpdump中不能被BPF编码优化器所优化,因此它可能有点慢。
ip protochainprotocol
等价于ip6 protochainprotocol,但是它用于IPv4。
ether broadcast
若数据包是以太网广播数据包,则值为true。关键字ether是可选的。
ip broadcast
若数据包是IP广播数据包,则值为true。它会检察所有全一和全零的广播协定并查寻本地子网掩码。
ether multicast
若数据包是以太网多播数据包,则值为true。Ether关键字是可选的。这是‘ether[0] & 1 != 0’的简写。
ip multicast
若数据包是IP多播数据包,则值为true。
ip6 multicast
若数据包是IPv6多播数据包,则值为true。
ether protoprotocol
若数据包是protocol类型的以太协议,则值为true。Protocol可以是一个数字或以下中的一个名称:ip、ip6、arp、rarp、atalk、decnet、sca、lat、mopdl、moprc、iso、stp、ipx或netbeui。注意这些标识符同时也是关键字并且必须用反斜线(/)过滤。
[在FDDI(如‘fddi protocol arp’)和令牌环(如‘tr protocol arp’)的例子中,对于大多数的协议来说,协议证明来自802.2的逻辑链接控制(LLC)首部,LLC通常在首部分层中处于FDDI或令牌环的顶层。
当过滤FDDI或令牌环网络的大部分协议时,对于压缩以太网tcpdump只检查在所谓的SNAP格式的组织单元标识符(OUI)值为0x000000的LLC首部的协议的ID字段;它并不检查数据包是否在SNAP格式下拥有OUI值为0x000000。例外的是iso,它检查的是LLC首部的DSAP(Destination Service Access Point)和SSAP(Source Service Access Point)字段;stp和netbeui检查LLC首部的DSAP;还有atalk检查拥有OUI为0x080007的SNAP格式数据包和Appletalk etype(这个怎么译)。
在以太网的例子中,tcpdump检查大部分协议的以太网类型字段;例外的是iso、sap和netbeui,对于这些它检查802.3的帧,然后像它对FDDI和令牌环网做的那样检查LLC首部;atalk,它检查以太网帧中的Appletalk etype并且同时像在FDDI和令牌环网中那样检查SNAP格式的数据包;aarp,它在以太网帧或OUI值为0x000000的802.2 SNAP帧中检查Appletalk ARP etype;还有ipx,它检查以太网帧中的IPX etype,LLC首部的IPX DSAP,没有LLC首部封装的802.3的IPX和SNAP帧中的IPX etype。]
decnet srchost
若DECNET的源地址是host,则值为true,它可能是一个格式为‘10.123’的地址或一个DECNET的主机名称。[DECNET主机名称支持只有在配置成运行DECNET的Ultrix系统中可用。]
decnet dsthost
若DECNET目的地址为host,则值为true。
decnet hosthost
若DECNET的源或目的地址为host,则值为true。
ip、ip6、arp、rarp、atalk、decnet、iso、stp、ipx、netbeui
缩写为:
ether protop
P是以上协议中的一个。
lat、moprc、mopdl
缩写为:
ether protop
p是以上协议中的一个。注意tcpdump目前还不知道如何解析这些协议。
vlan[vlan_id]
若数据包是IEEE 802.1Q VLAN数据包,则值为true。若[vlan_id]被指定,则仅当数据包为指定的vlan_id,值才为true。注意在表达式中遇到的第一个关键字vlan在假设数据包为VLAN数据包的前提下改变了剩下的表达式的解码偏移量。
tcp、udp、icmp
缩写为:
ip protopor io6 protop
p是以上协议中的一个。
iso protoprotocol
若数据包是协议类型为protocol的OSI数据包,则值为true。Protocol可以是一个数字或以下名称中的一个:clnp、esis或isis。
clnp、esis、isis
缩写为:
iso protop
p是以上协议中的一个。注意tcpdump在解析这些协议时所做的工作并不完全。
expr relop expr
若关系式如下:relop是>、<、>=、<=、=、!=中的一个,并且expr是一个由正整常数(用标准C的语法表达)、标准二进制操作[+、-、*、/、&、| ]和指定数据包存取,则值为true。要存取数据包内的数据,可以使用以下的语法:
proto[expr : size]
proto是ether、fddi、tr、ip、arp、rarp、tcp、udp、icmp或ip6同的一个,并且用索引操场作指定协议层。注意tcp、udp和其他上层协议类型仅应用于IPv4,而不能应用于IPv6(这在将来将会改进)。相对于指定的协议层,字节偏移量是由expr给出。Size是可选的,它指定感兴趣的字段的字节数;它可以是1、2或4,默认为1。由len指定的长度操作会给出数据包的长度。
例如:‘ether[0] & 1 != 0’捕获所有多播的数据流。表达式‘ip[0] & 0xf != 5’捕获所有选中的IP数据包。表达式‘ip[6:2] & 0x1fff = 0’仅捕获不分片的数据和分片数据的第0片数据。这些检查将暗中的应用于tcp和udp的索引操作。例如:tcp[0]总是意味着TCP首部的第一个字节,而决不会意味着一个中间片段的第一个字节。
某些偏移量和字段值可能是用名称来表达而不是数值。以下的协议首部字段偏移量可用:icmptype(ICMP类型字段)、icmpcode(ICMP代码字段)和tcpflags(TCP标识字段)。
以下的ICMP类型字段值可用:icmp-echoreply、icmp-unreach、icmp-sourcequench、icmp-redirect、icmp-echo、icmp-routeradvert、icmp-routersolicit、icmp-timxceed、icmp-paramprob、icmp-tstamp、icmp-tstampreply、icmp-ireq、icmp-ireqreply、icmp-maskreq、icmp-maskreply。
以下的TCP标识字段值可用:tcp-fin、tcp-syn、tcp-rst、tcp-push、tcp-push、tcp-ack、tcp-urg。
原子式可以使用以下操作进行组合:
一个加上括号的原子式和操作的组(圆括号专用于Shell因此必须过滤掉)。
否(‘!’或‘not’)。
与(‘&&’或‘and’)。
或(‘||’或‘or’)。
否具有最高的优先级。与和或具有相同的优先级且是左连接的。注意外在的and记号不是并列的,而是要求串联的。
如果一个标识符给出时没有关联关键字,则假设为最近使用过的关键字。例如:
not host vs and ace
是以下表达式的简写:
not host vs and host ace
不要与以下的表达式混淆了:
not ( host vs or ace )
表达式参数可以以单个参数的形式也可以以多个参数的形式传给tcpdump。一般的,若表达式包括Shell metacharacters,传送单个引用参数更为容易。多个参数在解析前可用空格联接起来。
分享到:
相关推荐
winpcap过滤表达式检验程序源代码
winpcap过滤表达式检验程序
winpcap过滤表达式说明 pdf
过滤串表达式的语法 <br>WinPcap用户指南
Winpcap用户指南的一部分,主要讲解过滤串表达式的语法在网上找来的,弄成了word文档,分享给大家。
利用winpcap进行报文过滤,需添加packet2.h等文件
过滤串表达式的语法 使用WinPcap编程 WinPcap教程: 循序渐进教您使用WinPcap 获取设备列表 获取已安装设备的高级信息 打开适配器并捕获数据包 不用回调方法捕获数据包 过滤数据包 分析数据包 处理脱机堆文件 发送...
winpcap 例子 winpcap 例子 winpcap 例子
Winpcap用户指南:内容包含了相关宏定义,输出函数,编程指南介绍等。过滤串表达式的语法以及Pcap的数据结构介绍,内容不多,共58页,基本涵盖全了,精简,容易查找、翻阅。.
这个程序实现的是基于winpcap的抓包程序,在这个程序中实现的是抓多个包并进行分析。
wireshark过滤表达式讲解,很好的一个教程
基于winpcap的抓包工具,编译能通过的。
第一部分内容主要适合那些需要利用WinPcap开发应用程序的编程人员: 它包含了WinPcap API的所有函数和数据结构的信息, 说明部分解释了如何编写一个数据包过滤器,而另一个页面则解释了如何将它包含到应用程序中。...
详细讲解了要设置的具体步骤。按此设置就不会出现什么问题了。
wpcap filters are based on a declarative predicate syntax....wpcap过滤器是一个基于声明的谓词语法。一个过滤器就是一个包含了过滤expression的ASCII字符串。pcap_complite()函数将表达式转换成内核级包过滤器。
数据过滤是捕获网络数据的必要环节, 通过数据过滤可以捕获有用数据, 进一步提高工作效率
WinPcap 中文技术手册文档 V4.01 WinPcap(Windows Packet Capture)是Windows平台下一个免费,公共的网络访问系统,开发WinPcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。 目前WinPcap还没有较...
使用Winpcap捕获并解析TCP报文 需要配置Winpcap的库和头文件
基于WinPcap的网络流量统计源码 1.本程序利用WinPcap开发包进行编写; 2.WinPcap的使用参见:http://www.coffeecat.net.cn/WinPcap/html/main.html 3.平台:WinXP,VC6,WinPcap VC2005 编译通过 运行需要安装VC6和...
也就是说,winpcap不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。因此,它不能用于QoS调度程序或个人防火墙。目前,winpcap开发的主要对象是windows NT/2000/XP,这主要是...