以太网嗅探器没有捕获所有内容,它可以并行使用 tcpdump
Ethernet sniffer not capturing everything, with tcpdump in parallel it does
我在 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 packets/sec 的比率。但是,如果我同时 运行 tcpdump -n -i eth0
,速率突然上升到大约 5000 packets/sec。有趣的是,只有当我 运行 tcpdump
在前台时才会发生这种情况,例如tcpdump -n -i eth0 > foo
不改变传入数据包的速率。
问题是:当 运行 在前台时 tcpdump 有什么不同,因此包的速率要高得多,以及如何在 python 嗅探器中启用此行为?
原来这是一个人为的错误。由于嗅探器在其流量也被镜像的服务器上工作,因此当通过 SSH 在终端上进行操作时,数据包速率总是上升。
我在 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 packets/sec 的比率。但是,如果我同时 运行 tcpdump -n -i eth0
,速率突然上升到大约 5000 packets/sec。有趣的是,只有当我 运行 tcpdump
在前台时才会发生这种情况,例如tcpdump -n -i eth0 > foo
不改变传入数据包的速率。
问题是:当 运行 在前台时 tcpdump 有什么不同,因此包的速率要高得多,以及如何在 python 嗅探器中启用此行为?
原来这是一个人为的错误。由于嗅探器在其流量也被镜像的服务器上工作,因此当通过 SSH 在终端上进行操作时,数据包速率总是上升。