Python 以太网嗅探器不能捕获所有内容,而tcpdump是并行的

Python 以太网嗅探器不能捕获所有内容,而tcpdump是并行的,python,sockets,networking,tcpdump,packet-sniffers,Python,Sockets,Networking,Tcpdump,Packet Sniffers,我用python编写了一个以太网嗅探器。它基本上打开一个套接字,将其设置为混杂模式,然后解析每个传入的数据包,例如: import fcntl import socket IF = "eth0" ETH_P_ALL = socket.htons(0x0003) s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ETH_P_ALL) ifr = ifreq() ifr.ifr_ifrn = IF.encode() # Get flags

我用python编写了一个以太网嗅探器。它基本上打开一个套接字,将其设置为混杂模式,然后解析每个传入的数据包,例如:

import fcntl
import socket

IF = "eth0"
ETH_P_ALL = socket.htons(0x0003)
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ETH_P_ALL)

ifr = ifreq()
ifr.ifr_ifrn = IF.encode()

# Get flags
fcntl.ioctl(s, 0x8913, ifr)

# Add promiscuous
ifr.ifr_flags |= 0x100

# Set flags
fcntl.ioctl(s, 0x8914, ifr)

while True:
    pkt_raw, sa_ll = s.recvfrom(65535)
    parse_packet(pkt_raw)
除此之外,我还有一个测量功能,它统计每秒传入的数据包数。为了生成数据包,我配置了一个交换机,以便它将所有数据包转发到接口(端口镜像)。也就是说,传入的数据包不是特定于此机器的

根据这种设置,我可以看到大约250个数据包/秒的速率。但是,如果我同时运行
tcpdump-n-ieth0
,速率会突然上升到大约5000包/秒。有趣的是,只有在前台运行
tcpdump
时才会发生这种情况,例如
tcpdump-n-I eth0>foo
不会改变传入数据包的速率


问题是:tcpdump在前台运行时有什么不同,因此包的速率要高得多,以及如何在python嗅探器中启用此行为?

证明这是一个自制的错误。由于嗅探器在一个流量也被镜像的服务器上工作,因此当通过SSH在终端上执行操作时,数据包速率总是会上升。

您有特权吗?您不检查ioctlYes的返回值,我以root身份运行它。
ioctl
的返回值为0。在tcpdump上运行
strace
,看看它还能做什么。这一点很好。我能发现的唯一区别是
recvfrom
和最具体的标志。参考:
recvfrom(3,[…],1024,0,NULL,NULL)=66
。Python:
recvfrom(3,[…],1024,0,{sau family=AF_PACKET,proto=0x800,if3,pkttype=PACKET_OTHERHOST,addr(6)={1000ec6c9be94},[18])=66
。另外还有一个
ioctl(3,SIOCGIFNAME,{ifr_index=3,ifr_name=“eth1”)=0
在Python中每次
recvfrom
之后。那么,附加的标志从哪里来,这个附加的
ioctl
在那里做什么?有趣的是,套接字的打开方式也有点不同。Python添加了
SOCK\u CLOEXEC
socket(PF\u PACKET,SOCK\u RAW | SOCK\u CLOEXEC,8)=3