Winpcap过滤表达式语法

我们毕业设计要求翻译2000words+的英文文档,专门标注一下以免以后毕设老师搜到我的文章说是网上下的^^

 

注:本文档出自tcpdump用户手册。原始文档请参见:www.tcpdump.com

Wpcap过滤器基于一个声明式的谓词语法。过滤器则是一个包含了过滤表达式的ASCII字符串。Pcap_compile()获取这个表达式并将其翻译为一个内核级包过滤器的程序。

这个过滤表达式用于选择需要dump的数据包。如果没有给定的过滤表达式,内核级过滤引擎将会接收所有的数据包。否则,只有带入表达式之后其值为true的包才会被接收。

每个表达式由一个或更多的原语组成。而原语则包含一个id(可能为名字或数字)及位于它之前的一个或多个修饰词。一共有三类不同的修饰词:

类型修饰词(type)

此类修饰词用于描述它所修饰的id中的名字或数字的类别。可能的类型修饰词包括host,netport。其例子包括’host foo’,’net 128.3’,’port 20’。如果没有指定的修饰词,则假定为host

方向修饰词(dir)

此类修饰词指定数据从id传出或是传入到id的方向。可能的方向修饰词包括src,dst,src or dstsrc and dst。例如:’src foo’,dst net 128.3’’,’src or dst port ftp-data’。如果没有指定方向修饰符,则假定为src or dst。对于连接层为’null’的情况(比如SLIP之类点对点协议),应使用inboundoutbound修饰词指定想要的方向。

协议修饰词(proto)

此类修饰词用于限定符合特定协议的包。可能的协议修饰词包括:ether,fddi,tr,ip,ip6,arp,rarp,decent,tcpudp。例如:’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) src net bar’,而’port 53’等同于’(tcp or udp) port 53’。

