[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,

    es ist eingestellt, dass der Firefox die Proxy-Einstellungen des Systems verwendet. Soweit ich das beurteilen kann, habe ich zumindest nicht wissentlich irgendwelche Proxys konfiguriert. (Betriebssystem Linux Mint 17 Cinnamon, Browser Firefox 31.0)

  2. Hallo Kay,

    ich kann nicht oft genug DANKE für Deine unermüdliche Hilfe sagen! Alleine hätte ich dieses Projekt vermutlich schon wieder eingestampft. Es tut mir außerdem leid, dass ich durch meine ständigen Nachrichten Deinen Blog zumülle. Im Anhang sind meine Ping-Ergebnisse vom Laptop im WLAN des RasPi. Bei Standardgateway bin ich nicht sicher, ob Du den Router mit der Internet-Anbindung meinst? In dem Fall ist das mein Handy mit der IP 192.168.43.1. Ab diesen Punkt kam keine Antwort mehr. Ich kann 192.168.43.1 sowie Internet-Adressen immer nur von der Konsole des RasPi’s mit Erfolg anpingen.

    Rainer


    rainer@laptop ~ $ ping localhost
    PING localhost (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.076 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.122 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.112 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=4 ttl=64 time=0.139 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=5 ttl=64 time=0.109 ms
    64 bytes from localhost (127.0.0.1): icmp_seq=6 ttl=64 time=0.109 ms
    ^C
    --- localhost ping statistics ---
    6 packets transmitted, 6 received, 0% packet loss, time 4998ms
    rtt min/avg/max/mdev = 0.076/0.111/0.139/0.019 ms
    rainer@laptop ~ $ ping 10.0.0.184
    PING 10.0.0.184 (10.0.0.184) 56(84) bytes of data.
    64 bytes from 10.0.0.184: icmp_seq=1 ttl=64 time=0.097 ms
    64 bytes from 10.0.0.184: icmp_seq=2 ttl=64 time=0.092 ms
    64 bytes from 10.0.0.184: icmp_seq=3 ttl=64 time=0.101 ms
    64 bytes from 10.0.0.184: icmp_seq=4 ttl=64 time=0.104 ms
    ^C
    --- 10.0.0.184 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2999ms
    rtt min/avg/max/mdev = 0.092/0.098/0.104/0.010 ms
    rainer@laptop ~ $ ping 10.0.0.254
    PING 10.0.0.254 (10.0.0.254) 56(84) bytes of data.
    64 bytes from 10.0.0.254: icmp_seq=1 ttl=64 time=1.78 ms
    64 bytes from 10.0.0.254: icmp_seq=2 ttl=64 time=111 ms
    64 bytes from 10.0.0.254: icmp_seq=3 ttl=64 time=1.62 ms
    64 bytes from 10.0.0.254: icmp_seq=4 ttl=64 time=107 ms
    ^C
    --- 10.0.0.254 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 3004ms
    rtt min/avg/max/mdev = 1.629/55.486/111.028/53.794 ms
    rainer@laptop ~ $ ping 192.168.43.1
    PING 192.168.43.1 (192.168.43.1) 56(84) bytes of data.
    ^C
    --- 192.168.43.1 ping statistics ---
    5 packets transmitted, 0 received, 100% packet loss, time 4032ms

    rainer@laptop ~ $ ping kay-farin.de
    PING kay-farin.de (194.116.187.25) 56(84) bytes of data.
    ^C
    --- kay-farin.de ping statistics ---
    6 packets transmitted, 0 received, 100% packet loss, time 5039ms

  3. Hi Rainer! Irgendwo steckt da noch ein Fehler, den ich bisher noch nicht finden konnte, da müssen wir noch mal Deine Konfiguration durchkämmen. Aktuell habe ich unter der Woche wenig Zeit dazu. Schmeiß das Projekt aber noch nicht vorschnell weg – ich melde mich am Wochenende für einen weiteren Versuch! Vielleicht können wir dann etwas interaktiver miteinander daran arbeiten…

  4. Hallo Rainer,

    läuft das Projekt auf Deiner Seite noch? Falls ja, können wir gerne versuchen, noch eine Lösung für Sein Setup zu finden. Es wird vielleicht etwas dauern, aber einen Versuch wäre es wert.

  5. Hallo,

    ich habe deine Anleitung genau befolgt…
    aber leider bekomme ich beim Versuch die iptables zu aktivieren immer die Fehlermeldung „iptables-restore: line 1 failed“. Habe die Zeile schon endlos oft überprüft auf Fehler.
    Kann aber nichts feststellen…

  6. Hallo,

    Ich habe exakt das selber Problem. Die Konfiguration sieht bei mir auch identisch aus, wie bei Rainer. Wenn ich einen Ping starte, wird die IP-Adresse auch richtig aufgelöst, allerdings funktioniert der Ping selber nicht und das Laden von Seiten stürzt ab. Alle Logs sehen auch identisch aus. Wurde für dieses Problem schon eine Lösung gefunden?

    Super Tutorial soweit. Versuche das jetzt schon seit einigen Tagen zum laufen zu bekommen.

    Vielen Dank schonmal

    Gruß

Schreibe einen Kommentar

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