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的包
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常好,你对 Libpcap 提供的数据包过滤处理函数有很好的理解。下面我来进一步补充一下这两个函数的使用方法。 函数原型: ```c int pcap_compile(pcap_t *p, struct bpf_program *fp, const char *str, int optimize, bpf_u_int32 netmask); ``` 参数说明: - `p`:指向 pcap_t 结构体的指针,表示要编译过滤器的会话。 - `fp`:指向 bpf_program 结构体的指针,表示编译后的过滤器。 - `str`:表示要编译的布尔表达式。 - `optimize`:指定是否开启优化。如果这个参数为 1,表示开启优化;如果为 0,表示不开启优化。 - `netmask`:用于指定子网掩码,如果不知道子网掩码,可以将这个参数设置为 0。 使用示例: ```c pcap_t *handle; struct bpf_program filter; // 过滤器 char *devname = "eth0"; char errbuf[PCAP_ERRBUF_SIZE]; char *filter_exp = "tcp and dst port 80"; // 要过滤的表达式 // 打开网卡 handle = pcap_open_live(devname, 65535, 1, 1000, errbuf); if (handle == NULL) { printf("Error: %s\n", errbuf); return 1; } // 编译过滤器 if (pcap_compile(handle, &filter, filter_exp, 0, 0) == -1) { printf("Error: %s\n", pcap_geterr(handle)); return 1; } // 应用过滤器 if (pcap_setfilter(handle, &filter) == -1) { printf("Error: %s\n", pcap_geterr(handle)); return 1; } ``` 上面的代码会打开一个名为 "eth0" 的网卡,并编译一个过滤器,过滤表达式为 "tcp and dst port 80",表示只捕获目的端口为 80 的 TCP 数据包。如果出现错误,会将错误信息输出到控制台。 希望这个示例能够帮助你理解如何使用 pcap_compile() 和 pcap_setfilter() 函数来过滤网络数据包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值