In diesem Beitrag erkläre ich, wie man einen Raspberry Pi als WLAN-AccessPoint betreibt und dabei ein eigenes Netz für die Geräte im WLAN aufbaut, welches über NAT mit iptables in ein bestehendes Netzwerk eingebunden wird. Zum Schluss wird noch eine Möglichkeit vorgestellt, verbundene WLAN-Geräte und den Access-Point selbst über eine Weboberfläche zu überwachen.
Was wird benötigt?
- Raspberry Pi mit SD-Karte und installiertem Raspbian – in diesem Tutorial verwende ich einen ausgemusterten Raspberry Pi Modell B mit aktuellem Raspbian Jessie
- WLAN-Stick – Der Stick muss von Linux supported werden (ob der Stick kompatibel ist, siehe Vorbereitung)
- Ethernet-Kabel, um den Raspberry ans vorhandene Netzwerk anzuschließen
Vorbereitung
Einen Hinweis darüber, ob das verwendete WLAN-Modul überhaupt kompatibel ist, gibt der Befehl
iw list
Wenn in der Ausgabe * AP gelistet wird, ist der WLAN-Stick in der Lage, als AccessPoint zu dienen. Sollte das nicht der Fall sein, gibt diese Seite einen Überblick über funktionierende WLAN-Module
Vorbereitend sollten noch die derzeit installierten Pakete aktualisiert werden. Das erledigen wir mit apt-get:
sudo apt-get update sudo apt-get upgrade
Die zusätzlich benötigen Pakete werden mit einer Zeile installiert:
sudo apt-get install hostapd dnsmasq apache2 php5
Hostapd ist der Dienst, welcher aus unserem WLAN-Modul einen AccessPoint macht. Dnsmasq verwenden wir als DHCP-Server. Wenn bereits ein DHCP-Server im Netzwerk vorhanden ist, ist die Installation nicht nötig. Der Apache ist später nötig, um die laufenden Dienste und angemeldeten Geräte über den Webbrowser zu monitoren.
Als Netzwerk für die WLAN-Clients verwende ich in diesem Tutorial das Netz 10.0.0.0/24. Dies kann natürlich je nach Wunsch angepasst werden. Vorab muss schon mal das WLAN-Interface die richtige IP-Adresse bekommen:
sudo ifconfig wlan0 10.0.0.1/24 up
Damit legen wir die IP-Adresse des Interfaces wlan0 auf 10.0.0.1 und die Subnetzmaske auf 255.255.255.0 ( /24 ). Wenn der Raspi kein NAT betreiben soll, dann muss hier eine noch nicht vergebene IP-Adresse aus dem bereits vorhandenen Subnetz verwendet werden
Konfiguration
hostapd
Zuerst wird die hostapd.conf erstellt werden.
sudo nano /etc/hostapd/hostapd.conf
Die Konfigurationsdatei wird nicht automatisch durch die Installation von hostapd angelegt.
Meine Beispielkonfiguration sieht so aus:
interface=wlan0 driver=nl80211 ctrl_interface=/var/run/hostapd ctrl_interface_group=0 ssid=WLAN-SSID channel=6 wmm_enabled=0 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=CHANGE_ME wpa_key_mgmt=WPA-PSK wpa_pairwise=TKIP ieee80211n=1 hw_mode=g
die meisten Parameter sollten klar sein. Die SSID und das Passwort müssen natürlich entsprechend anpasst werden. Dann mit STRG + X den Editor beenden und die Änderungen mit Y Speichern. Anschließend mit ENTER bestätigen. Für einen kurzen Test, ob hostapd funktioniert, führen wir den Befehl
sudo hostapd -dd /etc/hostapd/hostapd.conf
aus. Das -dd steht hierbei für den Debug-Modus, welcher bei etwaigen Fehler etwas mehr zu Protokoll gibt. Klappt alles, kann hostapd mit STRG + C wieder beendet werden.
dnsmasq
Die Konfiguration von dnsmasq ist nicht nötig, wenn der Raspi kein NAT betreiben soll und die WLAN-Clients im bereits vorhandenen Netzwerk sein sollen, wo bereits ein DHCP-Server existiert (z.B. Fritzbox).
Als nächstes müssen wir die Konfiguration von dnsmaq anpassen. Das neue Subnetz für die WLAN-Clients soll das 10.0.0.0/24 Netz werden. Alternativ sind natürlich auch andere Subnetze möglich. Dazu öffnen wir die Datei /etc/dnsmasq.conf. Diese sollte bei der Installation bereits angelegt worden sein.
sudo nano /etc/dnsmasq.conf
Meine Bespielkonfiguration für die dnsmasq.conf:
interface=wlan0 dhcp-range=10.0.0.10,10.0.0.99,255.255.255.0,12h dhcp-option=3,10.0.0.1 dhcp-option=option:dns-server,8.8.8.8
Damit legt man den IP-Adressbereich für die WLAN-Clients auf den Bereich von 10.0.0.10 bis 10.0.0.99 fest. Die Leasetime (wie lange die IP-Adresse für den Client reserviert ist) ist in diesem Beispiel auf 12 Stunden festgelegt. Die dhcp-option=3 legt das Standardgateway fest. In diesem Fall ist das unser Raspberry selbst, da er uns auch als Router und NAT dient. als Standard DNS-Server wird in diesem Beispiel der 8.8.8.8 (Google-DNS-Server) an den Client übergeben. Alternativ kann man hier auch die IP seiner Fritzbox o.ä. eintragen, um auch Netzwerkgeräte innerhalb des eigenen Netzwerks auflösen zu können.
Wieder mit STRG + X den Editor beenden und die Änderungen speichern (Y und dann ENTER)
iptables
Für das NAT und das Routing ins vorhandene Lokale Netzwerk nutze ich iptables. Meine Beispielkonfiguration:
sudo iptables -A FORWARD -o eth0 -i wlan0 -m conntrack --ctstate NEW -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -t nat -F POSTROUTING sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Damit legen wir fest, dass der Datenverkehr vom Interface wlan0 über eth0 geroutet werden soll. Des Weiteren wird definiert, dass das Interface wlan0 „maskiert“ wird, es sich hierbei also um ein NAT handelt und der gesamte Verkehr zwischen wlan0 und eth0 mit der gleichen IP-Adresse (10.0.0.1) im eth0-Netzwerk abgewickelt wird. Egal für welchen Client im WLAN. Für die Lösung ohne NAT müssen die letzten beiden Zeilen weggelassen werden.
Startscript
Um die ganze Geschichte nicht bei jedem Neustart des Raspberrys erneut eingeben zu müssen, sollte ein Startscript angelegt werden, welches diese Aufgabe übernimmt. Dazu habe ich direkt unter /etc/ ein script angelegt, welches bei jedem Start des Raspberrys ausgeführt wird.
sudo nano /etc/wlan_start
Dieses Script könnte wie folgt aussehen. (Für die Lösung ohne NAT, müssen die iptables-Anweisungen wie oben beschrieben angepasst werden):
# Anfang der iptables iptables -A FORWARD -o eth0 -i wlan0 -m conntrack --ctstate NEW -j ACCEPT iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -t nat -F POSTROUTING iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE # ENDE der iptables # Anfang Netzwerk-Settings ifconfig wlan0 10.0.0.1/24 up screen -A -m -d -S hostapd sudo hostapd /etc/hostapd/hostapd.conf
Damit werden die oben genannten iptables Regeln geladen und die Netzwerkkonfigurationen gesetzt. Der Letzte Befehl startet hostapd über Screen. Das hat den Vorteil, dass man auch über SSH live verfolgen kann, was hostapd gerade macht. Mit STRG + X wird nano wieder beendet (Speichern und Bestätigen). Um das Script ausführbar zu machen muss die Berechtigung angepasst werden:
sudo chmod +x wlan_start
erlaubt es, das Script auszuführen.
Dass das Script auch bei jedem Start ausgeführt wird, muss es in der Datei /etc/rc.local aufgerufen werden. Dazu diese Datei mit nano öffnen
sudo nano /etc/rc.local
und am Ende (vor exit 0) den Pfad des Startscripts eintragen. So sollte die Datei dann aussehen:
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. # Print the IP address _IP=$(hostname -I) || true if [ "$_IP" ]; then printf "My IP address is %s\n" "$_IP" fi /etc/firewall_wlan0 exit 0
Nano muss nun wieder mit STRG + X beendet werden. Mit Y und anschließend ENTER werden die Änderungen gespeichert.
Nun noch einen Neustart durchführen und euer WLAN-AccessPoint sollte schon funktionieren. 🙂
Mit dem Befehl
sudo screen -r hostapd
kann dann (z.B. über SSH) auf die Log-Ausgabe von hostapd zugegriffen werden. Screen verlasst ihr übrigens wieder mit STRG + A + D.
Weboberfläche
Schöner, als jedes mal über SSH auf den Raspi zuzugreifen, um zu sehen, ob noch alles glatt läuft, ist natürlich ein Webinterface. Dazu habe ich mich bereits existierendem Code angenommen (Warum das Rad neu erfinden!?). Nachdem ich mir einige PHP-Scripte angesehen habe, gefiel mir am Besten das RaspAP-WebGUI.
Die offizielle Installationsanleitung auf Englisch findet sich hier. Trotzdem habe ich diese kurz zusammengefasst.
Zur Installation müssen zunächst die Rechte für den User www-data angepasst werden, da unter diesem User der Webserver läuft und dieser ja schließlich die Befehle ausführen soll. Dazu ist die Datei /etc/sudoers mit
sudo nano /etc/sudoers
zu öffnen und am Ende der Datei folgende „Zeile“ einzutragen:
www-data ALL=(ALL) NOPASSWD: /sbin/ifdown wlan0, /sbin/ifup wlan0, /bin/cat /etc/wpa_supplicant/wpa_supplicant.conf, /bin/cp /tmp/wifidata /etc/wpa_supplicant/wpa_supplicant.conf, /sbin/wpa_cli scan_results, /sbin/wpa_cli scan, /bin/cp /tmp/hostapddata /etc/hostapd/hostapd.conf, /etc/init.d/hostapd start, /etc/init.d/hostapd stop, /etc/init.d/dnsmasq start, /etc/init.d/dnsmasq stop, /bin/cp /tmp/dhcpddata /etc/dnsmasq.conf
Dies erlaubt dem Benutzer www-data das ausführen der genannten Befehle, für welche normalerweise root-Rechte vonnöten wären. Anschließend können schon die Dateien über git heruntergeladen werden:
sudo git clone https://github.com/billz/raspap-webgui /var/www
Die heruntergeladenen Dateien müssen nun noch dem Benutzer www-data als Besitzer zugeordnet werden, sodass er diese auch ausführen kann:
sudo chown -R www-data:www-data /var/www
nach einem Neustart kann man im Browser die IP-Adresse des Raspberrys eingeben und landet dann auf der Konfigurationsseite von RaspAP. Dort kann auch die Konfiguration von hostapd und dnsmasq eingeschränkt vorgenommen werden.
Viel Spaß beim Nachmachen. Bei Problemen könnt ihr mir auch einen Kommentar hinterlassen.