专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C 教程 » 正则表达式语法:对过滤串表达式的语法分析 »正文

正则表达式语法:对过滤串表达式的语法分析

来源: 发布时间:星期四, 2009年2月12日 浏览:190次 评论:0


wpcap过滤器是以已声明谓词语法为基础过滤器是个ASCII它包含了个过滤表达式pcap_compile把这个表达式编译成内核级包过滤器
这个表达式会选择那些数据包将会被堆存如果表达式没有给出那么网络上所有包都会被内核过滤引擎所认可不然只有那些表达式为\'true\'包才会被认可

这个表达式包含了个或多个原语原语通常包含了id(名字或序列)这些id优先于限定词以下是 3种区别限定词:

输入(type)
指明了哪些东西是id所代表可能输入是hostnetport比如:`host foo\'`net 128.3\'`port 20\'如果没有输入限定词就假定是host
方向(dir)
由id指明了个特定传输方向可能方向是srcdstsrc or dst比如\'src foo\'\'dst net 128.3\'`src or dst port ftp-data\'如果没有指定就假定是src or dst如果没有链路层(比如像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\'\'port53\'等价于\'(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\'如果要简化输入我们可以把已列出id限定词省略比如:`tcp dst port ftp or ftp-data or do\' 和 `tcp dst port ftp or tcp dst port ftp-data or tcp dst port do\'是完全等价

可使用原语有:

dst host host
当IPv4/v6数据包目标域(destination field)为host时为truehost既可以是地址也可以是名字
src host host
当IPv4/v6数据包源域(source field)为host时为true
host host
当IPv4/v6数据包源域(source field)或目标域(destination field)为host时为true以上任何个host表达式可以是iparprarpip6开头如下所示:
ip host host

等价于:
ether proto \\ip and host host

