Python 以太网嗅探器不能捕获所有内容,而tcpdump是并行的
我用python编写了一个以太网嗅探器。它基本上打开一个套接字,将其设置为混杂模式,然后解析每个传入的数据包,例如: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
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
。