WLAN: wpa_supplicant und "Roaming" - mehrere Netzwerke in einer Konfigurationsdatei

Status
Für weitere Antworten geschlossen.

Rain_Maker

Administrator
Teammitglied
WLAN: wpa_supplicant und "Roaming" - mehrere Netzwerke in einer Konfigurationsdatei

In diesem Tutorial möchte ich beschreiben, wie man mit recht einfachen Mitteln sein WLAN-Interface so einrichten kann, daß man sich auch ohne NetworkManager oder ein anderes, grafisches Tool in mehreren Netzwerkumgebungen bewegen kann und trotzdem _automatisch_ eine Verbindung hergestellt wird, so bald man sich in Reichweite eines bevorzugten Access Points befindet.

Dabei wird als zentrales Werkzeug der "wpa_supplicant" verwendet, was jedoch _nicht_ heissen soll, daß damit nur WPA(2)-verschlüsselte Netzwerke konfiguriert werden können, im Gegenteil, die gesamte Palette von WPA(2), WEP sowie unverschlüsselte Netzwerke stehen damit zur Verfügung.

Als einzige Einschränkung gilt, daß das ganze nur dann Sinn macht, wenn das Interface mit DHCP betrieben wird, aber das dürfte bei > 95% der WLAN-Netze eh der Fall sein.

0. Was braucht man dazu?

- Ein funktionierendes WLAN-Interface (naja, logisch, oder?)

- Das Paket wpa_supplicant muss installiert sein.
Ich empfehle eine aktuelle Versionen > 0.6, welche man für openSUSE bzw. Archlinux in unserer Downloadsektion herunterladen und installieren kann. Zumindest wurde dieses HowTo mit der Version 0.6.3 unter den beiden zuvor genannten Distributionen erfolgreich mit wpa_supplicant 0.6.3 getestet.

- Einen Texteditor und natürlich Rootzugriff auf der entsprechenden Kiste, auf der man das einrichten möchte.

1. Wie? Das ist alles?

Ja, das ist alles ;-)

Der "Trick" besteht in Kurzform darin, daß man

a) eine Konfigurationsdatei für wpa_supplicant anlegt, die alle gewünschten Netzwerke enthält mit denen man sich verbinden können möchte. Dieser Teil ist im Übrigen distributionsunabhängig, Hauptsache $DISTRIBUTION bietet die Verwendung des wpa_supplicant an (dürfte für so ziemlich jede halbwegs aktuelle Distribution gelten)

b) seiner Distribution klar macht, daß sie beim Aktivieren des WLAN-Interfaces auf genau diese Datei zurückgreift.

Klingt das irgendwie schon fast zu einfach?

Ja und das ist es eigentlich auch, denn alles, was man benötigt, findet man in der Dokumentation zu wpa_supplicant, welcher ein wirklich exzellentes Tool ist.

Wer sich genauer informieren will, welche Optionen die im Folgenden vorgestellten Parameter bieten, dem sei ein Blick in die Manual Page von wpa_supplicant, wpa_supplicant.conf sowie (besonderer Tipp) in die den Paketen beigelegte Beispielkonfiguration (bei meinem openSUSE-RPM ist das die Datei /usr/share/doc/packages/wpa_supplicant/wpa_supplicant.conf) empfohlen.

2. Und wie geht das?

- Zuerst legen wir uns eine eigene Konfigurationsdatei für wpa_supplicant an, der wir einen passenden Namen geben (der UNS was sagt, theoretisch könnte die auch Fritz, Franz oder Horst heissen).
Das Ganze nun einmal "plastisch" an einem Beispiel, die eigene Konfigurationsdatei nennen wir wpa_supplicant-roaming.conf, welche wir zunächst als normaler User bearbeiten und dann mit den entsprechenden Zugriffsrechten ins Verzeichnis /etc/wpa_supplicant/ verschieben werden.

a) die Kopfzeilen

Code:
ctrl_interface=/var/run/wpa_supplicant GROUP=root
Der wpa_supplicant legt beim Start ein sog. "Socket" an, auf welches man (sofern die entsprechenden Rechte vorhanden sind) mittels der beiden Tools wpa_cli/wpa_gui zugreifen kann, um z.B. neue Netzwerke hinzufügen oder auch nach APs scannen zu können. Der zweite Teil "GROUP=root" legt fest, daß nur Mitglieder der Gruppe root (und das wäre dann im Normalfall auch nur root) Zugriff auf dieses Socket haben.

Es besteht auch die Möglichkeit, hier keine (dann wird als default "root" verwendet) oder eine andere Gruppe anzugeben, unter openSUSE z.B. "dialout" oder unter einer Debian-basierten Distribution könnte man "netdev" verwenden.

