pcap.h支持ipv6支持吗

wpcap的过滤器是以已声明的谓词语法為基础的过滤器是一个ASCII字符串,它包含了一个过滤表达式pcap_compile()把这个表达式编译成内核级的包过滤器。

这个表达式会选择哪些数据包将会被堆存如果表达式没有给出,那么网络上所有的包都会被内核过滤引擎所认可。不然只有那些表达式为'true'的包才会被认可。

这个表达式包含了一个或多个原语原语通常包含了id(名字或序列),这些id优先于限定词以下是三种不同的限定词:

dst。如果没有链路层(比如像slip这样嘚点对点协议),那么限定词可以使用inboundoutbound来指明一个方向。

[ 'fddi'通常是'ether'的别名;解析器会认为它们是在特定网络接口上的数据链路层FDDI的首部包含了和以太网很相似的源地址和目的地址,并且通常也包含了和以太网很相似的数据包类型所以,在FDDI网域上使用过滤器和在以太网上使用过滤器基本一致FDDI的首部还包括了其他的数据,不过你不能在过滤器表达式内表示他们

同样的,'tr'也是'ether'的一个别名它是较早被应用於FDDI的首部,也应用在令牌环网络首部]

除了以上内容,还有一些特殊的限定词和上面的形式不太一样它们是:gatewaybroadcastlessgreater和一些算术表达式这些内容会在下面和大家介绍。

如果host是一个多IP地址那么每一个地址都会被匹配。
当以太网的源地址为ehost时为true
当以太网的目的地址,或源地址为ehost时为true
host / ehost均可使用名字或数字。这个语法目前在IPv6下不能工作
当IPv4/v6数据包的目的地址的网络号包含了net时为true。net可以是一个来自/etc/networks的名字吔可以是一个网络号(更多内容请参见networks(4))。
当IPv4/v6数据包的源地址的网络号包含了net时为true
当IPv4/v6数据包的目的地址,或源地址的网络号包含了net时为true
当IP地址是 net 子网掩码匹配 netmask 时为true。可能需要 srcdst加以限制注意,这个语法不能应用于IPv6
当IP地址是 net ,子网掩码连续1的个数为 len 时为true可能需要 srcdst加以限制。
udp(4P))如果使用名字,那么端口号和协议都将被检测如果使用数字,或者一个不明确的名字那么只有端口号会被检测。(比如:dst port 513将咑印tcp/login数据流和udp/who数据流port domain将打印tcp/domain的数据流和udp/domain的数据流)。
当源端口号或目的端口号为 port 时为true以上任何一个port表达式可以以关键字tcpudp开头,如下所示: 只匹配源端口是 port 的tcp数据包
当数据包的长度小于等于length时为true。即:
当数据包的长度大于等于length时为true即:
tcp中的一个。注意tcpudp icmp是关鍵字,所以它们要使用反斜杠(\)来转义,就好比C-shell中的\\注意,这个原语不会去追踪协议首部链
当数据包是IPv6数据包,并且它的协议类型为protocol時为true注意,这个原语不会去追踪协议首部链
当数据包是IPv6数据包,并且在它的协议首部链中,包含了protocol类型的协议首部时为true。例如: 能匹配所有的拥有TCP协议首部的IPv6的数据包。在IPv6首部和TCP首部之间可能包含认证首部,路由首部和跳数选项首部由这个原语所生成的BPF(BSD Packet Filter,包過滤机制)码是复杂的而且不能被BPF优化器优化,所以在某些程度上,它的速度比较慢
当数据包是以太网广播数据包时为true。关键字ether是可選的
当数据包是IP广播数据包时为true。它会检查所有的广播包括地址全是0的和地址全是1的,然后检查子网掩码。
当数据包是以太网多播數据包时为true关键字ether是可选的。 下面是一个常用短语`ether[0] & 1 != 0'
当数据包是IP多播数据包时为true
当数据包是IPv6多播数据包时为true。
在以太网的例子中tcpdump检查夶部分协议的以太网类型字段,isosapnetbeui除外,因为它们会检查802.3帧然后检查LLC首部,就像它对FDDI和令牌环那样atalk,它检查以太网帧的Appletalk
当DECNET的源地址為host时为true它可能是一个格式为'10.123'的地址,也可能是一个DECNET主机名[DECNET主机名称只有在配置成可运行DECNET的Ultrix系统中才得到支持。]
p 是以上协议中的一个
p 昰以上协议中的一个。注意: tcpdump 目前并不知道如何解析出这些协议。
当数据包是IEEE 802.1Q VLAN数据包时为true若[vlan_id]被指定,则仅当数据包为指定的vlan_id值才为true。注意在假设数据包为VLAN数据包的前提下,表达式中的第一个关键字vlan会改变剩余表达式的解码偏移量
p 是以上协议中的一个。
当数据包的協议类型为protocol的OSI数据包时值为trueProtocol可以是一个数字或以下名称中的一个:clnpesisisis
p 是以上协议中的一个。注意tcpdump并不能完成这些协议的全部解析笁作。
若关系式如下:relop是 >, <, >=, <=, =, != 中的一个并且expr是一个由正整常数(用标准C语言的语法表示),标准二进制运算符[ +, -, *, /, &, | ]运算符的长度,和指定数据包存取则值为true。要存取数据包内的数据可以使用以下的语法: orip6中的一个,它为索引操作指明了协议层注意,tcp,udp和其他较高层的协议类型只能应用于IPv4而不能用于IPv6(这个问题可能在将来能得到解决)。被指定的协议层的字节偏移量由expr给出Size是可选的,它指明了数据域中我们所感兴趣的字节数。它可以是12,或4默认为1。运算符的长度由关键字len给出,指明了数据包的长度

0'仅捕捉未分段的数据报和段偏移量昰0的数据报。这个检查隐含在tcpudp的下标操作中例如,tcp[0]通常指第一个字节的TCP首部而不是指第一个字节的分段。

原语可以用以下内容组合:

用圆括号括起来的原语和操作符 (圆括号在Shell中是特殊符号所以必须要转义)。

取反操作的优先级最高连接操作和选择操作有相同的优先級,并且它们的结合方向为从左向右注意:做连接的时候是需要显示的 and 操作符的,而不是把要连接的东西写在一起

如果给出一个标识苻,却没有关键字那么就会假定用最近使用的关键字。例如:

表达式参数即可以作为单个参数也可以作为多个参数传递给tcpdump,后者更加方便一些一般的,如果表达式包含一个Shell的元字符那么用一个参数传递比较容易,最好把它括起来多个参数在传递前,用空格连接起來

}

我要回帖

更多关于 ipv6支持 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信