Gäste-WLAN mit einem VAP

Worum geht es hier?

In der c't 10/2016 S.98 wurde ein interessanter Ansatz für ein Gäste-WLAN beschrieben. Dort wurde zwar ein Raspberry pi als AP benutzt, aber das müsste doch auch mit unserem fli4l gehen...

Für Leute die keine c't haben:

Ein Raspi hängt im LAN hinter dem Router und stellt ein Gäste-WLAN bereit. Dabei ändert er täglich den Gäste-PSK und zeigt diesen auf einem angeschlossenen LCD an. Somit haben Gäste immer nur kurze Zeit (hier 24 Stunden) Zugriff aufs Gäste-WLAN - und wer nicht in die Wohnung kommt, kann auch den täglich erneuerten Gäste-PSK nicht vom Display ablesen. Somit bleibt mein eigener und geheimer PSK bestehen und wird nicht täglich geändert.

Was wird benötigt?

  • eine WLAN-Karte die VAP (Virtual-Access-Point) unterstützt - laut Doku im wlan-Paket sind das momentan (Version3.10.6) die Treiber ath_pci, ath5k, ath9k, ath9k_htc
  • advanced_networking - wir brauchen bridges
  • easycron - der Router soll täglich neu starten
  • lcd4linux o.ä. passend zum eigenen Display
  • usercmd - der Router soll beim Systemstart den PSK fürs Gäste-WLAN generieren
  • wlan - logisch

Welche fli4l-Versionen werden / wurden unterstützt?

Ich habe dieses How-To damals (2016 ???) für fli4l Version 3.10.6 geschrieben. Alle Updates bis zur 3.10.16 habe ich mitgemacht - ohne dass jemals Probleme aufgetaucht sind.

Da ich nun wegen ipv6 zur 4er-Version gewechselt bin, kann ich ab jetzt (März 2019) mit der 3er-Version nicht mehr testen.

Mit der aktuellen Version 4.0.0-r55493 habe ich die damalige Konfiguration eins zu eins übernommen - das Gäste-WLAN läuft immernoch ohne Probleme.

Im Januar 2021 bekam ich eine 802.11n-fähige WLAN-Karte geschenkt (Danke Derya); ich habe nur den Treiber in der base.txt auf (jetzt) ath9k gesetzt und die MAC-Adressen angepasst - läuft wie am Schnürchen.

Von mir benutzte Einstellungen:

Achtung: die IP-Adressen müssen natürlich an Eure Werte angepasst werden!

  • IP_NET_1 = internes Netz für meine Geräte
  • IP_NET_2 = internes Netz für das Gäste-WLAN - aus Sicherheitsgründen sollten die Gäste keine Geräte aus meinem Netz sehen, also Paketfilter entsprechend anpassen
  • eth0 = daran hängen meine LAN-clients
  • wlan0 = das wlan-device für mein WLAN
  • wlan0v2 = das neue virtuelle device für das Gäste-WLAN
  • br0 = eine Bridge aus eth0 und wlan0 für meine Rechner
  • br1 = eine Bridge die  nur aus wlan0v2 besteht (ja, das geht wirklich!) für das Gäste-WLAN

Bitte beachten:

Damit wir dem Gäste-WLAN im laufenden Betrieb des Routers einen neuen PSK geben können, muss das gesamte wlan gestoppt und neu gestartet werden - dabei nutzt wlan0v2 dann den neuen Gäste-PSK. Damit das problemlos funktioniert, benötigen wir eine spezielle Konfiguration; die beiden wlan-devices müssen jeweils in einer eigenen bridge stecken und sie dürfen nicht im advanced_networking-Paket in die bridge gesteckt worden sein, sondern im wlan-Paket.


Wenn man nicht so wie hier beschrieben die bridges benutzt, geht die Route fürs wlan0v2 verloren und das Gäste-WLAN funktioniert danach nicht - daher die spezielle Konfiguration.

(vielen Dank an Carsten Spieß und Peter Schiefer in der NG)

Konfiguration:

Das klingt auf den ersten Blick sehr kompliziert, ist aber eigentlich recht simpel:

In advanced_networking.txt:

OPT_BRIDGE_DEV='yes'
BRIDGE_DEV_N='2' # denn wir brauchen 2 bridges
BRIDGE_DEV_1_NAME='bridge0'
BRIDGE_DEV_1_DEVNAME='br0'
BRIDGE_DEV_1_DEV_N='1' # wir stecken hier nur ein device hinein
BRIDGE_DEV_1_DEV_1_DEV='eth0' # wir stecken hier eth0 in die bridge
# das device wlan0 wird später im wlan-Paket hinzugefügt