[‘fddi’实际上是'ether的一个别名;分析器认为它们都代表着“被特定网络接口所使用的数据链路级别”。FDDI首部包含有以太网风格的源与目标的地址,并且往往包含有以太网风格的包类型,因此你可以像过滤以太网字段一样过滤这些FDDI字段。FDDI首部中还包含了其他的字段,这些字段无法在过滤表达式中显式地表述出来。

同样地,'tr’是'ether'的一个别名;之前所提到的用于处理FDDI首部的方法同样适用于令牌环网的首部。]

作为上述的补充,也存在一些不遵循上述模式的原语关键字:gateway,broadcast,less,greater以及算术表达式。下文将解释这些情况。

更多复杂的过滤表达式都需要通过使用and,ornot来结合不同的原语,比如说这样一个表达式:’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或IPv6数据包的目标字段是host时该表达式为真。当然,host可以是一个网络地址,也可以是一个主机名。

Src host host

当某个IPv4或IPv6数据包的源字段是host时该表达式为真。

Host host

当某个IPv4或IPv6数据包的源或目标字段是host时,该表达式为真。上述host表达式都可以被关键字ip,arp,rarpip6作为前缀修饰,例如表达式

Ip host host

就等同于表达式

Ether proto |ip and host host

如果host是一个对应有多个IP地址的主机名,每个地址都会被检查以确定是否匹配。

Ether dst ehost

当以太网目的地址为ehost时,该表达式为真。Ehost可能是/etc/ethers(译注:虽然不太确定但好像是Linux的ARP路由表?Solaris里好像是Mac与主机名的对应表?)中的一个名字,或者是一个数字。

Ether host ehost

当以太网源地址为ehost时,该表达式为真。

Ether host ehost

当以太网源地址或目的地址为ehost时,该表达式为真。

Gateway host

当网络包将host对应的主机用作网管时,该表达式为真。也即,以太网上的源地址或目标地址是host,但是host自身却并非IP包的源或目标。Host必须是一个能够被主机所使用的主机名到IP地址的解析系统(如host文件,DNS,NIS等)所解析,亦必须能够被主机的主机名到以太网地址的解析系统解析。(存在一个等效的表达式,即

Ether host ehost and not host host

该表达式中的hostehost可以是以太网名称或一个数字。)这种语法当前无法在启用了IPv6配置的环境下工作。

Dst net net

当IPv4或IPv6数据包的目标地址处于网段net中时,该表达式为真。Net可能是一个/etc/networks(译注:又是POSIX系统中的文件……)中的名称或是一个网络号。

Src net net

当IPv4或IPv6数据包的源地址处于网段net中时,该表达式为真。

Net net

当IPv4或IPv6数据包的源地址或目标地址处于网段net中时,该表达式为真。

Net net mask netmask

当数据包的IP地址与指定的netmask之后,其职若与net相同,则该表达式为真。该表达式可以使用srcdst修饰。注意,这一语法在IPv6网络中未经验证。

Net net/len

当IPv4或IPv6地址的网络号符合位长度为len的子网掩码时,该表达式为真。该表达式可以使用srcdst修饰。

Dst port port

当包是ip/tcp,ip/udp,ip6/tcp或ip6/udp类型且port是它的一个目的地址时,该表达式为真。Port可以是一个在/etc/services中使用的名字或数字。如果port是一个名字,则端口号和协议都会被检查;如果port是一个不确定的名字或者是一个数字,则只有端口号会被检查(譬如,dst port 513会输出tcp/login的流量和udp/who的流量,port domain则会输出tcp/domain和udp/domain的流量)。

Src port port

当包的发送源的端口号为port时,该表达式为真。

Port port

当包的源端口号或目的端口号为port时,该表达式为真。上述端口表达式都可以被关键字tcp或udp修饰,如下:

Tcp src port port

该表达式仅匹配源端口号为port的tcp包。

Less length

当包的长度小于或等于length时,该表达式为真。该表达式等价于:

Len <= length

Greater length

当包的长度大于或等于length时,该表达式为真。该表达式等价于:

Len >= length

Ip proto protocol

当包是一个IP包,且其协议类型为protocol时,该表达式为真。Protocol可以是一个数字或者下述名称当中的一个:icmp,icmp6,igmp,igrp,pim,ah,esp,vrrp,udp或tcp。注意,其中的tcp,udpicmp自身也是关键字,因此必须使用反斜线(\)转义。另外,这一原语不会追踪协议首部链。

Ip6 proto protocol

当包是一个协议类型为protocol的IPv6包时,该表达式为真。注意,这一原语不会追踪协议首部链。

Ip6 protochain protocol

当包是一个IPv6包,并且其协议首部链中包括了protocol的协议首部时,该表达式为真。例如,

Ip6 protochain 6

将会匹配任何协议首部链中包括tcp协议的IPv6数据包,而这个包的IPv6首部和tcp首部之间可能包含有身份验证首部,路由首部或逐跳设置首部。这个原语生成的BPF代码较为复杂,并且无法被tcpdump的BPF优化器所优化,因此会比较慢。

Ip protochain protocol

等效于ip6 protochain protocol,不过这是IPv4的版本。

Ether broadcast

当包是一个以太网广播包时,该表达式为真。Ether关键字是可选的。

Ip broadcast

当包是一个IP广播包时,该表达式为真。它会找出主机地址为全零或全一的广播地址,并对照本地子网掩码进行查询。

Ether multicast

当包是一个以太网多播包时,该表达式为真。Ether关键字是可选的。这是表达式’ehter[0] & 1 != 0’的简写形式。

Ip multicast

当包是一个IP多播包时,该表达式为真。

Ip6 multicast

当包是一个IPv6多播包时,该表达式为真。

Ether proto protocol

当的协议类型是以太网协议类型protocol时,该表达式为真。Protocol可以是一个数字或者下列名称中的一个:ip,ip6,arp,rarp,atalk,aarp,decnet,sca,lat,mopdl,moprc,iso,stp,ipxnetbeui。注意,这些标识符同时也是关键字,因此必须使用反斜线(\)进行转义。

[对于FDDI(例如’fddi protocol arp’)和令牌环网(例如’tr protocol arp’)来说,对于大多数上述协议,其协议标识都来自于802.2逻辑链路控制(LLC)首部,该首部往往位于FDDI或令牌环首部的上层。

在FDDI或令牌环网中过滤多数协议标识时,tcpdump只检查LLC首部当中的协议标识字段。它会假定LLC首部以一种组织唯一标识(OUI)(译注:原文为Organizational Unit Identifier,翻译的话应该是’组织单元表示’,没听说过,疑为有误,擅自更改了-_-)设为0x000000的SNAP格式来封装以太网包,而不会检查包是不是使用上述格式。

存在一些例外——当使用iso关键字时,会检查LLC首部的DSAP和SSAP字段;使用stp和netbeui关键字时,会检查LLC首部的DSAP字段;使用atalk关键字时,则会假定使用了标识AppleTalk的OUI 0x080007来检查数据包。

在以太网的条件下,tcpdump对于大多数协议都会检查以太网类型字段;这一规则的例外则包括iso,sap和netbeui,他们会像对待FDDI和令牌环网一样检查802.3数据帧并随后检查LLC首部;atalk,非但会像对待FDDI和令牌环网一样以SNAP格式检查包,还会以Appletalk类型检查以太网帧;aarp,会以Appletalk ARP类型检查以太网帧和OUI为0x000000的802.2 SNAP帧。]

Decent src host

当DECNET包的源地址为host时,该表达式为真。Host可能是一个类似”10.123”的地址,也可能是一个DECNET主机名。[DECNET主机名仅被配置为可支持DECNET的Ultrix系统所支持。]

Decent dst host

当DECNET包的目的地址为host时,该表达式为真。

Decent host host

当DECNET包的源地址或目的地址为host时,该表达式为真。

Ip,ip6,arp,rarp,atalk,aarp,decent,iso,stp,ipx,netbeui

上述均可作为以下表达式的缩写:

Ether proto p

其中p为上述协议中的一个。

Lat,moprc,mopdl

上述均可作为以下表达式的缩写:

Ether proto p

其中p为上述协议中的一个。注意,tcpdump目前尚不知道如何解析这些协议。

Vlan [vlan_id]

当包是一个IEEE 802.1Q VLAN包时,该表达式为真。如果[vlan_id]已指定,则仅当包拥有指定的vlan_id时,该表达式为真。注意,若假定包为一个VLAN包,则表达式当中的第一个vlan关键字会改变表达式剩余部分的解码偏移。

Tcp,udp,icmp

上述均可作为以下表达式的简写:

Ip proto p or ip6 proto p

其中p是上述协议中的一个。

Isp proto protocol

当包是一个OSI包,且其协议类型为protocol时,该表达式为真。Protocol可以是一个数字或者下列名字中的一个:clnp,esis,isis

Clnp,esis,isis

上述均可作为以下表达式的简写:

Isp proto p

其中p为上述协议中的一个。注意,tcpdump只能不完全地完成上述协议的解析工作。

Expr relop expr

当表达式中的关系存在时,表达式为真。其中relop可能是>,<,>=,<=,=,!=中的一个,而expr则是一个由整数常量组成的算术表达式(以C的语法表述),标准二进制操作符[+,-,*,/,&,|],长度操作符,以及专门的包数据存取器。为了访问包当中的数据,可以使用如下语法:

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’仅捕获未切片的数据报或是。这一检查被隐含在用于tcpudp的索引操作中。举例来说,tcp[0]总是表示TCP首部的第一个字节,而绝不会表示某个碎片数据报的第一个字节。

有些偏移和字段的值可能是使用名字而非数字表述的。你可以使用下列协议首部字段偏移:icmptype(ICMP类型字段),icmpcode(ICMP编码字段),tcpflags(TCP标记字段)。

ICMP类型字段的值可能是下列值中的一个:icmp-echoreply,icmp-unreach,icmp-sourcequench,icmp-redirect,icmp-echo,icmp-routeadvert,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-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的元字符时,应当传入一个单独的被引用的参数。当使用多个参数时,各参数在被解析之前会被使用空格相互连接。

posted on 2010-10-22 22:04  snakealpha  阅读(12828)  评论(2编辑  收藏  举报