如何按以太网MAC地址过滤

5 投票
2 回答
8637 浏览
提问于 2025-04-18 10:53

下面这段代码:

sniff(filter = "dst aa:bb:cc:dd:ee" ) 

会报错,因为 sniff 这个函数是需要一个IP地址,而不是MAC地址。

那你该怎么用MAC地址来过滤呢?

2 个回答

2

filter参数需要一个BPF过滤器。因此,正确的写法是filter="ether dst aa:bb:cc:dd:ee:ff"

这样做比使用Python函数作为lfilter参数要快得多,正如macfij在另一个回答中所提到的(这也是正确的)。而且,你不需要处理MAC地址中的大小写问题。

2

关于为 sniff 指定一个 lfilter 呢?

zzz = sniff(lfilter=lambda d: d.src == 'aa:bb:cc:dd:ee:ff')


dstsrc 是被捕获消息的属性。


之前我发过一个回答,里面提到了 stop_filter 的使用。我想这对你可能不太适用,因为 scapy 在接收到第一个匹配 stop_filter 中的 MAC 地址的数据包后就会停止。使用 lfilter 应该能解决这个问题。

来自 sendrecv.py

lfilter: python function applied to each packet to determine                   
         if further action may be done                                         
         ex: lfilter = lambda x: x.haslayer(Padding)

撰写回答