如何按以太网MAC地址过滤
下面这段代码:
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')
dst
和 src
是被捕获消息的属性。
之前我发过一个回答,里面提到了 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)