[Update Nr. 3] Tragbar: Raspberry Pi als WLAN-Repeater

Raspberry Pi als WLAN-Repeater
Raspberry Pi mit zwei USB-WLAN-Sticks (EDIMAX EW-7811UN oben und TP-Link TL-WN722N unten) als tragbarer WLAN-Repeater

Unser Garten liegt nicht weit von unserem Wohnhaus entfernt, ich schätze die Entfernung auf ca. 20 m. Aber leider reicht das WLAN meiner FRITZ!Box 3390 nicht zuverlässig bis in alle seine Ecken, sodass es bisher nicht möglich war, mal surfend mit dem Notebook auf der Bank zu sitzen oder beim Gartenbau Webradio per Smartphone zu hören. Etwas musste passieren – ein tragbarer WLAN-Repeater musste her!

Ein Blick auf das Power Pack mit 10.000mAh, welches ich vor kurzem geschenkt bekommen hatte, beförderte in mir die Idee: „Es muss doch möglich sein, einen Raspberry Pi als WLAN-Repeater zu benutzen?!“ Etwas Suche im Netz brachte mich dann zur Seite von eggIT (Quelle 1), wo anscheinend genau das beschrieben wird, was ich suchte. Die Komponenten waren klar beschrieben und schnell bestellt. Leider waren meine Versuche der Umsetzung nicht von Erfolg gekrönt, und ich ließ das Projekt erst einmal (auch wg. anderer zeitfressender Tätigkeiten) etwas ruhen. Aber der Sommer nahte (tut dies immer noch :)), die Gartenabende wurden länger und ich wollte mein WLAN im Garten!
Etwas Suche mit neuem Mut brachte mir dann zwei weitere Tutorials (Quellen 2 und 3), aus denen ich mir meine Lösung destilliert habe – der WLAN-Repeater läuft nun!

Anbei stelle ich für alle Interessierten die Anleitung bzw. alle relevanten Konfigurationsschritte bereit. Ich habe alle Konfigurationsschritte als root durchgeführt – RasPi-Nutzer wissen, was sie machen :)! Die Kurzübersicht:

  • wlan0 (Hardware: EDIMAX EW-7811UN) meldet sich in meinem Heimnetz (SSID: HomeWLAN) mit fester IP-Adresse an.
  • wlan1 (Hardware: TP-Link TL-WN722N) wird statisch zum Betrieb in einem eigenen Subnetz konfiguriert.
  • hostapd stellt mittels wlan1 ein eigenes WLAN (SSID: HomeWLANportable) bereit.
  • dnsmasq liefert IP-Adressen für alle Clients in HomeWLANportable.
  • iptables sorgt dafür, dass Anfragen aus HomeWLANportable ins Internet geleitet werden und von dort auch wieder mit Antworten versorgt werden. Geräte im HomeWLANportable können nicht auf Geräte im HomeWLAN zugreifen.

Die detaillierte Konfiguration sieht wie folgt aus:

1. Netzwerkgeräte einrichten

/etc/network/interfaces:
auto lo
auto wlan0
auto wlan1
iface lo inet loopback

# eth0 wird nur der Vollständigkeit halber konfiguriert, aber nicht gestartet
iface eth0 inet static
address 10.10.10.189
netmask 255.255.255.0

# Stick von EDIMAX
iface wlan0 inet static
address 10.10.10.190
netmask 255.255.255.0
gateway 10.10.10.187
wpa-driver wext
wpa-ssid HomeWLAN
wpa-ap-scan 1
wpa-proto RSN
wpa-pairwise CCMP
wpa-group CCMP
wpa-key-mgmt WPA-PSK
wpa-psk MYVERYSECRETWLANKEY

# Stick von TP-Link
iface wlan1 inet static
address 10.0.0.254
netmask 255.255.255.0

Anschließend zeigt ifconfig nach einen Neustart neben lo und eth0 nun wlan0 und wlan1. So weit, so gut. Weiter im Text…

2. hostapd installieren/konfigurieren

apt-get install hostapd
/etc/default/hostapd:
DAEMON_CONF="/etc/hostapd/hostapd.conf"
/etc/hostapd/hostapd.conf:
interface=wlan1
driver=nl80211
ssid=HomeWLANportable
channel=10
hw_mode=g
ieee80211n=1
country_code=DE
wpa=2
wpa_passphrase=MYOTHERVERYSECRETWLANKEY
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP
auth_algs=1

3. dnsmasq installieren/konfigurieren

apt-get install dnsmasq
/etc/dnsmasq.conf:
# Schnittstelle mit Adressvergabe per DHCP
interface=wlan1
# DHCP-Adressbereich minimal, maximal, Subnetzmaske, Lease-Gültigkeitsdauer
dhcp-range=10.0.0.1,10.0.0.253,255.255.255.0,1h
# RasPi als Standard-Gateway setzen
dhcp-option=option:router,10.0.0.254
# RasPi als DNS-Server setzen
dhcp-option=option:dns-server,10.0.0.254
# Logausgabe nach /var/log/syslog aktivieren
log-queries

Man kann auch den Router im HomeWLAN als Standardgateway und -DNS-Server eintragen. Da ich aber das HomeWLAN vor Zugriffen durch Geräte aus dem HomeWLANportable schützen will und meine FRITZ!Box unangetastet lassen möchte, muss die FRITZ!Box komplett transparent arbeiten können und darf in keiner Konfigurationsdatei den WLAN-Repeater betreffend auftauchen.

4. ifplugd anpassen

Um die Vergabe von IP-Adressen per dnsmasq zu ermöglichen, muss laut Quelle 4 noch folgende Anpassung durchgeführt werden:

/etc/default/ifplugd:
INTERFACES="eth0" # ehemals "auto"
HOTPLUG_INTERFACES="eth0" # ehemals "all"

Seltsamerweise ist diese Anpassung aktuell wirklich notwendig, damit DHCP funktioniert. Vor ca. einem halben Jahr, als ich den RasPi das erste Mal als WLAN-Repeater konfiguriert hatte, funktionierte alles auch ohne diesen Schritt.

Nach einem Neustart findet Smartphone und Co. das WLAN namens HomeWLANportable, können sich mittels des Schlüssels MYOTHERVERYSECRETWLANKEY einloggen, bekommen eine IP aus dem Bereich 10.0.0.1-10.0.0.253 zugewiesen – können aber noch nicht surfen.

5. IP-Forwarding aktivieren

/etc/sysctl.conf:
net.ipv4.ip_forward=1

6. iptables-Regeln aktivieren

# NAT für alle ausgehenden Pakete aktivieren
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

# eingehende Verbindungen aus dem HomeWLAN akzeptieren
iptables -A INPUT -s 10.10.10.0/24 -j ACCEPT
# DNS-Anfragen aus dem HomeWLANportable akzeptieren
iptables -A INPUT -p udp -m udp --dport 53 -m state --state NEW,ESTABLISHED -s 10.0.0.0/24 -j ACCEPT
# DHCP-Anfragen generell akzeptieren
iptables -A INPUT -p udp -m udp --dport 67 -m state --state NEW,ESTABLISHED -j ACCEPT
# default-Policy für INPUT-Kette auf DROP setzen
iptables -P INPUT DROP

# Zugriff auf Geräte im HomeWLAN aus dem HomeWLANportable heraus verhindern
iptables -A FORWARD -s 10.0.0.0/24 -d 10.10.10.0/24 -p all -j DROP
# Forwarding für Pakete aus dem HomeWLANportable in Richtung Internet aktivieren
iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
# Forwarding für Antwortpakete aus dem Internet in Richtung HomeWLANportable aktivieren
iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
# default-Policy für FORWARD-Kette auf DROP setzen
iptables -P FORWARD DROP

Nun können Geräte, die sich bei HomeWLANportable eingemeldet haben, das Internet komplett nutzen. Über eventuelle Einschränkungen, was erlaubte Ports und Protokolle angeht, sollte man auch nachdenken, um die Nutzung durch Gäste z.B. auf Web und E-Mail einzuschränken.

7. iptables-Regeln sichern und automatisches Laden aktivieren

iptables-save > /etc/HomeWLANportable.rules
am Ende der Datei /etc/network/interfaces folgende neue Zeile anfügen:
up iptables-restore < /etc/HomeWLANportable.rules

8. DNS-Auflösung konfigurieren

/etc/resolv.conf:
nameserver 10.10.10.187 # Haupt-DNS-Server des lokalen Netzes

9. hostapd und dnsmasq neu starten

service hostapd restart
service dnsmasq restart

