Libpcap使用" vlan"过滤字符串表现得很奇怪

时间:2015-06-30 10:46:51

标签: pcap libpcap tcpdump packet-capture bpf

使用libpcap pcap_compile时,我遇到了一些奇怪的错误 如果这些是已知问题或我正在制作一些bpf格式化/订购错误,请告诉我

例如:

1) 如果我传递(protocol_filter和vlan_filter),我看不到数据包:Like((arp或udp port 234)和vlan 12) 但如果我将exp交换为(vlan_filter和protocol_filter),那么数据包过滤就起作用了:Like((v​​lan 12)和(arp或udp port 234))

2)如果我将vlan包含在" not"协议,我得到应用协议过滤器的数据包: 例如:(((vlan 20))和(not(udp port 3800))和((not(tcp))和(not(udp port 53))和(not(icmp))和(not(ip6))和(不是(udp端口5353))))

如果我不包含带协议的vlan,当bpf为:时,我得到包括tcp,icmp,ip6等在内的所有数据包: (不是(udp端口3800))和((不是(tcp))和(不是(udp端口53))和(不是(icmp))和(不是(ip6))和(不是(udp端口5353))))

3)(((不是vlan))和(not(udp port 3800))和((not(tcp))和(not(udp port 53))和(not(icmp))和(not(ip6) ))和(不(udp端口5353)))) 获取所有数据包,包括ip6,tcp等

<(>((不是vlan))和(not(udp port 3800))和(((tcp))或((udp port 53))或((icmp))或((ip6))或((udp)端口5353))))甚至没有得到单个数据包

1 个答案:

答案 0 :(得分:2)

vlan很奇怪。

引用pcap-filter手册页:

   vlan [vlan_id]
          True if the packet is an IEEE 802.1Q VLAN packet.  If  [vlan_id]
          is specified, only true if the packet has the specified vlan_id.
          Note that the  first  vlan  keyword  encountered  in  expression
          changes  the decoding offsets for the remainder of expression on
          the assumption that the packet  is  a  VLAN  packet.   The  vlan
          [vlan_id]  expression  may  be used more than once, to filter on
          VLAN hierarchies.  Each use of that  expression  increments  the
          filter offsets by 4.

          For example:
               vlan 100 && vlan 200
          filters on VLAN 200 encapsulated within VLAN 100, and
               vlan && vlan 300 && ip
          filters  IPv4  protocols  encapsulated  in VLAN 300 encapsulated
          within any higher order VLAN.

&#34;请注意,表达式中遇到的第一个 vlan 关键字会更改表达式剩余部分的解码偏移量假设数据包是VLAN数据包。&#34;在这里很重要。

这意味着 vlan和其他过滤器的顺序

所以:

  

如果我通过(protocol_filter和vlan_filter),我看不到数据包

那是因为&#34; protocol_filter&#34;基于数据包 VLAN数据包的假设来评估;通过该过滤器的任何东西都不是VLAN数据包,所以&#34; vlan_filter&#34;失败。

  

但如果我将exp交换为(vlan_filter和protocol_filter),则包过滤工作

那是因为&#34; vlan_filter&#34;检查VLAN数据包会改变所有后续测试的方式,这样他们就会认为数据包 VLAN数据包; &#34; protocol_filter&#34;基于数据包 VLAN数据包的假设来评估。

  

如果我将vlan包含在&#34;不是&#34;协议,我得到应用了协议过滤器的数据包:例如:(((vlan 20))和(not(udp port 3800))和((not(tcp))和(not(udp port 53))和(not(icmp) ))和(不是(ip6))和(不是(udp端口5353))))

该过滤器仅匹配VLAN数据包,如果数据包用于VLAN 20,则在假设数据包是VLAN数据包的情况下,它将执行所有其他检查 - 例如,如果您正在使用以太网报头捕获数据包,并且您正在检查IPv4或IPv6,其他检查将查看偏移量为16而不是12的以太网类型。

  

如果我不包含带协议的vlan,当bpf为:(不是(udp端口3800))和((不是(tcp))和(不是(udp端口53))时,我得到包括tcp,icmp,ip6等在内的所有数据包)和(不是(icmp))和(不是(ip6))和(不是(udp端口5353))))

这有点令人困惑,可以说它是libpcap中的一个错误。

&#34; udp port 3800&#34;首先检查&#34;是IPv4还是IPv6&#34;,在以太网上通过检查以太网类型/长度字段是否具有IPv6的值0x0800或IPv6的0x86dd来完成。如果它与IPv4匹配,则检查IPv4协议字段以查看它是否为UDP;如果它与IPv6匹配,它将检查IPv6下一个头字段以查看它是否为UDP。如果是UDP,它会检查源和目标端口号,看看是否有3800;如果是这样,数据包匹配,否则它不匹配。

&#34; not(udp port 3800)&#34;执行相同的检查,但如果任何测试不匹配,则数据包 匹配,如果其中任何一个匹配,则数据包不会匹配。

以太网类型/长度字段中的VLAN数据包为0x8100,因此IPv4和IPv6的检查不匹配。因此,&#34;不是&#34;过滤器执行匹配。

此处的错误是进出端口3800 的UDP数据包是IPv4或IPv6数据包;如果它在VLAN上,它就不会发生在以太网上,在数据包开头的偏移量为12时有0x0800或0x86dd,它有0x8100。

  <(>((不是vlan))和(not(udp port 3800))和((not(tcp))和(not(udp port 53))和(not(icmp))和(not(ip6))和(不是(udp端口5353))))获取所有数据包,包括ip6,tcp等

这是另一个libpcap错误 - 就像以太网上的&#34; vlan&#34;,导致所有后续测试在 VLAN标头之后查看以太网类型字段,所以不是vlan&#34;。但是对于&#34;而不是vlan&#34;这是错误的,因为如果匹配,数据包不是一个VLAN数据包,所以没有VLAN头!

  <(>((不是vlan))和(not(udp port 3800))和(((tcp))或((udp port 53))或((icmp))或((ip6))或((udp)端口5353))))甚至没有得到单个数据包

同样的问题。

libpcap / WinPcap错误可能不容易 修复,但我会在有空的时候看看它们。