libpcap包过滤-pcap_compile()



        pcap_compile()是用来把用户输入的过滤字符串编译进过滤信息的,这个过滤信息可以决定哪些包是用户可获取到的 。


        过滤表达式包含一个或多个元素。每个元素通常包含由多个或一个被修饰符修饰的id名称或数字,有三种不同的修饰符:
       类型修饰符     说明id属于那种类型。可以用的类型修饰符有host,net,port,portrange。例如‘host foo’, ‘net      128.3’, ‘port 20’, ‘por-trange 6000-6008’。如果id没有指定类型,则host是默认。
       路径方向修饰符  指定id的路径方向。可以用的路径修饰符有src, dst, src or    dst,srcand dst,   addr1, addr2, addr3,  and  addr4.举例‘src foo’, ‘dst net 128.3’, ‘src  
or dst port ftp-data’.如果id没有路径修饰符,默认src or dst。addr1, addr2, addr3, and addr4仅用于无限网络,在链路层,如果是混杂模式,可以用inbound,outbound来指定过滤方向
       协议修饰符      来限制匹配的协议。可以用的协议修饰符ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp and udp。举例ether src foo’,‘arp net 128.3’, ‘tcp port 21
’, ‘udp portrange 7000-7009’, ‘wlan addr2 0:2:3:4:5:6’. 如果没有制定协议,则默认是所有协议都匹配,比如‘src  foo’,ip arp rarp的协议都匹配
 

       fddi协议等同于ether协议,在语法解析器中,fddi与ether含义一样,fddi头部信息包含以太网源、目的地址,还包含包的类型,可以指定fddi头部域的信息来过滤指定的域。fddi头还包含其他的域,但是不能应用与过滤。


       tr和wlan在过滤解析器中,含义等同于ether。以前版本的fddi头部信息也适用于802.11无线局域网的头。
除了以上三种修饰符,还有一些特殊的修饰符和算术运算式:gateway, broadcast, less, greater。如下所示算术运算式:
       and or not       
       可以用and、or、not来组合复杂的过滤表达式。比如‘host foo and not port ftp and not port ftp-data’,如果多个表达式以and、 or、 not来组合,多个表达式有相同的修饰符,则可以
省略除第一个表达式以外,比如‘tcp dst port ftp or ftp-data or domain’等同于‘tcp dst port ftp or tcp dst port ftp-data or tcp dstport domain’
 
       允许的过滤表达式:

       dst host host
       包的目的ip,可以是ip地址也可以是域名


       src host host
       
包的源ip


       host host
       匹配包的源或则目的ip

       以上的表达式都可以用ip、arp、rarp、ip6,比如ip host host,包是ip协议,包的源ip或目的ip是host的,如果host是多播ip地址,那么每个地址都会匹配。


       ether dst ehost
       匹配以太网头的目的地址


       ether src ehost
       匹配以太网头的源地址


       ether host ehost
       匹配以太网源或目的地址


       gateway host
       匹配网关地址,以太网头的目的或者源地址是网关但不能以ip头的源或目的地址为网关,网关host必须存在于设备的域名解析文件中,不适用于ipv6


       dst net net
       匹配范围内包的目的ip地址(一段范围的ip地址),net可以是网络文件中的名称,也可以是一个网ip地址,一个ipv4的ip地址可以是以点分制的数字,如192.168.1.1则对应的网络掩码
是255.255.255.255,192.168.1则对应的网络掩码是255.255.255.0,192.168则对应的网络掩码是254.254.0.0,ipv6的ip地址必须是完整的,所以ipv6的匹配等同于ip地址匹配
 

       src net net
       匹配范围内包的源ip地址


       net net
       匹配范围内包的源或者目的ip地址
        

       net net mask netmask
       匹配指定的ip地址net以及掩码netmask,可以指定src或者dst。不支持ipv6


       net net/len
       匹配指定的ip地址,类似192.168.10.1/24 等同于 192.168.10.1 和掩码254.254.254.0,可以指定src或dst


       dst port port
       匹配指定的包的目的端port,port可以是数字或者/etc/services 文件中的端口对应的名称,如果使用名称,则只匹 配名称对应的端口和协议,如果是数字,则只匹配端口号


       src port port
       匹配包的指定源端口


       port port
       匹配源或在目的端口为port的包


       dst portrange port1-port2
       匹配目的端口在port1-port2之间的包


       src portrange port1-port2
       匹配源端口在port1-port2之间的包


       portrange port1-port2
       匹配源端口或目的端口在port1-port2之间的包

       以上关于端口和端口范围匹配的表达式可以用tcp或udp来指定协议


       less length
       匹配长度小于指定的长度length的包


       greater length
       匹配长度大于指定长度length的包
          
       ip proto protocol
       匹配协议为protocol的ip包,protocol可以使一个数字也可以是字符串(icmp, icmp6, igmp, igrp, pim, ahesp, vrrp, udp, tcp),注意因为tcp udp icmp本身是修饰符所以可以前面

加用反斜杠来表示
      
       ip6 proto protocol
       匹配协议为protocol的ipv6的包

你可能感兴趣的:(libpcap)