Mit dieser Konfiguration habe ich nun jederzeit die Möglichkeit, WLAN-Empfang an per FRITZ!Box nicht gut versorgten Punkten zu ermöglichen, wenn der Repeater auf halber Strecke zur FB aufgestellt ist :)! Über Eure Kommentare bzgl. iptables-Regeln oder weitere Ideen zur Konfiguration freue ich jetzt schon – happy configuring!

Tragbarer WLAN-Repeater auf Basis eines Raspberry Pi in Aktion
Tragbarer WLAN-Repeater auf Basis eines Raspberry Pi in Aktion

Quellen:

  1. http://eggit.de/raspberry-pi-als-wlan-repeater/
  2. http://pantofflhelden.com/2013/02/raspberry-pi-wifi-repeater-im-eigenbau/
  3. http://www.pro-linux.de/artikel/2/1672
  4. http://sirlagz.net/2013/02/10/how-to-use-the-raspberry-pi-as-a-wireless-access-pointrouter-part-3b/

 

 

28 Gedanken zu „[Update Nr. 3] Tragbar: Raspberry Pi als WLAN-Repeater“

  1. Hallo Kay,

    Danke für Deine tolle Anleitung. Auch ich habe lange nach so etwas gesucht. Ich bin nun dabei, Deine Anleitung nachzubauen, habe aber dabei ein paar Probleme.

    Momentan benutze ich zu Testzwecken mein Handy als Router. Später möchte ich dann das WLAN/Internet des Nachbarn mit nutzen. (Erlaubnis vorhanden) Mein Handy vergibt Adressen aus dem IP-Bereich 192.168.43.*** Der Router des Nachbarn 192.168.2.*** Wenn alles läuft, werde ich den EDIMAX-Stick durch einen zweiten TL-WN722N mit einer 9 dBi-Antenne ersetzen. Für den hausinternen Test reicht der EDIMAX-Stick aus.

    Ich habe Deine Punkte 1-4 bereits abgearbeitet und bin soweit, dass ich das portable WLAN finde. (SSID Himbeerkuchen) Ich kann mich aber immer nur dann einwählen, wenn ich eine feste IP im Endgerät einstelle. (z.B. 10.0.0.1, Netzmaske 255.255.255.0, Gateway 10.0.0.254) Außerdem klappt die Weiterleitung ins Internet nicht und wenn ich versuche die iptables-Regeln zu aktivieren (Punkt 5), kommt die Fehlermeldung „iptables v1.4.14: can’t initialize iptables table `NAT‘: Table does not exist (do you need to insmod?) Perhaps iptables or your kernel needs to be upgraded.“? Das System habe ich aber heute Nacht aktualisieren lassen? Desweiteren macht mich stutzig, dass ich den RasperryPi nicht in der Übersicht der angemeldeten Geräte in meinem Handy (Router) finde? Anpingen geht, auch der Zugriff über SSH?

    Kannst Du mir bitte ein paar Tipps geben, was ich eventuell falsch gemacht haben könnte? Würde mich freuen, es doch noch zum Laufen zu bekommen. DANKE!

    Rainer

  2. Hallo Kay,

    ich melde mich nochmal. Nach dem ich meine Anfrage abgesendet hatte, hat sich auch Deine Website aktualisiert. Ich hatte noch eine zwischengespeicherte Seite. Uppps :-) Ich habe die Änderungen/Aktualisierungen bereits übernommen. Mittlerweile funktioniert das auch mit den iptables. Also einen kleinen Schritt weiter bin ich schon mal! :-) Bei Punkt 8 (Neustart hostapd) kommt allerdings: „[FAIL] Starting advanced IEEE 802.11 management: hostapd failed!“ Bis auf die geänderte SSID und den Passphrase ist alles wie bei Dir? (copy & paste)

    Vermutlich aufgrund des Fehlers, bleibt es trotzdem noch beim alten: Einwahl nur mit fester IP und sobald eine Website aufgerufen werden soll, erscheint sofort „Seitenladefehler“. Also keine Weiterleitung ins Internet.

    Rainer

  3. Hallo Rainer,

    schau Dir bitte den (neuen) Punkt Nr. 4 in meiner Anleitung an. Dieser ist aktuell anscheinend notwendig, anders konnte ich meinen RasPi auch nicht zum DHCP-Betrieb überreden. Lasse am besten am Anfang auch die iptables-Regeln für INPUT weg und die default-Policy auf ACCEPT stehen!

    Den Fehler während des Startens von hostapd bekomme ich auch manchmal, danach funktioniert der Start wieder. Ich weiß nicht, woran das liegt. Beide WLAN-Sticks müssen allerdings immer eingesteckt sein. Lasse ich den TP-LINK-Stick weg, erhalte ich den Fehler bereits beim Starten, da wlan1 fehlt – verständlich!

    Klappt es nun?

  4. Hallo Kay,

    Danke für Deinen neuen Tipp. Nachdem ich den neuen Punkt 4 eingearbeitet habe, funktioniert die automatische Einwahl über DHCP tatsächlich. Obwohl eth0 doch das kabelgebundene Netzwerk ist? Aber egal! Hauptsache, es funktioniert! :-)

    Zu Testzwecken habe ich bereits Fernsehen auf das Smartphone gestreamt und über X-Forwarding mit dem Midori-Browser des RasPi auf dem Laptop gesurft. Es ging zwar langsam (EDGE-Netz Handy), aber es hat funktioniert. Beim Anpingen von http://www.google.de über die Konsole erhielt ich auch Antwort. Nur das direkte Surfen über den Browser des Laptops hat noch nicht funktioniert. Es steht da „Verbinden“ und das Lämpchen des WLAN-Sticks blinkt ständig, aber die Seite öffnet sich nicht. Vermutlich hängt das mit den iptables zusammen. Wie kann ich das zurück setzen? Oder sollte ich noch ein mal ganz von vorn anfangen?

    Nochmals vielen Dank für Deine Mühe!

    Rainer

  5. Wie schaut denn die Ausgabe von iptables -L bei Eingabe als root in der RasPi-Konsole aus? Viel kann ja nicht mehr zum Erfolg fehlen, wenn sich das Notebook schon am RasPi-WLAN anmelden kann.

  6. Hallo Kay,

    Danke für Deine schnelle Antwort! Hier die Ausgabe von iptables -L als root:


    Chain INPUT (policy ACCEPT)
    target prot opt source destination

    Chain FORWARD (policy DROP)
    target prot opt source destination
    ACCEPT all -- anywhere anywhere
    ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED

    Chain OUTPUT (policy ACCEPT)
    target prot opt source destination

  7. Hi Rainer,

    die iptables-Konfiguration setzt man als root mittels iptables -F KETTE, also z.B. iptables -F FORWARD zurück. Aber Du brauchst wenigstens die FORWARD-Regeln sowie die nat-Regel, um den RasPi als Repeater zu betreiben. Mach mal bitte als root folgendes: iptables-save > /root/WLAN.rules und poste mal bitte den Inhalt der Datei. Der zeigt etwas nehr als iptables -L.
    Bekommt der Laptop denn eine IP aus dem angegebenen DHCP-Bereich zugewiesen? Stimmen die zugeteilten Angaben zu Standardgateway und DNS-Server? Bekommst Du Einträge zu sehen, wenn Du als root mittels tailf /var/log/syslog die Logdatei betrachtest (setzt den aktiven Eintrag log-queries in der Datei /etc/dnsmasq.conf voraus), während Du den Laptop mit dem WLAN verbindest und zu surfen versuchst?

  8. Hallo Kay,

    Danke für die Infos. Die iptables-Regeln belasse ich erst einmal so, wie sie sind.

    Zu Deinen Fragen:

    „Bekommt der Laptop eine IP aus dem angegebenen DHCP-Bereich?“ Antwort: JA (aktuell 10.0.0.184)
    „Stimmen die zugeteilten Angaben zu Standardgateway und DNS-Server?“ Antwort: Standardgateway aktuell 192.168.43.1 (eingetragen als nameserver in der Datei resolv.conf, zweiter Eintrag 127.0.0.1) DNS-Server 10.0.0.254 (eingetragen in der Datei dnmasq.conf)

    „Bekommst Du Einträge zu sehen, wenn Du als root mittels tailf /var/log/syslog die Logdatei betrachtest?“ Antwort: JA, folgende:


    root@raspberrypi:~# tailf /var/log/syslog
    Sep 5 18:18:30 raspberrypi dnsmasq[2096]: query[A] www.epson.com from 10.0.0.184
    Sep 5 18:18:30 raspberrypi dnsmasq[2096]: forwarded www.epson.com to 192.168.43.1
    Sep 5 18:18:31 raspberrypi dnsmasq[2096]: reply wmap.eai.epson.com is 208.152.64.30
    Sep 5 18:18:37 raspberrypi dnsmasq[2096]: query[A] www.bvb.de from 10.0.0.184
    Sep 5 18:18:37 raspberrypi dnsmasq[2096]: cached www.bvb.de is 87.193.191.101
    Sep 5 18:18:38 raspberrypi dnsmasq[2096]: query[A] blog.kay-farin.de from 10.0.0.184
    Sep 5 18:18:38 raspberrypi dnsmasq[2096]: forwarded blog.kay-farin.de to 192.168.43.1
    Sep 5 18:18:38 raspberrypi dnsmasq[2096]: reply blog.kay-farin.de is 194.116.187.25
    Sep 5 18:18:38 raspberrypi dnsmasq[2096]: query[A] blog.kay-farin.de from 10.0.0.184
    Sep 5 18:18:38 raspberrypi dnsmasq[2096]: cached blog.kay-farin.de is 194.116.187.25

    Ergebnis: Seite wird VERSUCHT, zu laden. Ladevorgang bricht dann ab und die Seite wurde NICHT geladen. Dies geht nur, bei DIREKTEM surfen über den RasPi. (X-Forwarding mit dem Midori-Browser)

    Hier noch der Inhalt der Datei WLAN.rules, ausgeführt als root:


    # Generated by iptables-save v1.4.14 on Fri Sep 5 18:04:58 2014
    *filter
    :INPUT ACCEPT [35448:38957807]
    :FORWARD DROP [0:0]
    :OUTPUT ACCEPT [50326:73460224]
    -A FORWARD -i wlan1 -o wlan0 -j ACCEPT
    -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    COMMIT
    # Completed on Fri Sep 5 18:04:58 2014

    Erneut Danke für Deine Hilfe und Mühe! Ich hoffe, Du kannst Dir aus meinen Antworten etwas entnehmen? Ach so, noch eine Entdeckung: Wenn ich im WLAN-Netz des Raspberry's den Host "raspberrypi" anpinge, antwortet dieser unter der IP 127.0.1.1? Ich kann ihn aber auch unter den IP's 10.0.0.254, sowie 192.168.43.254 anpingen.

    Rainer

  9. Hi Rainer,

    in Deiner iptables-Konfiguration fehlt die nat-Regel – kontrolliere das mal bitte!
    Wegen der IP-Adresse 127.0.1.1… schau mal hier, die Antwort klingt verständlich.
    Bitte verwechsle nicht Standardgateway und DNS-Server: in der Datei /etc/resolv.conf stehen die DNS-Server drin. Das Standardgateway kannst Du mittels route -n erkennen, es handelt sich um die IP-Adresse für das Ziel 0.0.0.0 . Im Beispiel siehst Du die Konfiguration eines bei LAN-Kabel angebundenen RasPi. Für den WLAN-Repeater sollte „Iface für 0.0.0.0 = wlan0“ gelten.

    pi@geordi ~ $ route -n
    Kernel-IP-Routentabelle
    Ziel Router Genmask Flags Metric Ref Use Iface
    0.0.0.0 10.10.10.187 0.0.0.0 UG 0 0 0 eth0
    10.10.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

    Aber ich tippe auf die fehlende nat-Regel – den Hinweis darauf habe ich oben in meinem Kommentar von heute um 9:02 Uhr ergänzt.

  10. Hallo Kay,

    schon wieder ich! :-) Ich wollte Dir jetzt gern schreiben, dass nun alles geht. Aber leider will es immer noch nicht? Ich habe nun doch die iptables-Regeln mit iptables -F INPUT und iptables -F FORWARD zurück gesetzt. Dann habe ich nur die „nat-Regel“ sowie die beiden FORWARD-Regeln, die den Datenverkehr ins Internet sowie aus dem Internet regeln übernommen. Jeweils alles als root. Es bleibt aber dabei: Die Website versucht zu laden (Laptop) und bricht dann irgendwann ab? Ich verstehe es nicht, was mache ich denn falsch?

    Hier noch meine Ausgabe von route -n

    Gruß Rainer


    pi@raspberrypi ~ $ route -n
    Kernel-IP-Routentabelle
    Ziel Router Genmask Flags Metric Ref Use Iface
    0.0.0.0 192.168.43.1 0.0.0.0 UG 0 0 0 wlan0
    10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan1
    192.168.43.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0

Schreibe einen Kommentar

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