2014-06-24 30 views
5

następujący kod:Jak filtrować przez ethernet adres MAC

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

zgłasza błąd, ponieważ sniff spodziewa IP, a nie Mac.

Więc jak filtrować według MAC?

+0

Czy możesz korzystać z interfejsu? –

+0

Czy możesz wyjaśnić nieco głębiej? – bzupnick

Odpowiedz

1

co z określeniem lfilter dla sniff?

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


dst i src są atrybutami powąchał wiadomości.


wcześniej wysłałem odpowiedź, w której podano stop_filter. Przypuszczam, że to by nie działało dla ciebie, ponieważ scapy zatrzymałby się po odebraniu pierwszego pakietu, który pasuje do adresu mac z stop_filter. lfilter powinien wykonać zadanie.

z sendrecv.py:

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

Próbowałem twojej odpowiedzi z lfilter w moim scenariuszu i tłumaczu. Pingowałem z właściwego źródłowego adresu MAC i wydawało się, że nie sniff go. – bzupnick

+0

spróbuj pingować inny adres IP? – macfij

+0

Mój problem polegał na tym, że mój MAC miał wielkie litery, a Scapy dostarcza małe litery. Działa pięknie =) – bzupnick

2

Parametr filter potrzebuje filtra BPF. Poprawna składnia jest zatem filter="ether dst aa:bb:cc:dd:ee:ff".

Jest to (znacznie) szybsze niż użycie funkcji Pythona jako parametru lfilter, co zasugerował (poprawnie) użytkownik macfij w innej odpowiedzi (plus nie musisz zajmować się dużymi/małymi literami w adresach MAC).