关闭

WinPcap过滤表达式语法

2336人阅读 评论(0) 收藏 举报

注:该文档从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 ><>=<==!= 中的一个,并且expr是一个由正整常数(用标准C的语法表达)、标准二进制操作[+、-、*/&| ]和指定数据包存取,则值为true。要存取数据包内的数据,可以使用以下的语法:

proto [ expr : size ]

proto etherfdditriparprarptcpudpicmpip6同的一个,并且用索引操场作指定协议层。注意tcpudp和其他上层协议类型仅应用于IPv4,而不能应用于IPv6(这在将来将会改进)。相对于指定的协议层,字节偏移量是由expr给出。Size是可选的,它指定感兴趣的字段的字节数;它可以是124,默认为1。由len指定的长度操作会给出数据包的长度。

例如:‘ether[0] & 1 != 0’捕获所有多播的数据流。表达式‘ip[0] & 0xf != 5’捕获所有选中的IP数据包。表达式‘ip[6:2] & 0x1fff = 0’仅捕获不分片的数据和分片数据的第0片数据。这些检查将暗中的应用于tcpudp的索引操作。例如:tcp[0]总是意味着TCP首部的第一个字节,而决不会意味着一个中间片段的第一个字节。

 

某些偏移量和字段值可能是用名称来表达而不是数值。以下的协议首部字段偏移量可用:icmptype (ICMP类型字段)icmpcode (ICMP代码字段)tcpflags (TCP标识字段)

 

以下的ICMP类型字段值可用:icmp-echoreplyicmp-unreachicmp-sourcequenchicmp-redirecticmp-echoicmp-routeradverticmp-routersoliciticmp-timxceedicmp-paramprobicmp-tstampicmp-tstampreplyicmp-ireqicmp-ireqreplyicmp-maskreqicmp-maskreply

 

以下的TCP标识字段值可用:tcp-fintcp-syntcp-rsttcp-pushtcp-pushtcp-acktcp-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,传送单个引用参数更为容易。多个参数在解析前可用空格联接起来。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5174次
    • 积分:77
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:1篇
    • 评论:0条
    文章存档