BRIDGE_DEV_2_NAME='bridge1'
BRIDGE_DEV_2_DEVNAME='br1'
BRIDGE_DEV_2_DEV_N='0' # wir stecken hier gar kein device hinein (ja, das geht wirklich!)
# das device wlan0v2 wird später im wlan-Paket hinzugefügt


In base.txt:

IP_NET_N='2' # wir wollen 2 getrennte Netze
IP_NET_1='192.168.6.1/24' # mein LAN / WLAN
IP_NET_1_DEV='br0' # das device an dem mein LAN / WLAN hängt
IP_NET_2='192.168.7.1/24' # das Gäste-WLAN
IP_NET_2_DEV='br1' # das device an dem das Gäste-WLAN hängt

Der Paketfilter muss so angepasst werden, dass beide Netze ins Internet kommen - logisch.
Der Paketfilter sollte so angepasst werden, dass beide Netze sich gegenseitig nicht sehen können - aus Sicherheitsgründen.

In dns_dhcp.txt:

DHCP_RANGE_N='2' # meine und die Gäste-Maschinen brauchen dhcp
DHCP_RANGE_1_NET='IP_NET_1' # für meine dhcp-clients
DHCP_RANGE_1_START='192.168.6.200' # start-IP (Wert ggf. anpassen)
DHCP_RANGE_1_END='192.168.6.250' # end-IP (Wert ggf. anpassen)
#
DHCP_RANGE_2_NET='IP_NET_2' # für die Gäste
DHCP_RANGE_2_START='192.168.7.200' # start-IP (Wert ggf. anpassen)
DHCP_RANGE_2_END='192.168.7.250' # end-IP (Wert ggf. anpassen)


In wlan.txt :

WLAN_N='2' # wir müssen 2 Karten mit fast identischen Angaben definieren damit VAP klappt
           # nur ESSID und der PSK unterscheiden sich bei den Karten
WLAN_1_MAC='01:23:45:67:89:0a' # hier die echte MAC-Adresse der WLAN-Karte eintragen
WLAN_1_ESSID='mein-wlan' # ESSID - network name
WLAN_1_MODE='master' # die Karte wird ein AP
WLAN_1_CHANNEL='12n' # WLAN-Kanal den wir benutzen wollen
WLAN_1_RATE='auto' # WLAN bitrate
WLAN_1_ENC_N='0' # wir brauchen kein WEP (zu unsicher)
WLAN_1_WPA_KEY_MGMT='WPA-PSK' # wir nutzen WPA-PSK
WLAN_1_WPA_PSK='asdfghjk' # mein eigener ganz geheimer dauerhafter PSK
WLAN_1_WPA_TYPE='2' # WPA type 1 or 2 - or 3 for both
WLAN_1_WPA_ENCRYPTION='TKIP CCMP' # TKIP and/or CCMP encryption
WLAN_1_ACL_POLICY='open' # MAC-ACLs sind witzlos
WLAN_1_ACL_MAC_N='0'
WLAN_1_WPS='no' # ich nutze kein WPS
WLAN_1_BRIDGE='br0' # hängt wlan0 an br0 <-ganz wichtig !!!
#
WLAN_2_MAC='01:23:45:67:89:0a' # wie oben
WLAN_2_ESSID='gaeste-wlan' # ESSID - network name
WLAN_2_MODE='master' # wie oben
WLAN_2_CHANNEL='12n' # wie oben
WLAN_2_ENC_N='0' # wie oben
WLAN_2_WPA_KEY_MGMT='WPA-PSK' # wie oben
WLAN_2_WPA_PSK='qwertzui' # erster dummy PSK für das Gäste-WLAN
WLAN_2_WPA_TYPE='2' # wie oben
WLAN_2_WPA_ENCRYPTION='TKIP CCMP' # wie oben
WLAN_2_ACL_POLICY='open' # wie oben
WLAN_2_ACL_MAC_N='0' # wie oben
WLAN_2_WPS='no' # wie oben
WLAN_2_BRIDGE='br1' # hängt wlan0v2 an br1 <-ganz wichtig !!!


Mit dieser config aktualisieren wir jetzt einmal den Router und starten ihn neu. Danch zur Kontrolle ob das bisher geklappt hat:

stan 3.10.6 # ip route <enter>
default via x.x.x.x dev ppp0
127.0.0.0/8 dev lo  scope link
192.168.6.0/24 dev br0  proto kernel  scope link  src 192.168.6.1
192.168.7.0/24 dev br1  proto kernel  scope link  src 192.168.7.1
x.x.x.x dev ppp0  proto kernel  scope link  src x.x.x.x
stan 3.10.6 #

Die Adressen x.x.x.x sind unkenntlich gemacht - 192.168.6.0/24 bzw. 192.168.7.0/24 sollten Euren Netzen IP_NET_1 bzw. IP_NET_2 entsprechen. Wir haben jetzt bereits 2 funktionierende getrennte WLANs mit den jeweils in der wlan.txt stehenden PSKs.

Wir brauchen nun die virtuelle MAC-Adresse von wlan0v2 - diese ist leicht anders als die im wlan-Paket eingetragene Adresse.

stan 3.10.6 # ip link <enter>
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode
DEFAULT group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
...
10: wlan0v2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master
br1 state UP mode DEFAULT group default qlen 1000
    link/ether 06:80:48:7b:33:2f brd ff:ff:ff:ff:ff:ff
stan 3.10.6 #

Die gesuchte virtuelle MAC-Adresse von meinem (!!!) wlan0v2 ist also hier 06:80:48:7b:33:2f - wir brauchen sie gleich.

Damit der Router bei jedem Neustart einen neuen Gäste-PSK generiert nutze ich folgende Einstellung in usercmd.txt:

OPT_USERCMD='yes'
USERCMD_BOOT_N='5' # wir brauchen 5 Zeilen
USERCMD_BOOT_1='WLANPSK=$(dd if=/dev/urandom count=1|tr -d -c "A-Z"|cut -b1-16)'
USERCMD_BOOT_2='sed -ie "s/qwertzui/${WLANPSK}/" /var/run/wlan_06:80:48:7B:33:2F.conf'
USERCMD_BOOT_3='wlanconfig.sh wlan0 down'
USERCMD_BOOT_4='wlanconfig.sh wlan0 up'
USERCMD_BOOT_5='echo $WLANPSK>/etc/lcd_text1.txt'

Zeile 1 befüllt die Variable $WLANPSK (der neue Gäste-PSK) mit 16 zufälligen GROSSBUCHSTABEN.

In Zeile 2 wird der bisherige dummy-Gäste-PSK (aus der wlan.txt) durch $WLANPSK ersetzt; sed sucht nach dem bisherigen dummy-Gäste-PSK und ersetzt ihn durch $WLANPSK - also muss hier natürlich genau der in wlan.txt vergebene dummy-Gäste-PSK angegeben werden!

Der gesuchte PSK steht (im laufenden Router) in der Datei /var/run/wlan_<virtuelle MAC-Adresse von oben>.conf . Bei mir ist das die Datei /var/run/wlan_06:80:48:7B:33:2F.conf - bitte also Eure virtuelle MAC-Adresse (siehe oben) für den Dateinamen benutzen und in GROSSBUCHSTABEN schreiben.

Zeile 3 und 4 stoppen und starten das wlan neu - damit wird ab jetzt der neue Gäste-PSK benutzt.

Zeile 5 schreibt den neuen Gäste-PSK in eine Datei, aus der das lcd4linux-Paket ihn ausliest und aufs Display schreibt. Das lcd4linux-Paket muss dafür natürlich entsprechend konfiguriert werden.


Wenn man jetzt noch easycron konfiguriert, startet der Router in Zukunft täglich um 06:00 Uhr neu und generiert dann direkt nach dem booten einen neuen Gäste-PSK.

OPT_EASYCRON='yes'
EASYCRON_MAIL='no' # brauche ich nicht
EASYCRON_N='1'
EASYCRON_1_CUSTOM=''
EASYCRON_1_COMMAND='/sbin/reboot' # bitte rebooten
EASYCRON_1_TIME='0 6 * * *' # täglich um 06:00 Uhr


Bitte nicht vergessen den Router zu aktualisieren und dann ein Neustart. Nun sollte der Gäste-PSK im LCD erscheinen.

Theoretisch muss man den Router nicht täglich rebooten lassen - nur muss man dann anders nach dem bisherigen Gäste-PSK suchen... wer will, kann das natürlich anders lösen.

Viel Spass damit.


Stefan