Raspberry Pi als WLAN-AccessPoint

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.

Facebooktwittergoogle_plusmail

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *