}
abonneren

Eigen wifi-scanner bouwen met Raspberry Pi

wifi-scanner bouwen

Inhoudsopgave

  1. Inleiding
  2. Lees verder op de volgende pagina

Voordat je verdergaat is het belangrijk te testen of de Pi de managementframes goed ontvangt. Tcpdump is daar de juiste tool voor. Het staat er bekend om tcp/ip-packets te dumpen van een netwerkinterface. Maar tcpdump kan ook andere protocollen interpreteren waaronder 802.11-frames. Daarbij is tcpdump sowieso nodig voor de scripts die je straks installeert.

Tcpdump installeren

Installeer tcpdump met

sudo apt-get install tcpdump

Start tcpdump met:

sudo tcpdump -I -i wlan0 -e type mgt subtype probe-req

Dit staat kortgezegd voor: toon alle probe-requests die wlan0 opvangt. Er verschijnt een lijst met managementframes met bijna achterin de tekst probe request gevolgd door de ssid tussen haakjes. Met de optie -w <bestandsnaam> kan de output van tcpdump eventueel naar een pcap-bestand verstuurd worden om het met Wireshark te kunnen bekijken. Een accesspoint hoeft niet altijd een ssid te hebben en dat verklaart waarom er soms geen ssid bekend is.

Verschijnt er niks, maar staat er ook geen foutmelding? Dan kan het zijn dat er geen mobile stations in de buurt zijn. Wacht eventueel een paar minuten of pak zelf een mobile station zoals een telefoon en schakel de wifi uit/in. Dat zorgt er meestal voor dat de telefoon managementframes begint uit te zenden. Verschijnt de lijst met managementframes wel in beeld dan werkt de hardware goed en is de Pi klaar om verder ingericht te worden.

wifi-scanner bouwen

Managementframes opslaan in database

Alle opgepikte managementframes moeten opgeslagen worden in een lange-termijn-opslag omdat de frames later weer opvraagbaar moeten zijn. De Pi zou bijvoorbeeld ergens neergelegd kunnen worden om hem vervolgens enkele dagen later weer op te halen. Maar ook als de Pi via internet of wifi benaderbaar moet zijn, zal de historie van de opgepikte frames opvraag moeten blijven. Kortom, een database is nodig en in dit geval zijn de twee redelijke opties MySQL en SQLite. SQLite heeft als nadeel dat het slechter omgaat met gelijktijdige verbindingen en die gaan zeker voorkomen als er tegelijkertijd data ingevoerd en uitgelezen gaat worden. Daarom verdient MySQL de voorkeur. Start

sudo apt-get install mysql-server --fix-missing

en volg de aanwijzingen. Onthoud het wachtwoord voor root goed. Installeer de MySQL library voor Python:

sudo apt-get install python-mysqldb

. Installeer de databasetabellen met behulp van het script

~/pcm_wifiscanner/setup_db.py

uit de eerdergenoemde git-repository. Dat script creëert een database met de naam wifiscanner met drie tabellen mobile_stations, ssids en probe_requests. Het script maakt ook een MySQL-gebruiker aan met de naam wifiscan en het wachtwoord wifiscan. In de tabel mobile_stations worden alle gevonden mac-adressen verzameld. Dat adres is semi-uniek. Het is aan te passen, maar dat doen niet veel gebruikers dus gemakshalve wordt het mac-adres gebruikt als unieke identificatie van een mobile stations. In de tabel ssids worden alle gevonden ssid’s verzameld.

In de tabel probe_requests worden alle ssid’s behorende bij een mac-adres verzameld samen met signaalsterke en een timestamp. Het mac-adres wordt als string opgeslagen. Dit had natuurlijk ook gewoon een integer kunnen zijn want een mac-adres is niets anders dan een getal. Maar de database is wat makkelijker te bekijken als de mac-adressen er als strings in staan. Performance en opslagruimte is niet direct prioriteit in dit geval.

Dumpdaemon installeren en instellen

Op de achtergrond moet er een script gaan draaien waarmee de uitvoer van tcpdump uiteindelijk in de database terechtkomt. Deze dumpdaemon moet voldoen aan een paar eisen waarvan de belangrijkste twee zijn dat het moet starten na het booten van de Pi en dat het eeuwig blijft doordraaien, wat er ook gebeurt. Stel dat tcpdump vastloopt dan moet het script tcpdump gewoon weer opstarten. Verder wisselt de dumpdaemon het actieve 802.11-kanaal van wlan0. Sommige mobile stations verzenden namelijk alleen probe-requests over een specifiek kanaal. Installeer en start de dumpdaemon:

sudo cp ~/pcm_wifiscanner/dumpdaemon/dumpdaemon.service /etc/systemd/system && sudo chmod 664 /etc/systemd/system/dumpdaemon.service && sudo systemctl daemon-reload && sudo systemctl enable dumpdaemon.service && sudo systemctl start dumpdaemon.service

Deze daemon start ~/pcm_wifiscanner/dumpdaemon/dump_mfs.py en blijft deze herstarten na een eventuele crash. Gebruik

sudo journalctl -u dumpdaemon.service

om te controleren of de daemon gestart is. Na een tijdje zal de MySQL-database gegevens gaan bevatten. Controleer dat met de view die aangemaakt werd in setup_db.py:

mysql -u wifiscan -pwifiscan -D wifiscanner -e 'SELECT * FROM view_requests'

Er hoort een leesbare tabel te verschijnen. Staat er niets, wacht dan nog enkele minuten en zorg dat er mobile stations in de buurt zijn. Vanaf nu wordt bij het starten van de Pi de database automatisch gevuld met gevonden probe-requests van mobile stations in de buurt.

wifi-scanner bouwen

Gebruik de webinterface

Alle probe-requests worden nu opgeslagen in een database, maar dat is bijna onleesbaar en onhandelbaar voor een mens. Een webinterface kan realtime tonen welke accesspoints gezocht worden door mobile stations in de buurt. Verder kan het informatie weergeven die de afgelopen tijd is verzameld. Dat geeft antwoord op vragen als: ‘wanneer is deze telefoon voor het laatst in de buurt geweest?’. Een webinterface voor de Pi is het snelst te ontwikkelen in php. Het voert in dit artikel te ver om een volledige webinterface op te tuigen.

In de git-repository is een reeds ontwikkelde webinterface aanwezig. Deze moet alleen nog geïnstalleerd worden op de Pi zodat de interface altijd actief en opvraagbaar is op poort 80. Installeer eerst de webserver Apache op de Pi:

sudo apt-get install apache2

. Controleer of de webserver draait op http://<ip_adres_pi>. Installeer dan php:

sudo apt-get install php5 libapache2-mod-php5 php5-mysql

Herstart Apache2:

sudo systemctl restart apache2

Kopieer de webinterface uit de git-repository naar /var/www/html:

sudo cp -R ~/pcm_wifiscanner/webinterface/* /var/www/html

Controleer of de webinterface nu in de browser verschijnt. De webinterface toont een lijst met mobile stations met daarachter de gevonden accesspoints en het tijdstip dat het mobile station voor het laatst is gezien. Elke vijf seconden vraagt de webinterface aan de Pi of er nieuwe mobile stations zijn gevonden en óf er mobile stations opnieuw zijn gezien. Elke mobile station dat (op)nieuw is gezien, wordt bovenin de tabel geplaatst en de lijst met accesspoints wordt dan bijgewerkt. De twee knoppen bovenin spreken voor zich.

wifi-scanner bouwen

Uitbreidingen

De webinterface is redelijk kaal op dit moment. Er zitten weinig visuele elementen in en het geheel is nogal statisch. Dat nodigt uit om de webinterface naar eigen inzicht aan te passen en te verbeteren. Denk bijvoorbeeld aan het creëren van een tijdlijn per mobile station of het ontwikkelen van een zoekfunctie.

De interface is ontwikkeld in php met Bootstrap als css-framework. Dat maakt het voor iedereen met enige ervaring in web-ontwikkeling mogelijk om de interface naar eigen wens aan te passen. In het bestand pcm_wifiscanner/webinterface/api.php is af te lezen hoe de database bevraagd kan worden. Dat bestand wordt nu gebruikt om de updates op te vragen vanuit de interface. Verder is de Pi eventueel uit te breiden met een gps-module. Op die manier kun je de locatie van de Pi vastleggen per moment dat een mobile station wordt gezien.

Mocht je vervolgens gaan rondrijden met de Pi dan heb je na verloop van tijd een hele database met locaties waar bijvoorbeeld telefoons zijn gezien. De nauwkeurigheid is de straal waarin mobile stations worden gezien door de Pi. Hoe groter het bereik, hoe lager de nauwkeurigheid van de locatie. Een ander voordeel van de gps-module is dat er vaak een realtime-klok in zit waarvan de Pi de actuele tijd kan aflezen.

Wil je echt volledig onafhankelijk zijn van externe bekabeling? Bestel dan een gps-module én een powerpack van 12.000 mAh die 2,1 ampère stroom kan leveren. Dan heb je geen voeding en geen internet nodig.

Geschreven door: Redactie PCM op

Category: Workshop, Netwerk

Tags: Hack, internet, Raspberry Pi, Wifi

Laatste Vacatures

Uitgelicht: Technisch Applicatiebeheerder - CGI