Dann kann man -sofern man als entsprechender User auch in der jeweiligen Gruppe ist- ohne Rootpasswort auf das entsprechende Socket zugreifen.

Da dies jedoch ein gewisses Sicherheitsrisiko darstellt hier keine weiteren Kommentare dazu. Wer den Zugriff für eine andere Gruppe konfigurieren möchte, der möge sich die oben genannte Dokumentation durchlesen.

Weiter gehts mit den Kopfzeilen

Code:
update_config=1
ap_scan=1
Der erste Eintrag sorgt dafür, daß im laufenden Betrieb (via wpa_cli oder wpa_gui) gemachte Änderungen fest übernommen werden, ansonsten gilt ein über diese Methode hinzugefügtes Netzwerk nur für die aktuelle Sitzung.

Diesen Eintrag kann man entweder auf "0" setzen oder ganz weg lassen, was sich eigentlich auch dann anbietet, wenn man einmal seine bevorzugten Netzwerke beisammen hat und nicht will, daß die Datei immer mehr Netzwerke enthält, die man vielleicht nur einmal (offener Hotspot am Flughafen o.ä.) nutzt und dann so gut wie nie mehr braucht.
Somit wird auch verhindert, daß beim Abspeichern der Konfiguration über wpa_cli/wpa_gui irgendetwas an den zuvor definierten Netzwerkblöcken geändert wird (was leider auch vorkommen kann, besonders bei den Prioritäten).

Wer also ganz auf Nummer sicher gehen will, der setzt

Code:
update_config=0
und editiert die Netzwerkblöcke von Hand.

Der zweite Eintrag legt fest, wie das Suchen nach APs erfolgt, die "1" ist Standardeinstellung und verwendet den wpa_supplicant selbst zum Scannen. Bei mir zeigt dies mit Abstand die besten Ergebnisse, wer Genaueres wissen möchte, der sollte sich die Kommentare dazu in der bereits mehrfach erwähnten Beispielkonfiguration ansehen.

b) Netzwerkblöcke

Nun trägt man die bevorzugten Netzwerke ein, wobei über den Parameter "priority" festgelegt wird, in welcher Reihenfolge die Netzwerke von wpa_supplicant "durchprobiert" werden. Je höher die Priorität, desto ... (naja, ist klar oder?). Sollte ein Netzwerk ausser Reichweite sein, dann springt wpa_supplicant zum Netzwerk mit der nächsthöheren Priorität und so weiter.

Bei gleicher Priorität (auch ein nettes Feature) versucht wpa_supplicant sich mit dem Netzwerk zu verbinden, welches die bessere Empfangsstärke hat.

Hier mal eine paar Beispiele (die auch in etwa meiner Konfiguration entsprechen).

WPA/WPA2:

Code:
network={
        ssid="ESSID_meines_WLANs_zu_Hause_mit_WPA/WPA2-PSK"
        psk="der_streng_geheime_Schlüssel"
        proto=WPA2 WPA
        key_mgmt=WPA-PSK
        pairwise=CCMP TKIP
        group=CCMP TKIP
        priority=10
}
Mein Heimnetzwerk unterstützt sowohl WPA1 als auch WPA2, die jeweils zuerst aufgeführten Parameter werden bevorzugt behandelt, also erfolgt hier zuerst der Verbindungsversuch mit WPA2 und sollte das nicht funktionieren, dann wird WPA1 versucht.

Dieser Block kann zumindest theoretisch für alle Arten von WPA-PSK (1 und 2) verwendet werden, da sich wpa_supplicant z.B. bei einem WPA1-only Netzwerk die passenden Parameter automatisch auswählt. Dies kann jedoch zu gewissen (kleinen) Verzögerungen führen. Wer also z.B. nur ein WPA1 geschütztes Netzwerk hat, der kann folgenden Eintrag setzen.

nur WPA1:
Code:
network={
        ssid="ESSID_DES_WPA1_Netzwerks"
        psk="das_streng_geheime_Passwort"
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=TKIP
        group=TKIP
        priority=3
}
Diesen Eintrag gibt es z.B. in meiner Konfiguration, das Netzwerk ist das WPA1-verschlüsselte Netz eines Arbeitskollegen (übrigens auch Linuxer), bei dem wir zusammen z.B. auch ab und zu mal anderen, an Linux interessierten Kollegen böswillig (*g*) ein Dualboot auf dem Schlepptopp einrichten. Da braucht man natürlich auch Internet, also rein in die Konfigurationsdatei damit und Priorität etwas kleiner als das Heimnetzwerk.

Ein WEP-verschlüsseltes Netzwerk sieht in etwa so aus ("offene" Authentifizierung, was bei > 95% der Router Standard ist)

