以太网嗅探器没有捕获所有内容,而它与tcpdump并行

时间:2016-12-29 12:20:44

标签: python sockets networking tcpdump packet-sniffers

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

# python3
from django.views.generic.base import ContextMixin, TemplateView

class GroupContextMixin(ContextMixin):
    def get_some_objects(self):
        # fetch info from db using self.request, self.kwargs etc.
        # maybe set some instance attributes for later use
        return objects

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        # add shared stuff using self.get_some_objects()
        return ctx

class SeasonView(GroupContextMixin, TemplateView):
    template_name = ...

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        # add season view specific stuff
        return ctx

class GroupedMatchesView(GroupContextMixin, TemplateView):
    template_name = ...

    def get_context_data(self, **kwargs):
        ctx = super().get_context_data(**kwargs)
        # add grouped matches view specific stuff
        return ctx

除此之外,我还有一个测量功能,可以计算每秒输入数据包的数量。为了生成数据包,我配置了一个交换机,使其将所有数据包转发到接口(端口镜像)。也就是说,传入的数据包不是特定于此机器的。

鉴于此设置,我可以看到大约250个数据包/秒的速率。但是,如果我还并行运行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) ,则速率会突然上升到大约5000个数据包/秒。有趣的是,只有在前台运行tcpdump -n -i eth0时才会发生这种情况,例如tcpdump不会更改传入数据包的速率。

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

1 个答案:

答案 0 :(得分:0)

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