精华内容
下载资源
问答
  • libpcap过滤规则
    万次阅读
    2015-08-06 09:53:40
    

            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中的过滤规则设置 (2014-03-15 17:01:30)转载▼ 用libpcap时发现在网上截获的包有很多种,往往很多时候很难发现自己需要的包,所以这时候用libpcap过滤规则的话可以很方便的发现自己所需要的,但是过滤规则...

    libpcap中的过滤规则设置 (2014-03-15 17:01:30)转载▼

    用libpcap时发现在网上截获的包有很多种,往往很多时候很难发现自己需要的包,所以这时候用libpcap的过滤规则的话可以很方便的发现自己所需要的,但是过滤规则的语法是怎么样的呢?

    举个例子,比如我现在要截获ping百度主页的来回数据包,则这时候要限定一下IP地址才能更有针对性,一开始我设置的是src host 115.239.210.26 PS:(因为百度大概有很多IP提供商所以可能IP地址不一样),于是截获的全是百度发来的包的信息,如果既要看到百度发过来的包,又要看到自己机器发到百度的包的话,就要设置为host 116.239.210.26 这样就可以了,这对计算包的来回时间戳很有用。对于其他的过滤规则的语法的话可以参考下面的这篇文档。

    这篇文档取自tcpdump的指南。原始的版本www.tcpdump.org 找到。
    wpcap的过滤器是以已声明的谓词语法为基础的。过滤器是一个ASCII字符串,它包含了一个过滤表达式。pcap_compile()把这个表达式编译成内核级的包过滤器。
    这个表达式会选择那些数据包将会被堆存。如果表达式没有给出,那么,网络上所有的包都会被内核过滤引擎所认可。不然,只有那些表达式为’true’的包才会被认可。

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

    输入(type)
    指明了哪些东西是id所代表的。可能的输入是host,net和port。比如:host foo',net 128.3’,port 20'。如果没有输入限定词,就假定是host 方向(dir) 由id指明了一个特定的传输方向。可能的方向是src,dst,src or dst。比如,'src foo','dst net 128.3',src or dst port ftp-data’。如果没有指定,就假定是src or dst。如果没有链路层(比如,像slip这样的点对点协议),那么限定词可以使用inbound和outbound,来指明一个方向。
    协议(proto)
    限定词限制了所匹配的协议。可能的协议有:ether,fddi,tr,ip,ip6,arp,rarp,decnet,tcp和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的首部,也应用在令牌环网络首部。]

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

    我们可以使用and,or和not将原语连接起来,来构造一个更复杂的过滤表达式。例如:host foo and not port ftp and not port ftp-data'。如果要简化输入,我们可以把已列出的id限定词省略。比如:tcp dst port ftp or ftp-data or domain’ 和 `tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain’是完全等价的。

    可使用的原语有:

    dst host host
    当IPv4/v6数据包的目标域(destination field)为host时为true,host既可以是地址,也可以是名字。
    src host host
    当IPv4/v6数据包的源域(source field)为host时为true。
    host host
    当IPv4/v6数据包的源域(source field)或目标域(destination field)为host时为true。以上任何一个host表达式可以是ip,arp,rarp或ip6开头,如下所示:
    ip host host
    等价于:
    ether proto ip and host host
    如果host是一个多IP地址,那么每一个地址都会被匹配。
    ether dst ehost
    当以太网的目的地址为ehost时为true。ehost可以是一个来自/etc/ether的名字,也可以是一个数字代号(参见 ethers(3N)for numeric format)。
    ether src ehost
    当以太网的源地址为ehost时为true。
    ether host ehost
    当以太网的目的地址,或源地址为ehost时为true。
    gateway host
    当host为网关时为true。即,以太网源地址或目的地址是host,但源地址和目的地址不同时为host。host必须能被机器的主机-IP地址(host-name-to-IP-address)机制找到(如主机名文件,DNS,NIS等),也能被主机-以太网地址(host-name-to-Ethernet-address)机制找到(如/etc/ethers等)。例如:
    ether host ehost and not host host
    host / ehost均可使用名字或数字。这个语法目前在IPv6下不能工作。
    dst net net
    当IPv4/v6数据包的目的地址的网络号包含了net时为true。net可以是一个来自/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时为true。port可以是数字,或是在/etc/services中被使用的名字。(参见 tcp(4P) and udp(4P))。如果使用名字,那么端口号和协议都将被检测。如果使用数字,或者一个不明确的名字,那么只有端口号会被检测。(比如:dst port 513将打印tcp/login数据流和udp/who数据流。port domain将打印tcp/domain的数据流和udp/domain的数据流)。
    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时为true。protocol可以是一个数字,也可以是icmp,icmp6,igmp,igrp,pim,ah,esp,vrrp,udp 或 tcp中的一个。注意,tcp,udp, 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优化器优化,所以,在某些程度上,它的速度比较慢。
    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时为true。protocol可以是一个数字,也可以是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 Identifier(OUI))为0x000000,以封装以太网。它不会检查这个包是不是SNAP格式的,并在0x000000单元有OUI。
    然而,iso是个特例,它会检查LLC首部的目的服务存取点DSAP(Destination Service Access Point)和源服务存取点SSAP(Source Service Access Point),stp和netbeui会检查LLC首部的DSAP,atalk会检查数据包是不是SNAP格式的,并且OUI是不是0x080007。Appletalk 同样如此。
    在以太网的例子中,tcpdump检查大部分协议的以太网类型字段,iso,sap 和 netbeui除外,因为它们会检查802.3帧,然后检查LLC首部,就像它对FDDI和令牌环那样。atalk,它检查以太网帧的Appletalk etype和SNAP格式的以太网帧,arrp,它在以太网帧中检查Appletalk ARP etype,或是在OUI为0x000000的802.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主机名称只有在配置成可运行DECNET的Ultrix系统中才得到支持。]
    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数据包的前提下,表达式中的第一个关键字vlan会改变剩余表达式的解码偏移量。
    tcp, udp, icmp
    缩写是:
    ip proto p or ip6 proto p
    p 是以上协议中的一个。
    iso proto protocol
    当数据包的协议类型为protocol的OSI数据包时值为true。Protocol可以是一个数字或以下名称中的一个:clnp,esis或isis。
    clnp, esis, isis
    缩写是:
    iso proto p
    p 是以上协议中的一个。注意,tcpdump并不能完成这些协议的全部解析工作。
    expr relop expr
    若关系式如下:relop是 >, <, >=, <=, =, != 中的一个,并且expr是一个由正整常数(用标准C语言的语法表示),标准二进制运算符[ +, -, *, /, &, | ],运算符的长度,和指定数据包存取,则值为true。要存取数据包内的数据,可以使用以下的语法:
    proto [ expr : size ]
    Proto 是 ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp or ip6中的一个,它为索引操作指明了协议层。注意,tcp,udp和其他较高层的协议类型只能应用于IPv4,而不能用于IPv6(这个问题可能在将来能得到解决)。被指定的协议层的字节偏移量由expr给出。Size是可选的,它指明了数据域中,我们所感兴趣的字节数。它可以是1,2,或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的元字符,那么用一个参数传递比较容易,最好把它括起来,多个参数在传递前,用空格连接起来。

    展开全文
  • Libpcap库编程指南--过滤数据包

    千次阅读 2017-09-13 14:58:03
    WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎。 它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分。 用来过滤数据包的函数是 pcap_compile() 和 pcap_setfilter...

    WinPcap和Libpcap的最强大的特性之一,是拥有过滤数据包的引擎。 它提供了有效的方法去获取网络中的某些数据包,这也是WinPcap捕获机制中的一个组成部分。 用来过滤数据包的函数是 pcap_compile() 和 pcap_setfilter() 。
    pcap_compile() 它将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。有关布尔过滤表达式的语法可以参见 Filtering expression syntax 这一节的内容。

    pcap_setfilter() 将一个过滤器与内核捕获会话向关联。当 pcap_setfilter() 被调用时,这个过滤器将被应用到来自网络的所有数据包,并且,所有的符合要求的数据包 (即那些经过过滤器以后,布尔表达式为真的包) ,将会立即复制给应用程序。

    以下代码展示了如何编译并设置过滤器。 请注意,我们必须从 pcap_if 结构体中获得掩码,因为一些使用 pcap_compile() 创建的过滤器需要它。

    在这段代码片断中,传递给 pcap_compile() 的过滤器是”ip and tcp”,这说明我们只希望保留IPv4和TCP的数据包,并把他们发送给应用程序。
    示例代码(根据WinPcap文档修改,适用于UNIX/Linux):

        if (d->addresses != NULL)
            /* 获取接口第一个地址的掩码 */
            netmask=((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
        else
            /* 如果这个接口没有地址,那么我们假设这个接口在C类网络中 */
            netmask=0xffffff; 
    
    
    compile the filter
        if (pcap_compile(adhandle, &fcode, "ip and tcp", 1, netmask) < 0)
        {
            fprintf(stderr,"\nUnable to compile the packet filter. Check the syntax.\n");
            /* 释放设备列表 */
            pcap_freealldevs(alldevs);
            return -1;
        }
    
    set the filter
        if (pcap_setfilter(adhandle, &fcode) < 0)
        {
            fprintf(stderr,"\nError setting the filter.\n");
            /* 释放设备列表 */
            pcap_freealldevs(alldevs);
            return -1;
        }

    备注:
    可使用的原语有:

    dst host host
    当IPv4/v6数据包的目标域(destination field)为host时为true,host既可以是地址,也可以是名字。
    src host host
    当IPv4/v6数据包的源域(source field)为host时为true。
    host host
    当IPv4/v6数据包的源域(source field)或目标域(destination field)为host时为true。以上任何一个host表达式可以是ip,arp,rarp或ip6开头,如下所示:
    ip host host
    等价于:
    ether proto \ip and host host
    如果host是一个多IP地址,那么每一个地址都会被匹配。
    ether dst ehost
    当以太网的目的地址为ehost时为true。ehost可以是一个来自/etc/ether的名字,也可以是一个数字代号(参见 ethers(3N)for numeric format)。
    ether src ehost
    当以太网的源地址为ehost时为true。
    ether host ehost
    当以太网的目的地址,或源地址为ehost时为true。
    gateway host
    当host为网关时为true。即,以太网源地址或目的地址是host,但源地址和目的地址不同时为host。host必须能被机器的主机-IP地址(host-name-to-IP-address)机制找到(如主机名文件,DNS,NIS等),也能被主机-以太网地址(host-name-to-Ethernet-address)机制找到(如/etc/ethers等)。例如:
    ether host ehost and not host host
    host / ehost均可使用名字或数字。这个语法目前在IPv6下不能工作。
    dst net net
    当IPv4/v6数据包的目的地址的网络号包含了net时为true。net可以是一个来自/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时为true。port可以是数字,或是在/etc/services中被使用的名字。(参见 tcp(4P) and udp(4P))。如果使用名字,那么端口号和协议都将被检测。如果使用数字,或者一个不明确的名字,那么只有端口号会被检测。(比如:dst port 513将打印tcp/login数据流和udp/who数据流。port domain将打印tcp/domain的数据流和udp/domain的数据流)。
    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时为true。protocol可以是一个数字,也可以是icmp, icmp6,igmp,igrp,pim,ah,esp,vrrp,udp 或 tcp中的一个。注意,tcp,udp, 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优化器优化,所以,在某些程度上,它的速度比较慢。
    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时为true。protocol可以是一个数字,也可以是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 Identifier(OUI))为0x000000,以封装以太网。它不会检查这个包是不是SNAP格式的,并在0x000000单元有OUI。
    然而,iso是个特例,它会检查LLC首部的目的服务存取点DSAP(Destination Service Access Point)和源服务存取点SSAP(Source Service Access Point),stp和netbeui会检查LLC首部的DSAP,atalk会检查数据包是不是SNAP格式的,并且OUI是不是0x080007。Appletalk 同样如此。
    在以太网的例子中,tcpdump检查大部分协议的以太网类型字段,iso,sap 和 netbeui除外,因为它们会检查802.3帧,然后检查LLC首部,就像它对FDDI和令牌环那样。atalk,它检查以太网帧的Appletalk etype和SNAP格式的以太网帧,arrp,它在以太网帧中检查Appletalk ARP etype,或是在OUI为0x000000的802.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主机名称只有在配置成可运行DECNET的Ultrix系统中才得到支持。]
    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数据包的前提下,表达式中的第一个关键字vlan会改变剩余表达式的解码偏移量。
    tcp, udp, icmp
    缩写是:
    ip proto p or ip6 proto p
    p 是以上协议中的一个。
    iso proto protocol
    当数据包的协议类型为protocol的OSI数据包时值为true。Protocol可以是一个数字或以下名称中的一个:clnp,esis或isis。
    clnp, esis, isis
    缩写是:
    iso proto p
    p 是以上协议中的一个。注意,tcpdump并不能完成这些协议的全部解析工作。
    expr relop expr
    若关系式如下:relop是 >, <, >=, <=, =, != 中的一个,并且expr是一个由正整常数(用标准C语言的语法表示),标准二进制运算符[ +, -, *, /, &, | ],运算符的长度,和指定数据包存取,则值为true。要存取数据包内的数据,可以使用以下的语法:
    proto [ expr : size ]
    Proto 是 ether, fddi, tr, ip, arp, rarp, tcp, udp, icmp or ip6中的一个,它为索引操作指明了协议层。注意,tcp,udp和其他较高层的协议类型只能应用于IPv4,而不能用于IPv6(这个问题可能在将来能得到解决)。被指定的协议层的字节偏移量由expr给出。Size是可选的,它指明了数据域中,我们所感兴趣的字节数。它可以是1,2,或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的元字符,那么用一个参数传递比较容易,最好把它括起来,多个参数在传递前,用空格连接起来。

    展开全文
  • 使用libpcap过滤pcap文件中的数据包

    千次阅读 2017-10-07 13:27:34
    工作需要,要对pcap文件中的数据包进行过滤,只保留普通端口的TCP、UDP数据包。结果如下图代码如下:#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #...

    工作需要,要对pcap文件中的数据包进行过滤,只保留普通端口的TCP、UDP数据包。结果如下图


    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <pcap/pcap.h>
    #include <arpa/inet.h>
    
    
    #define ETHER_ADDR_LEN 6       /* MAC地址长度(字节) */
    
    /*以太网头*/
    struct sniff_ethernet
    {
    	u_char ether_dhost[ETHER_ADDR_LEN];
    	u_char ether_shost[ETHER_ADDR_LEN];
    	u_short ether_type;
    };
    /*IP头*/ //假设没有选项字段,长度20字节
    struct sniff_ip
    {
    	u_char ip_vhl;
    	u_char ip_tos;
    	u_short ip_len;
    	u_short ip_id;
    	u_short ip_off;
    	#define IP_RF 0x8000
    	#define IP_DF 0x4000
    	#define IP_MF 0x2000
    	#define IP_OFFMASK 0x1fff
    	u_char ip_ttl;
    	u_char ip_p;
    	u_short ip_sum;
    	struct in_addr ip_src,ip_dst;
    };
    /*UDP报头*/
    struct sniff_udp
    {
    	u_short udp_sport;
    	u_short udp_dport;
    	u_short udp_len;
    	u_short udp_sum;
    };
    
    
    
    pcap_t *source_pcap_t=NULL;
    pcap_dumper_t *des_pcap_dumper_t=NULL;
    
    int exit_main()
    {
    	printf("exit_main() is called.\n");
    	if( NULL!=source_pcap_t )
    	{
    		pcap_close(source_pcap_t);
    	}
    	if( NULL!=des_pcap_dumper_t )
    	{
    		pcap_dump_close(des_pcap_dumper_t);
    	}
    	exit(0);
    }
    
    
    int main(int argc, char *argv[])
    {
    
    	//打开要处理pcap文件
    	char errbuf[PCAP_ERRBUF_SIZE]={0};
    	if( NULL==(source_pcap_t=pcap_open_offline(argv[1], errbuf)) )
    	{
    		printf("pcap_open_offline() return NULL.\nerrbuf:%s\n", errbuf);
    		exit_main();
    	}
    	//打开保存的pcap文件	
    	if( NULL==(des_pcap_dumper_t=pcap_dump_open(source_pcap_t,"./rescult.pcap")) )
    	{
    		printf("pcap_dump_open() fail.\n");
    		exit_main();		
    	}
    
    	//读取数据包
    	struct pcap_pkthdr packet;
    	const u_char *pktStr;
    	while(1)
    	{
    		pktStr=pcap_next(source_pcap_t, &packet);
    		if( NULL==pktStr )
    		{
    			printf("pcap_next() return NULL.\n");
    			break;		
    		}
    		else
    		{
    			//ARP数据包,不写入生成pcap文件
    			if( 0x0608==((struct sniff_ethernet*)(pktStr))->ether_type )  
    			{}
    			//IPv4数据包,选择性写入生成pcap文件			
    			else if( 0x0008==((struct sniff_ethernet*)(pktStr))->ether_type )
    			{
    				if( 0x02==((struct sniff_ip*)(pktStr+14))->ip_p )
    				{
    					//IGMPv3数据包,不写入生成pcap文件
    					continue;
    				}
    				else if( 0x11==((struct sniff_ip*)(pktStr+14))->ip_p )
    				{
    					//UDP数据包,选择性写入生成pcap文件
    					if( 0x8900==((struct sniff_udp*)(pktStr+14+20))->udp_sport || 0x8a00==((struct sniff_udp*)(pktStr+14+20))->udp_sport ||
    						0x3500==((struct sniff_udp*)(pktStr+14+20))->udp_sport || 0x3500==((struct sniff_udp*)(pktStr+14+20))->udp_dport ||
    						0x6c07==((struct sniff_udp*)(pktStr+14+20))->udp_sport || 0x6c07==((struct sniff_udp*)(pktStr+14+20))->udp_dport ||
    						0xeb14==((struct sniff_udp*)(pktStr+14+20))->udp_sport || 0xeb14==((struct sniff_udp*)(pktStr+14+20))->udp_dport )
    					{
    						//NBNS端口137、BROWSER端口138、
    						//DNS端口53
    						//SSDP端口1900
    						//LLMNR端口5355
    					}
    					else
    					{
    						//UDP其他端口,写入生成pcap文件
    						pcap_dump((u_char*)des_pcap_dumper_t, &packet, pktStr);
    					}
    				}
    				else
    				{
    					//TCP、或者其他协议,写入生成pcap文件
    					pcap_dump((u_char*)des_pcap_dumper_t, &packet, pktStr);
    				}
    			}
    			//非ARP、非IPv4的其他协议数据包,写入生成pcap文件
    			else
    			{
    				pcap_dump((u_char*)des_pcap_dumper_t, &packet, pktStr);	
    			}
    		}
    	}
    	
    	pcap_dump_close(des_pcap_dumper_t);
    	pcap_close(source_pcap_t);
    	return 0;
    }
    over

    展开全文
  • libpcap

    千次阅读 2015-12-31 10:12:01
    BPF过滤器 是根据用户已经定义好的过滤规则对数据包进行逐一匹配,若匹配成功则放入内核缓冲区,并传递给用户缓冲区;若匹配失败则直接丢弃。  如果没有设置过滤规则,则所有数据包都将被放入内核缓冲区,并...
  • libpcap(Packet Capture ...- 规则过滤:提供自带规则过滤功能,按需要选择过滤规则 安装包目录: 安装脚本:libpcap-install.sh 安装包:m4-1.4.19、bison-3.7.6、flex-2.6.4、gcc4.85、libpcap-1.10.1、m4-1.4.19
  • Linux下Libpcap源码分析和包过滤机制

    千次阅读 2009-11-23 10:44:00
    Libpcap可以在绝大多数类unix平台下工作,本文分析了libpcap在linux 下的源代码实现,其中重点是linux的底层包捕获机制和过滤器设置方式,同时也简要的讨论了libpcap使用的包过滤机制 BPF。 网络监控 绝大多数的...
  • libpcap 过滤 pcap_compile

    2016-02-02 09:17:00
    libpcap 是使用 lex 和 yacc 生成scanner.c 等文件,用以过滤规则生成的。 /* make 中的 lex、yacc 部分步骤 */ ./runlex.sh lex -oscanner.c scanner.l mv scanner.c scanner.c.bottom cat ./scanner.c.top...
  • 动图: 抓包理解: 过滤数据包 我们抓到的数据包往往很多,如何...BPF 使用一种类似于汇编语言的语法书写过滤表达式,不过 libpcap 和 tcpdump 都把它封装成更高级且更容易的语法了,具体可以通过 man tcpdump查看:
  • libpcap详解

    千次阅读 2021-07-20 18:50:24
    libpcap主要由两部分组成:网络分接头(network tap)和数据过滤器(packet filter)。网络分接头从网络设备驱动程序中收集数据进行拷贝,过滤器决定是否接收该数据包。libpcap利用BSD packet filter(BPF)算法对...
  • 如果没有设置过滤规则,所有的数据包都将放入内核缓冲区,并传递给用户缓冲区。 其具体的工作流程如下图所示: 4、libpcap编译 4.1、下载官网链接:https://www.tcpdump.org/release/ 后续所有调试与相关代码环境...
  • Wireshark 捕获过滤器使用的语法与 tcpdump、WinDump、Analyzer 这类使用 libpcap/WinPcap 库的程序一致。
  • libpcap原理及使用

    万次阅读 多人点赞 2017-12-07 16:43:30
    2.9 libpcap 本文最初整理在我的github上SDN-Learning-notes libpcap(Packet Capture Library)即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的API接口,为...
  • 用Tcpdump过滤数据包

    2021-05-18 13:50:18
    -F 从指定的文件中读取过滤规则,忽略命令行中指定的其它过滤规则; -i 指定监听的网络接口; -r 从指定的文件中读取数据包(该文件一般通过-w选项产生); -w 将截获的数据包直接写入指定的文件中,不对其进行分析和...
  • 它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。 实用命令实例 默认启动 tcpdump 普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的...
  • libpcap抓包

    2022-05-07 10:16:35
    Libpcap 主要由两部份组成:网络分接头(Network Tap)和数据过滤器(Packet Filter)。网络分接头从网络设备驱动程序中收集数据拷贝,过滤器决定是否接收该数据包。Libpcap 利用 BSD Packet Filter(BPF)算法对网卡接收...
  • 网络开发包 libpcap

    2020-05-25 22:04:28
    Libpcap的主要作用 捕获各种数据包: 例如,网络流量统计。 过滤网络数据包: 例如,过滤掉本地上的一些数据,类似防火墙 分析网络数据包: 例如,分析网络协议,...设置过滤规则(可选) 捕获数据 关闭网络设备 捕获网
  • libpcap的示例代码和英文资料,tcpdump-filters的规则同样适用于libpcap过滤表达式
  • libpcap库的安装与使用

    千次阅读 2021-10-20 17:10:23
    1 安装 sudo apt-get install ...设置过滤规则(可选) 捕获数据 关闭网络设备 常用函数: pcap_lookupdev( )(可选) 查看设备名,返回网卡名 pcap_t *pcap_open_live(const char *device,int snaplen,int promisc,
  • 文章目录编写要求原理源码测试环境libpcap安装编译运行参考完 编写要求 使用Libpcap库捕获局域网中的IP包,要求: 打印数据包的源与目的物理地址; 打印源IP与目的IP地址; 打印出上层协议类型; 如果上层协议为TCP...
  • BPF过滤规则及tcpdump命令详解

    万次阅读 2017-06-09 10:02:55
    使用BPF过滤规则,你可以确定该获取和检查哪些流量,忽略哪些流量。BPF让你能够通过比较第2、3、4层协议中各个数据字段值的方法对流量进行过滤。BPF中内置了一些“基元”来指代一些常用的协议字段。可以用“host”、...
  • Wireshark捕获过滤器和显示过滤

    千次阅读 2019-12-17 21:19:26
    wireshark中非常实用的捕获过滤器以及显示过滤器的使用技巧
  • wireshark显示过滤器和捕获过滤

    万次阅读 多人点赞 2018-11-14 20:52:57
    关于wireshark 过滤器的使用,包括wireshark显示过滤器和wireshark捕获过滤器。
  • Programming with Libpcap --Sniffing the Network Author: Luis Martin Garcia =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- | ** 你将会学到什么? ** | | 1.数据包捕获的原则; | | 2.如何利用libpcap...
  • libpcap (Packet Capture Library),即数据包捕获函数库,是 Unix/Linux 平台下的网络数据包捕获函数库。它是一个独立于系统的用户层包捕获的 API 接口,为底层网络监测提供了一个可移植的框架。 libpcap 工作原理 ...
  • Libpcap详解

    2017-11-09 10:50:57
    libpcap详解 2010-12-01 22:07 libpcap(Packet Capture Library),即数据包捕获函数库,是Unix/Linux平台下的网络数据包捕获函数库。 它是一个独立于系统的用户层包捕获的API接口,为底层网络监测...
  • Libpcap的介绍与简单使用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,273
精华内容 909
关键字:

libpcap过滤规则