我一直在使用我的树莓派作为嗅探器,并观察到 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 信息,并且它的所有出色的解析功能都完好无损!