Potrzebuję sposobu na pobranie adresów MAC z mojego routera na potrzeby projektu „Who's Home”

11

Tego rodzaju projekt był wcześniej wykonywany za pomocą Bluetooth, ale zasięg 30 stóp i dodatkowe zużycie baterii sprawiają, że chcę po prostu pingować router zamiast telefonów ludzi. Wiem, że routery śledzą unikalne adresy MAC dla każdego urządzenia. Miałem nadzieję zarejestrować adres każdego telefonu i zlecić PI okresowe sprawdzanie routera, aby zaktualizować dynamiczną stronę internetową, aby wyświetlić, kto jest w domu.

Chcę wiedzieć, czy istnieje rozsądny sposób na pobranie tych informacji z PI.

Codiush
źródło
co z wifi (zamiast tego pinguj nazwy hostów na telefony)?
user236012
2
Możesz także przypisać statyczne adresy IP z routera, a następnie użyć nmap i adresów IP do identyfikacji urządzeń.
ArtOfCode
Zrobiłem coś podobnego w C # w systemie Windows tutaj: stackoverflow.com/questions/2567107/... - Z przyjemnością prześlemy ci najnowszy kod wersji, jeśli chcesz. Nie wiem, jak użyteczny jest C # na Raspberry Pi, ale powinien on wskazywać właściwy kierunek. Niezawodnie wykrywa, że ​​jestem w domu, zanim jeszcze wrócę z garażu.
Aric TenEyck
Przechwytuję to i wiele więcej informacji, umieszczając skrypt routera, który co minutę publikuje wyniki na serwerze WWW. Za pomocą tego systemu monitoruję i zarządzam czasem działania Internetu, podłączonymi klientami, adresami WAN IP, tłumieniem światłowodów i budżetem energii, usługami VOIP, hasłami Wi-Fi itp. Przebieg różni się w zależności od mocy procesora routera.
EDP
1
Skrobanie ekranu na routerze? Możesz także dokonać aktualizacji do routera opartego na systemie Linux (openwrt) i po prostu zalogować się i przejrzeć pamięć podręczną arp.
Thorbjørn Ravn Andersen

Odpowiedzi:

6

To jest możliwe. Sugeruję podanie skryptu danych logowania i przeczytanie strony wyświetlającej informacje. Następnie możesz przeanalizować jego zawartość i wypełnić tablicę żądanymi danymi. Ponieważ te strony czasami zawierają więcej informacji, takich jak daty i czas, możesz stworzyć naprawdę fajny dziennik.

Oto szybki przykład, jak postąpiłbym;

Na stronie routera można znaleźć coś takiego:

<div id="flex">
 <div id="dm-name">
  name : Your_device_name
 </div>
 <div id="dm-ip">
  IP : 192.168.x.xxx
 </div>
 <div id="dm-mac">
  <span>MAC:D4:04:CD:FE:5A:17</span>
 </div>
</div>

Więc wiemy Wright, że każde urządzenie będzie na liście w ten sposób. I że wszystkie adresy MAC będą miały tę samą długość.

Skrypt może być coś takiego;

var string_to_parse = "file read from router.html";
cursor = 0;  // The position of your cursor;
i =0;
    while(cursor > 0){

    begin_at = string_to_parse.indeOf('MAC:');
    end_at = length_of_Mac; // this is standard for al mac

    mac[i] = string_to_parse.substring(begin_at, begin_at + end_at);
    cursor = begin_at + end_at;
i++;
    }

Ten kod będzie wymagał ulepszenia, ale pomysł już istnieje. Jest to pętla, która uruchomi cały plik, aby znaleźć cały adres Mac. aż dojdzie do końca pliku.

MadeInDreams
źródło
Tak bym zrobił. Ma dodatkową zaletę wykrywania, czy router nie działa.
slebetman
1
+1 Skrobanie strony internetowej jest interesującym wyborem. Jestem lekko zirytowany, że sam o tym nie pomyślałem.
Jacobm001
@MadeInDreams Strona routera, do której się odwołujesz, to strona dzierżawy DHCP routera? Czy istnieje strona połączenia z routerem?
Chetan Bhargava
Zależy od routera, ale większość z nich ma stronę z listą wszystkich podłączonych urządzeń. Ten przykład pochodzi z mojej głównej strony sieci
MadeInDreams
6

Aby śledzić unikalne adresy Mac na twoim Raspberry Pi, potrzebujesz narzędzia (raczej usługi) o nazwie arpwatch . Używałem arpwatch na BSD i loguje on wszystkie żądania arp i rarp do syslog.

Z Syslog możesz analizować daty i godziny oraz adresy mac.

ARP działa, a tabela istnieje tylko w sieci fizycznej (słowo techniczne: domena kolizyjna). Gdy pakiet wychodzi do innej sieci, źródłowy adres mac jest zastępowany adresem mac routera.

Uruchomienie arppolecenia na Raspberry Pi wyświetli tylko adresy mac + IP hostów, którzy dokonali transakcji (komunikacja IP) z hostem, na którym uruchomiono polecenie (Raspberry Pi). To będzie nie listy adresów MAC innych komputerów w sieci.

Innym zaawansowanym sposobem byłoby użycie nmap na twoim Raspberry Pi do wykrycia hosta. Możesz użyć nmap -sPdo pingowania wszystkich hostów w sieci. Poda ci adresy IP wszystkich aktywnych hostów w twojej sieci. Następnie możesz uruchomić polecenie arp, aby dowiedzieć się, kto jest aktywny.

chetan@Linux:~$ nmap -sP 192.168.100.0/24

Starting Nmap 6.40 ( http://nmap.org ) at 2016-02-23 16:08 PST
Nmap scan report for 192.168.100.4
Host is up (0.0087s latency).
Nmap scan report for 192.168.100.58
Host is up (0.0024s latency).
Nmap scan report for 192.168.100.160
Host is up (0.049s latency).
Nmap scan report for 192.168.100.164
Host is up (0.063s latency).
Nmap done: 256 IP addresses (4 hosts up) scanned in 2.68 seconds
Chetan Bhargava
źródło
1
Myślę, że jest to prawdopodobnie znacznie bardziej niezawodna i elastyczna metoda niż skrobanie stron internetowych. Na wielu routerach wydanych przez dostawcę usług internetowych strona, która ma pokazywać podłączone urządzenia z informacjami, nie będzie wiarygodna.
złotowłosa
@Goldilocks +1, tak, pomyślałem o tym po głosowaniu za zaakceptowaną odpowiedzią. Zakładam, że mają router ze stroną dla aktywnych połączeń (status SPI lub podobny). Mają fajny router.
Chetan Bhargava
4

Właśnie bawiłem się wersją palca wiersza poleceń . Wykonuje przyzwoitą robotę, znajdując wszystko w sieci i wyrzucając pliki CSV zawierające:

  • adres IP
  • Niestandardowa nazwa węzła (jeśli przypisałeś niestandardowe nazwy w pliku .properties)
  • Stan (GÓRA / DÓŁ)
  • Znacznik czasu ostatniej zmiany
  • Nazwa hosta (jeśli masz włączony DNS)
  • Adres sprzętowy (jeśli odnajdujesz sieć lokalną)
  • Dostawca sprzętu

Zgodnie z poprzednimi odpowiedziami, aby wprowadzić zawartość plików CSV na stronę internetową, konieczna byłaby manipulacja tekstem i uważaj na to, co publikujesz na zewnątrz.

Bardzo często korzystałem z wersji na Androida i dobrze znajduję wszystko w mojej domowej sieci (i rodzaj zabawy z publiczną siecią Wi-Fi).

goobering
źródło
3

Polecenie arpwyświetli listę urządzeń podłączonych do sieci. Będziesz musiał wykonać podstawową manipulację ciągiem, aby uzyskać potrzebne dane, ale z pewnością byłoby to łatwiejsze niż próba uzyskania informacji samodzielnie.

Uwaga dotycząca funkcjonalności :

Niektóre routery domyślnie blokują tego typu funkcje, a twój może być skonfigurowany jako taki. Jeśli to nie działa, przejrzyj trochę jego dokumentację, aby sprawdzić, jak na to zezwolić.

UWAGA BEZPIECZEŃSTWA :

Istnieje kilka bardzo poważnych konsekwencji bezpieczeństwa związanych z posiadaniem strony internetowej, która wyświetla, kto jest obecnie w domu. Proszę bardzo uważnie zastanowić się nad zapewnionym bezpieczeństwem i czy jest ono wystarczające dla danego ryzyka.

Jacobm001
źródło
Dobry pomysł, myślę, że wycofuję mój poprzedni komentarz.
Ghanima
1
Istnieje kilka ciekawych patrząc ostrzeżenia odnośnie korzystania z protokołu ARP do tego tutaj . Sugerują, że urządzenia mogą się nie wyświetlać, jeśli nie wysłały żadnych pakietów do urządzenia z uruchomionym arp, i że ping może być konieczny.
goobering
@goobering +1. samo uruchomienie polecenia arp nie spowoduje wyświetlenia wszystkich aktywnych hostów w sieci. Arpwatch zarejestruje wszystkie pakiety arp w sieci.
Chetan Bhargava
1

Można to zrobić, a inni ludzie zasugerowali kilka dobrych metod. Kilka lat temu napisałem skrypt Pythona, aby zeskrobać te informacje z routera netgear i rzucić je na github. Można go znaleźć tutaj . Jest prymitywny i patrząc na to teraz przerobiłbym go nieco inaczej, ale działał właściwie w tym samym celu, do jakiego dążysz przez kilka lat, dopóki się nie przeprowadziłem.

Ed.
źródło
+1 Twój skrypt można z pewnością poprawić, ale to świetne rozwiązanie problemu.
Jacobm001