首页 »C 教程 » 正则表达式语法:对过滤串表达式的语法分析 »正文
正则表达式语法:对过滤串表达式的语法分析
来源: 发布时间:星期四, 2009年2月12日 浏览:190次 评论:0
wpcap过滤器是以已声明谓词语法为基础过滤器是个ASCII串它包含了个过滤表达式pcap_compile把这个表达式编译成内核级包过滤器
这个表达式会选择那些数据包将会被堆存 如果表达式没有给出 那么 网络上所有 包都会被内核过滤引擎所认可 不然 只有那些表达式为\'true\' 包才会被认可
这个表达式包含了 个或多个原语 原语通常包含了 id(名字或序列) 这些id优先于限定词 以下是 3种区别 限定词:
- 输入(type)
- 指明了哪些东西是id所代表可能输入是hostnet和port比如:`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这样点对点协议)那么限定词可以使用inbound和outbound来指明个方向
- 协议(proto)
- 限定词限制了所匹配协议可能协议有:etherfdditripip6arprarpdecnettcp和udp比如:`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和 些算术表达式 这些内容会在下面和大家介绍
我们可以使用 andor和 not将原语连接起来 来构造 个更复杂 过滤表达式 例如:`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表达式可以是iparprarp或ip6开头如下所示:
- 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可能需要 src 或 dst加以限制
- 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表达式可以以关键字tcp或udp开头如下所示:
- 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, icmp6igmpigrppimahespvrrpudp 或 tcp中个注意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)stp和netbeui会检查LLC首部DSAPatalk会检查数据包是不是SNAP格式并且OUI是不是0x080007Appletalk 同样如此
-
- 在以太网例子中tcpdump检查大部分协议以太网类型字段isosap 和 netbeui除外它们会检查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可以是个数字或以下名称中个:clnpesis或isis
- clnp, esis, isis
- 缩写是:
- iso proto p
p 是以上协议中个注意tcpdump并不能完成这些协议全部解析工作
- expr relop expr
- 若关系式如下:relop是 >, <, >=, <=, =, != 中个并且expr是个由正整常数(用标准C语言语法表示)标准 2进制运算符[ +, -, *, /, &, | ]运算符长度和指定数据包存取则值为true要存取数据包内数据可以使用以下语法:proto [ expr : size ]
Proto 是 ether, 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数据报这个检查隐含在tcp和udp下标操作中例如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]
相关文章
读者评论
发表评论
|
|