首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 软件时空 > 软件相关 > WinPcap过滤表达式语法
【标  题】:WinPcap过滤表达式语法
【关键字】:WinPcap
【来  源】:http://blog.csdn.net/casale/archive/2006/05/29/760421.aspx

WinPcap过滤表达式语法

注:该文档从tcpdump的主页上获得,在www.tcpdump.org能够找到它的原始版本。

 

Wpcap过滤器基于已公开的断言语法。一个过滤器是一串包括过滤表达式的ASCII字符串。Pcap_compile()接受表达式并利用一个程序将之转化为核心层的包过滤器。

 

表达式选择将要接受的数据包。若未给出表达式,网络上的所有数据包将被核心层的过滤驱动所接受。否则,只有满足表达式为”ture”的数据包会被接受。

 

表达式可以包括一个或多个原子式。原子式通常由一个带前置限定词的id(名称或数字)所组成。有三种不同的前置限定词:

 

Type 限定词指定名称或数字所指向的类别。可能的类别有hostnetport。例如:’host foo’’net 128.3’’port 20’。若未指定类别限定词,默认为host

Dir  限定词指定一个到和/或从id的特定的传输方向。可能的方向有srcdstsrc or dstsrc and dst。例如:’src foo’’dst net 128.3’’src or dst port ftp-data’。若没有该限定词,默认为src or dst。对于’null’链路层(例如像slip这种点对点的协议)inboundoutbound这两上限定词能够指定想要的方向。

Proto 限定词限定一个特殊的协议。可能的协议有:etherfdditripip6arprarpdecnettcpudp。例如:’ether src foo’’arp net 128.3’’tcp port 21’。若没有协议限定词,则默认为所有与类别相一致的协议。例如:’src foo’的意思是’(ip or arp or rarp) src foo’(除非后面的语法不合法),’net bar’的意思是’(ip or arp or rarp) net bar’’port 53’的意思’(tcp or udp) port 53’

[‘fddi’实际上是’ether’的一个别名;解析器将它们的意思处理为“在指定网络接口下使用数据链路层。”FDDI首部包括类以太网的源和目的地址,并且通常包括类以太网的包类型,因此你能够像对以太网一样在这些部分对FDDI进行过滤。FDDI首部还包括其他部分,但你无法在过滤表达式中精确命名它们。

 

类似的,’tr’’ether’的一个别名;之前对FDDI首部的解释也适用于令牌环网的首部。]

 

做为对以上的补充,还有一些特殊的‘原子式’的关键字并不遵循这种模式:gatewaybroadcastlessgreater和算术表达式。所有这些将在后面讲到。

 

更复杂的过滤表达式由andornot将原子式组合而成。例如:’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 host host

如果IPv4/v6数据包的目的地址是host则表达式值为truehost可以是IP地址或主机名。

src host host

如果IPv4/v6数据包的源地址是host则表达式值为true

host host

如果IPv4/v6数据包的源或目的地址是host则表达式值为true。以上的任一主机表达式都能够用关键字如iparprarpip6预先指定,就像以下所示:

Ip host host

等价于:

Ether proto \ip and host host

如果host是多个IP地址,每个地址都会被做匹配检查。

ether dst ehost

若以太网目的地址是ehost则值为trueehost可以是/etc/ethers中的一个名称或一个数字(请见ethers(3N)的数字格式)。

ether src ehost

若以太网源地址是ehost则值为true

ether host ehost

若以太网源或目的地址是ehost则值为true

gateway host

若数据包以host为网关则值为true。例如:以太网的源或目的地址是host但无论是IP地址的源还是目的地址都不是hostHost必须是一个名称并且能够在机器的host-name-to-IP-address机制(如主机名文件、DNSNIS)和host-name-to-Ethernet-address机制(如/ect/ethers)中找到。(一个等价的表达式是:

ether host ehost and not host host

它能够使用名称或数字表示host / ehost)目前来说,这种语法无法在能够运行IPv6的结构下工作。

dst net net

IPv4/v6的目的地址的网络号是net,则值为trueNet可以是/etc/networks中的一个名称或是一个网络号(详细内容请见networks(4))。

src net net

IPv4/v6的源地址的网络号是net,则值为true

net net

IPv4/v6的源地址或目的地址的网络号是net,则值为true

net net mask netmask

IP地址根据指定的子网掩码netmask能与net匹配。可以用限定词srcdst限定。注意:这个语法在IPv6中是不合法的。

net net/len

IPv4/v6地址根据指定的子网掩码长度能与net匹配。可以用限定词srcdst限定。

dst port port

若数据包是ip/tcpip/udpip6/tcpip6/udp并且目的端口为port,则值为true。端口可以是一个数字或一个在/etc/services(详见tcp(4P)udp(4P))中的名称。若使用名称,则端口和协议都将被指定。若使用数字或不明确的名称,则只有端口地址被指定(例如:dst port 513将显示tcp/loginudp/who的数据流,port domain将显示tcp/domainudp/domain的数据流)。

src port port

若数据包的源端口的值是port,则值为true

port port

若数据包的源或目的端口地址的值是port,则值为true。以上所有关于端口的表达式都可以用关键字,tcpudp,预先指定,如:

tcp src port port

仅当tcp的数据包的源端口地址为port的时才匹配。

less length

若数据包的长度小于等于length,则值为true。这相当于:

len <= length

greater length

若数据包的长度大于等于length,则值为true。这相当于:

len >= length

ip proto protocol

若数据包是协议类型为protocolIP数据包(详见ip(4P))。Protocol可以是一个数字或一个名称:icmpicmp6igmpigrppimahespvrrpudptcp。注意标识符tcpudpicmp同时又是关键字并且必需经过反斜线(\)过滤(在C-shell中是\\)。注意这个原子式不对协议首部进行分析。(这段话理解不太清楚,原文如下:Note that the identifiers tcp, udp, and icmp are 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 proto protocol

若数据包是协议类型为protocolIPv6数据包。注意这个原子式不对协议首部进行分析。

ip6 protochain protocol

若数据包是IPv6数据包,并且在它的协议首部串中包括类型为protocol的协议首部,则值为ture。例如:

ip6 protochain 6

与任何在协议首部串中包括TCP协议首部的IPv6数据包匹配。数据包可能包括,例如:在IPv6首部和TCP首部之间包括authentication首部,routing首部或hop-by-hop option首部。由该原子式发送的BPF编码是很复杂的并且在tcpdump中不能被BPF编码优化器所优化,因此它可能有点慢。

ip protochain protocol

等价于ip6 protochain protocol,但是它用于IPv4

ether broadcast

若数据包是以太网广播数据包,则值为true。关键字ether是可选的。

ip broadcast

若数据包是IP广播数据包,则值为true。它会检察所有全一和全零的广播协定并查寻本地子网掩码。

ether multicast

若数据包是以太网多播数据包,则值为trueEther关键字是可选的。这是‘ether[0] & 1 != 0’的简写。

ip multicast

若数据包是IP多播数据包,则值为true

ip6 multicast

若数据包是IPv6多播数据包,则值为true

ether proto protocol

若数据包是protocol类型的以太协议,则值为trueProtocol可以是一个数字或以下中的一个名称:ipip6arprarpatalkdecnetscalatmopdlmoprcisostpipxnetbeui。注意这些标识符同时也是关键字并且必须用反斜线(\)过滤。

[FDDI(如‘fddi protocol arp’)和令牌环(如‘tr protocol arp’)的例子中,对于大多数的协议来说,协议证明来自802.2的逻辑链接控制(LLC)首部,LLC通常在首部分层中处于FDDI或令牌环的顶层。

当过滤FDDI或令牌环网络的大部分协议时,对于压缩以太网tcpdump只检查在所谓的SNAP格式的组织单元标识符(OUI)值为0x000000LLC首部的协议的ID字段;它并不检查数据包是否在SNAP格式下拥有OUI值为0x000000。例外的是iso,它检查的是LLC首部的DSAPDestination Service Access Point)和SSAPSource Service Access Point)字段;stpnetbeui检查LLC首部的DSAP;还有atalk检查拥有OUI0x080007SNAP格式数据包和Appletalk etype(这个怎么译)

在以太网的例子中,tcpdump检查大部分协议的以太网类型字段;例外的是isosapnetbeui,对于这些它检查802.3的帧,然后像它对FDDI和令牌环网做的那样检查LLC首部;atalk,它检查以太网帧中的Appletalk etype并且同时像在FDDI和令牌环网中那样检查SNAP格式的数据包;aarp,它在以太网帧或OUI值为0x000000802.2 SNAP帧中检查Appletalk ARP etype;还有ipx,它检查以太网帧中的IPX etypeLLC首部的IPX DSAP,没有LLC首部封装的802.3IPXSNAP帧中的IPX etype]

decnet src host

DECNET的源地址是host,则值为true,它可能是一个格式为‘10.123’的地址或一个DECNET的主机名称。[DECNET主机名称支持只有在配置成运行DECNETUltrix系统中可用。]

decnet dst host

DECNET目的地址为host,则值为true

decnet host host

DECNET的源或目的地址为host,则值为true

ipip6arprarpatalkdecnetisostpipxnetbeui

缩写为:

ether proto p

P是以上协议中的一个。

latmoprcmopdl

缩写为:

ether proto p

p是以上协议中的一个。注意tcpdump目前还不知道如何解析这些协议。

vlan [vlan_id]

若数据包是IEEE 802.1Q VLAN数据包,则值为true。若[vlan_id]被指定,则仅当数据包为指定的vlan_id,值才为true。注意在表达式中遇到的第一个关键字vlan在假设数据包为VLAN数据包的前提下改变了剩下的表达式的解码偏移量。

tcpudpicmp

缩写为:

ip proto p or io6 proto p

p是以上协议中的一个。

iso proto protocol

若数据包是协议类型为protocolOSI数据包,则值为trueProtocol可以是一个数字或以下名称中的一个:clnpesisisis

clnpesisisis

缩写为:

iso proto p

p是以上协议中的一个。注意tcpdump在解析这些协议时所做的工作并不完全。

expr relop expr

若关系式如下:relop ><>=<==!=