WEP-open:
Code:
network={
        ssid="ESSID_DES_WEP_NETZWERKES"
        key_mgmt=NONE
        wep_key0=KEY_Nr.0 [B][COLOR='Red']#Key als HEX und  KEINE Anführungszeichen setzen![/COLOR][/B]
        wep_key1=KEY_Nr.1
        wep_key2=KEY_Nr.2
        wep_tx_keyidx=0
        priority=2
}
Für den seltenen Fall der "Shared Key" Authentifizierung sähe das so aus:

WEP-shared:
Code:
network={
        ssid="ESSID_DES_WEP_NETZWERKES"
        key_mgmt=NONE
        wep_key0=KEY_Nr.0 [B][COLOR='Red']#Key als HEX und  KEINE Anführungszeichen setzen![/COLOR][/B]
        wep_key1=KEY_Nr.1
        wep_key2=KEY_Nr.2
        wep_tx_keyidx=0
        auth_alg=SHARED
        priority=2
}
Unverschlüsselte Netzwerke:

Code:
network={
        ssid="ESSID_DES_UNVERSCHLÜSSELTEN_NETZWERKS"
        key_mgmt=NONE
        priority=1
}
Die Priorität ist absichtlich herunter gesetzt, wer will sich schon unabsichtlich mit einem offenen Netz verbinden, wenn das eigene in Reichweite ist?

Als kleines "Schmankerl" kann dieses Konzept auch so erweitert werden, daß im Falle, daß keines der bevorzugten Netzwerke erreichbar sein sollte, automatisch versucht wird mit einem offenen Hotspot zu verbinden. In Anbetracht dieser Meldung hier werde ich dazu aber nichts schreiben, ich kann jedoch niemandem verbieten, die Dokumentation zu lesen.

Nachdem wir mit unserer Konfigurationsdatei fertig sind, packen wir sie nun an den richtigen Platz und setzen die Zugriffsrechte entsprechend.

Code:
su

Passwort

mkdir /etc/wpa_supplicant # falls diese Verzeichnis nicht schon existiert. 
                          # Man kann auch ein beliebiges, anderes Verzeichnis wählen.

mv wpa_supplicant-roaming.conf /etc/wpa_supplicant/

cd /etc/wpa_supplicant/

chown root:root wpa_supplicant-roaming.conf

chmod 600 wpa_supplicant-roaming.conf
Damit ist die Datei nur noch für root zugänglich.

Das war der distributionsunabhängige Teil, im zweiten Teil wird erklärt, wie man unter openSUSE und Archlinux dafür sorgt, daß die eben erzeugte Datei auch verwendet wird.

Greetz,

RM
 

Rain_Maker

Administrator
Teammitglied
wpa_supplicant und "Roaming" - mehrere Netzwerke in einer Konfigurationsdatei (II)

3. Einrichten des WLAN-Interfaces mit "eigener" wpa_supplicant-Konfigurationsdatei.

a) openSUSE:

OpenSUSE verwendet in den default-Einstellungen keine Datei "wpa_supplicant-*irgendwas*.conf" sondern legt diese dynamisch beim Aktivieren des Interfaces aus der jeweiligen ifcfg-Datei an. Dieses Verhalten müssen wir ihr nun "abgewöhnen".

Zuerst wird das WLAN-Interface über YaST wie folgt eingerichtet.

Ich gehe hier nur auf die Parameter ein, welche direkt mit der Verwendung der "Roaming-Methode" über eine eigene wpa_supplicant.conf in Verbindung stehen, die weiteren Parameter wie z.B. Startmodus, Firewallzone, Benutzersteuerung usw. sind den eigenen Gegebenheiten anzupassen.

- Traditionelle Methode mit IFUP

- Adressvergabe mit DHCP

- Verschlüsselung: WPA-PSK

Nun folgen zwei "dummy" Einträge, die nur dazu dienen, daß YaST zufrieden ist, diese beiden Einträge werden beim Start des Interfaces ignoriert, weil die selbst erstellte wpa_supplicant-Konfigurationsdatei verwendet wird.

- ESSID: Irgendwas eintragen, am einfachsten any

- Passwort: Irgendetwas eintragen, Hauptsache es sind mindestens 8 Zeichen

und abspeichern.

Nun gehen wir als root in das Verzeichnis /etc/sysconfig/network/ und suchen die entsprechende ifcfg-Datei der eben angelegten WLAN-Schnittstelle, bei mir (openSUSE 10.2) heisst die Datei "ifcfg-wlan-*MAC-Adresse-meiner-Karte" unter 10.3 würde sie wahrscheinlich "ifcfg-wlan-eth1" heissen.

Zuerst überprüfen wir die Datei (z.B. als root mit less *Dateiname*) ob die Einrichtung korrekt ist.