如果host个多IP地址那么每个地址都会被匹配 [Page]
ether dst ehost
当以太网地址为ehost时为trueehost可以是个来自/etc/ether名字也可以是个数字代号(参见 ethers(3N)for numeric format)
ether src ehost
当以太网源地址为ehost时为true
ether host ehost
当以太网地址或源地址为ehost时为true
gateway host
host为网关时为true以太网源地址或目地址是host,但源地址和目地址区别时为hosthost必须能被机器主机-IP地址(host-name-to-IP-address)机制找到(如主机名文件DNSNIS等)也能被主机-以太网地址(host-name-to-Ethernet-address)机制找到(如/etc/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地址是 net 子网掩码匹配 netmask 时为true可能需要 src

dst加以限制注意这个语法不能应用于IPv6
net net/len
当IP地址是 net 子网掩码连续1个数为 len 时为true可能需要 srcdst加以限制
dst port port
当数据包是ip/tcp, ip/udp, ip6/tcp 或 ip6/udp并且目端口号是port时为trueport可以是数字或是在/etc/services中被使用名字(参见 tcp(4P) and udp(4P))如果使用名字那么端口号和协议都将被检测如果使用数字或者个不明确名字那么只有端口号会被检测(比如:dst port 513将打印tcp/login数据流和udp/who数据流port do将打印tcp/do数据流和udp/do数据流)
src port port
当源端口号是 port时为true
port port
当源端口号或目端口号为 port 时为true以上任何个port表达式可以以关键字tcpudp开头如下所示:
tcp src port port

只匹配源端口是 port tcp数据包
less length
当数据包长度小于等于length时为true即:
len <= length.

greater length
当数据包长度大于等于length时为true即:
len >= length.

ip proto protocol
当数据包是IP数据包并且它协议类型为protocol时为trueprotocol可以是个数字也可以是icmp, icmp6igmpigrppimahespvrrpudptcp注意tcpudp icmp是关键字所以它们要使用反斜杠(\\)来转义就好比C-shell中\\\\注意这个原语不会去追踪协议首部链
ip6 proto protocol
当数据包是IPv6数据包并且它协议类型为protocol时为true注意这个原语不会去追踪协议首部链
ip6 protochain protocol
当数据包是IPv6数据包并且在它协议首部链中包含了protocol类型协议首部时为true例如:
ip6 protochain 6

能匹配所有拥有TCP协议首部IPv6数据包在IPv6首部和TCP首部的间可能包含认证首部路由首部和跳数选项首部由这个原语所生成BPF(BSD Packet Filter包过滤机制)码是复杂而且不能被BPF优化器优化所以在某些程度上速度比较慢 [Page]
ip protochain protocol
功能和 ip6 protochain protocol相同只是这个应用于 IPv4
ether broadcast
当数据包是以太网广播数据包时为true关键字ether是可选
ip broadcast
当数据包是IP广播数据包时为true它会检查所有广播包括地址全是0和地址全是1然后检查子网掩码
ether multicast
当数据包是以太网多播数据包时为true关键字ether是可选 下面是个常用短语`ether[0] & 1 != 0\'
ip multicast
当数据包是IP多播数据包时为true
ip6 multicast
当数据包是IPv6多播数据包时为true
ether proto protocol
当数据包是以太类型protocol时为trueprotocol可以是个数字也可以是ip, ip6, arp, rarp, atalk, aarp,decnet, sca, lat, mopdl, moprc,iso, stp, ipx, netbeui注意这些符号也都是关键字所以他们都需要用反斜杠(\\)转义
[在使用FDDI(比如\'fddi protocol arp\')和令牌环(比如\'tr protocol arp\')和其他大多数这种协议时协议根据802.2逻辑链路控制(LLC)来识别这些信息通常在FDDI或令牌环首部开始
当需要识别大多数协议标识比如FDDI或令牌环时, Tcpdump只检查LLC报头ID数据域它们以SNAP格式存储并且组织单位识别码(Organizational Unit Identier(OUI))为0x000000以封装以太网它不会检查这个包是不是SNAP格式并在0x000000单元有OUI
然而iso是个特例它会检查LLC首部服务存取点DSAP(Destination Service Access Po)和源服务存取点SSAP(Source Service Access Po)stpnetbeui会检查LLC首部DSAPatalk会检查数据包是不是SNAP格式并且OUI是不是0x080007Appletalk 同样如此
在以太网例子中tcpdump检查大部分协议以太网类型字段isosapnetbeui除外它们会检查802.3帧然后检查LLC首部就像它对FDDI和令牌环那样atalk它检查以太网帧Appletalk etype和SNAP格式以太网帧arrp它在以太网帧中检查Appletalk ARP etype或是在OUI为0x000000802.2 SNAP帧中查找还有ipx他会在以太网帧中检查IPX etype在LLC首部检查IPX DSAP没有用802.3封装LLC首部IPX和SNAP帧中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
ip, ip6, arp, rarp, atalk, aarp, decnet, iso, stp, ipx, netbeui
缩写是:
ether proto p

p 是以上协议中
lat, moprc, mopdl
缩写是:
ether proto p

p 是以上协议中注意: tcpdump 目前并不知道如何解析出这些协议
vlan [vlan_id]
当数据包是IEEE 802.1Q VLAN数据包时为true若[vlan_id]被指定则仅当数据包为指定vlan_id值才为true注意在假设数据包为VLAN数据包前提下表达式中个关键字[Page]vlan会改变剩余表达式解码偏移量
tcp, udp, icmp
缩写是:
ip proto p or ip6 proto p

p 是以上协议中
iso proto protocol
当数据包协议类型为protocolOSI数据包时值为trueProtocol可以是个数字或以下名称中个:clnpesisisis
clnp, esis, isis
缩写是:
iso proto p

p 是以上协议中注意tcpdump并不能完成这些协议全部解析工作
expr relop expr
若关系式如下:relop是 >, <, >=, <=, =, != 中并且expr个由正整常数(用标准C语言语法表示)标准 2进制运算符[ +, -, *, /, &, | ]运算符长度和指定数据包存取则值为true要存取数据包内数据可以使用以下语法:proto [ expr : size ]

Protoether, fddi, tr, ip, arp, rarp, tcp, udp, icmp or ip6它为索引操作指明了协议层注意tcp,udp和其他较高层协议类型只能应用于IPv4而不能用于IPv6(这个问题可能在将来能得到解决)被指定协议层字节偏移量由expr给出Size是可选它指明了数据域中我们所感兴趣字节数它可以是12或4默认为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 代码域), and 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那么用个参数传递比较容易最好把它括起来多个参数在传递前用空格连接起来[Page]

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: