3

我一直在使用我的树莓派作为嗅探器,并观察到 ​​tcpdump 和 scapy 之间的一些有趣差异。我看到以下内容:


流量生成器机器,带有 scapy 的 Linux Box:

sendp(Ether(dst='ff:ff:ff:ff:ff:ff',src="AA:00:00:00:00:00")/Dot1Q(vlan=10)/IP()/ICMP())


树莓派,又叫“tcpdump”:

00:25:10.156830 aa:00:00:00:00:00 (oui Unknown) > Broadcast, ethertype 802.1Q (0x8100),length 60: vlan 10, p 0, ethertype IPv4, localhost > localhost: ICMP echo request, id 0, seq 0, length 8


树莓派,通过“scapy”:

>>> pkt[0].show()
###[ Ethernet ]###   
    dst= ff:ff:ff:ff:ff:ff   
    src= aa:00:00:00:00:00   
    type= 0x800
###[ IP ]###
       version= 4L
       ihl= 5L
       tos= 0x0
       len=28
       id= 1
       flags= 
       frag= 0L
       ttl= 64
       proto= icmp
       chksum= 0x7cde
       src= 127.0.0.1
       dst= 127.0.0.1
       \options\
###[ ICMP ]###
          type= echo-request
          code= 0
          chksum= 0xf7ff
          id= 0x0
          seq= 0x0
###[ Padding ]###
              load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' None

即使我尝试:

>>> Dot1Q in pkt[0]
False


有谁知道为什么 scapy 无法捕获(解析?)vlan 帧,但 tcpdump 认为它很好?

(PS我也用scapy嗅了一下,导出了一个pcap文件,然后用tcpdump读取pcap文件……vlan标签不见了……消失了……)

========================

对于那些感兴趣的人,我现在的解决方法是使用 tcpdump 捕获到 pcap 文件,然后在 scapy 中使用 rdpcap() 来加载该数据,这样我就可以使用 scapy 强大的解析功能来探索捕获——这引入了一层缓存,以及对我的程序的讨厌的系统调用,但让我获得了可靠的 vlan 信息......

========================

根据 RyPeck 的回答和 GuyHarris 的建议,我现在有一个更好的解决方法:

a) 使用http://sourceforge.net/projects/pylibpcap/

import pcap
conf.use_pcap=True

b)使用 pcappy - 可以安装:pip install pcappy

import pcappy as pcap
conf.use_pcap=True

现在 scapy 显示与 tcpdump 相同的 vlan 信息,并且它的所有出色的解析功能都完好无损!

4

2 回答 2

4

更新:在GH2091中添加了支持,现在在 Scapy 2.4.3+ 中可用,仅在 Python 3 上

这是最近在 Scapy 邮件列表中讨论

正如我之前所说并指出的,在 scapy 或 tcpdump 获取 vlan 层之前,内核会剥离 vlan 层。但是 tcpdump 现在支持将其添加回来。因此,您也可以为 scapy 创建票证以支持此增强功能。- Philippe Biondi(Scapy 发明家)

这就解释了 VLAN 层消失的原因。除了获得潜在的功能请求/票外,此时无事可做。随意在Scapy BitBucket上创建一个。

@GuyHarris提供了一个不同的潜在解决方案,在 tcpdump 中具有上述功能将添加对 Scapy 的支持,如果您的 Scapy 安装使用 libpcap 捕获数据包,这将适用于您。

于 2013-09-25T03:48:02.767 回答
2

我试着按照你说的去做,但是没有用。'conf.L2listen' 仍然使用 'PF_PACKETS' 而不是 libpcap。我开始研究代码,发现“conf.use_pcap”只在“pcapdnet”模块中处理。这意味着如果你不导入它,'conf.use_pcap' 将被丢弃,'conf.L2listen' 仍然是 'PF_PACKETS' 而不是更改为 'L2pcapListenSocket' (这是绑定到 libpcap 的套接字)。

解决方案很简单:

conf.use_pcap = True
import scapy.arch.pcapdnet 

确保在更改配置后导入模块,否则它将不起作用。如果您查看以下内容,您可以检查它是否有效:

conf.L2listen

值为:

 <L2pcapListenSocket: read packets at layer 2 using libpcap>

如果值为:它不起作用:

<L2ListenSocket: read packets at layer 2 using Linux PF_PACKET sockets>
于 2014-02-05T07:45:15.083 回答