Folgende Einträge sollten vorhanden sein (die anderen Einträge sind aus Gründen der Übersichtlichkeit weggelassen).

Code:
BOOTPROTO='dhcp'

WIRELESS_AUTH_MODE='psk'

WIRELESS_ESSID='Unsere_dummy_ESSID'

WIRELESS_WPA_PSK='Unser_dummy_Passwort'
Nun fügen wir folgende Zeile mit einem Texteditor hinzu (wo ist eigentlich egal, ich habe es direkt unter die Zeile "WIRELESS_AUTH_MODE" gesetzt.)

Code:
WIRELESS_WPA_CONF='/etc/wpa_supplicant/wpa_supplicant-roaming.conf'
Damit wird die von uns zuvor angelegte Konfigurationsdatei verwendet, wer sich einen anderen Namen/Pfad für die entsprechende Datei ausgedacht hat, der muss den Eintrag logischerweise entsprechend anpassen.

Abspeichern, als root einmal

Code:
rcnetwork restart
ausführen und fertig.

b) Archlinux:

Hier gibt es prinzipiell mehrere Möglichkeiten, zum Einen die "klassische Methode" über die /etc/rc.conf zum Anderen die Verwendung von "netcfg2", welche ich bevorzuge und hier beschreiben möchte.

Wie man netcfg2 installiert und einrichtet werde ich hier nicht erläutern, dazu gibt es genügend Material z.B. in den deutschsprachigen bzw. englischsprachigen Wikis von archlinux.de bzw. archlinux.org.

Deshalb nur kurz der Inhalt der entsprechenden Profildatei, welche ich beispielhaft /etc/network.d/wpa-roam genannt habe.

Code:
#
# Network Profile
#
CONNECTION="wireless"
DESCRIPTION="dhcp&wpa_supplicant.conf"
# Network Settings
INTERFACE=eth1
HOSTNAME="Schleppi"
# Interface Settings
[B]IP="dhcp"
IFOPTS="dhcp"
DHCP_TIMEOUT=60[/B]
# Wireless Settings
[B]SECURITY="wpa-config"[/B]
ESSID="any"
KEY=""
SCAN=""
# WPA Specific Settings
WPA_OPTS=""
[B]WPA_CONF="/etc/wpa_supplicant/wpa_supplicant-roaming.conf"[/B]
Die wichtigen Teile (mit dem DHCP-Timeout muss man ggf. etwas herumspielen) sind fett markiert.

Danach ein

Code:
/etc/rc.d/net-profiles restart
bzw.

Code:
netcfg2 -a

netcfg2 wpa-roam
um die Einstellungen zu übernehmen.

4. Überprüfen der Einrichtung

Ob nun auch wirklich die eigene wpa_supplicant-Konfigurationsdatei verwendet wird, lässt sich mit einem Befehl herausfinden,

Code:
ps aux|grep wpa_supplicant|grep -v grep
dessen Ausgabe in etwa so aussehen sollte.

Code:
root      9744  0.0  0.1   3588   828 ?        Ss   14:34   0:00 wpa_supplicant 
-B -P/var/run/wpa_supplicant_eth1.pid -ieth1 
[B]-c /etc/wpa_supplicant/wpa_supplicant-roaming.conf[/B] -Dwext
Auch das gilt distributionsübergreifend, die Ausgabe muss den oben fett markierten Teil "-c /Pfad/zu_unserer_Konfigurationsdatei/Name_der_Konfigurationsdatei" enthalten.

5. Abschliessende Bemerkungen

Dieses Tutorial war vor allem in Hinblick auf die Möglichkeiten, die einem wpa_supplicant bietet, nur ein kleiner Einblick mit "alltäglichen" Beispielen.
So ist es z.B. ohne Weiteres möglich mit dem selben Konzept auch zusätzlich WPA-EAP geschützte Netze einzurichten, es muss nur der entsprechende Netzwerkblock hinzugefügt werden.
Das Einbinden von Ad-Hoc-Netzen ist auch kein Problem und wer Probleme mit versteckten ESSIDs hat, der sollte sich die Option "scan_ssid" ansehen.

Dies alles ist hervorragend dokumentiert, also erneut ein Hinweis auf "RTFM", besonders die Beispieldatei ist da extrem ergiebig.

Zusätzlich lässt sich die Grundidee natürlich beliebig erweitern, indem man z.B. verschiedene Profile anlegen kann, die jeweils ihre eigene wpa_supplicant-Konfigurationsdatei verwenden, der Phantasie sind hier (fast) keine Grenzen gesetzt.

Das wars dann auch schon, viel Spaß beim "Roaming".

Greetz,

RM
 
Status
Für weitere Antworten geschlossen.
Oben