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
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
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
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:
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:
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:
Für den seltenen Fall der "Shared Key" Authentifizierung sähe das so aus:
WEP-shared:
Unverschlüsselte Netzwerke:
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.
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
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
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
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
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
}
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
}
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
}
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
}
Code:
network={
ssid="ESSID_DES_UNVERSCHLÜSSELTEN_NETZWERKS"
key_mgmt=NONE
priority=1
}
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
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