WLAN unter Debian GNU/Linux und FreeBSD
Inhaltsübersicht
Zweck des WLANs
Einrichtung eines WLANs, welches einem Laptop drahtloses Surfen ermöglicht. Da bei mir kein DSL verfügbar ist wählt sich mein Desktop-Rechner mit Hilfe einer ISDN-Karte direkt ins Internet ein. Ein Hardware-Router ist nicht vorhanden. IP-Adressen und DNS-Server meines Providers werden statisch eingetragen, ich betreibe keinen eigenen DNS- oder DHCP-Server.
verwendete Hardware
- Netgear WG311T PCI-Karte im Desktop-Rechner
- Netgear WG511T Cardbus-Karte im Laptop
Beide Karten benutzen einen Atheros-Chipsatz und werden vom madwifi-Treiber unterstützt. Sie beherrschen die Standards 802.11b und 802.11g und WPA/WPA2.
verwendete Software
- Debian Etch als Betriebssystem. Für Debian Sarge können Treiber und weitere benötigte Pakete auf backports.org gefunden werden.
- madwifi-Treiber für beide Karten
- kernel-headers, um die madwifi-Treiber bauen zu können
- module-assistant und build-essential
- wireless-tools (enthält
iwconfig
) - hostapd auf dem Access Point und
wpasupplicant auf dem Client für WPA-Verschlüsselung - openvpn für VPN-Verschlüsselung
Eine kurze Begriffserklärung
Betriebsmodi
- Ad-Hoc
- Kein Accespoint, beide Rechner sind gleichwertig. Einfach einzurichten. Nachteil: Die Verwendung von WPA mit WPA-PSK ist nicht möglich (siehe unten).
- Managed
- Ein Rechner muß als Accesspoint eingerichtet werden (Master), der andere arbeitet als Client (Managed). Dieser Modus ermöglicht auch mit WPA die Verwendung von Pre Shared Keys.
Verschlüsselungsmöglichkeiten
- VPN (Virtual Private Network)
- Auf dem WLAN wird ein zweites, virtuelles Netzwerk errichtet. Die
VPN-Software stellt auf beiden Rechnern virtuelle Netzwerkinterfaces
zur Verfügung, über die der Datenverkehr läuft. Dieser wird von der
VPN-Software verschlüsselt und dann über das WLAN geschickt (getunnelt).
- Vorteil:
- funktioniert unabhängig von den Fähigkeiten der WLAN-Treiber und -Karten
- Nachteil:
- komplexerer Netzwerkaufbau
- WEP (Wired Equivalent Privacy)
- Veralteter Verschlüsselungsstandard für WLANs, unsicher da schnell zu knacken. WEP sollte nicht mehr verwendet werden.
- WPA (WiFi Protected Access)
- halboffizieller Zwischenstandard, mit zwei Betriebsmodi:
- WPA-PSK (WPA personal)
- Ein gemeinsamer Schlüssel (Pre Shared Key) ermöglicht den Zugriff auf das WLAN. Jeder teilnehmende Rechner muß diesen Schlüssel kennen. Eine weitergehende Authentifizierung findet nicht statt.
- WPA-EAP (WPA enterprise)
- Zusätzliche Authentifizierungsmöglichkeiten, z.B. EAP mit einem RADIUS-Server
- WPA2 (802.11i)
- offizieller neuer Standard, kennt wie WPA einen PSK-Modus und einen EAP-Modus. Nicht alle Karten unterstützen schon WPA2. Die verwendeten Netgear-Karten können es, unter Windows werden dazu allerdings der WPA2-Patch von Microsoft und aktuelle Treiber von Netgear benötigt.
WPA2 unterstützt als Verschlüsselungsmethoden das auch bei WPA verwendete TKIP/RC4 ebenso wie das aufwändigere CCMP/AES.
Inbetriebnahme
System vorbereiten und Treiber installieren
Die benötigten Treiber sind im Debian-Paketarchiv schon vorhanden, allerdings sind
sie keine freie Software sondern befinden sich im Bereich non-free.
Gegebenenfalls muss die /etc/apt/sources.list angepasst werden um darauf
zuzugreifen. Dazu werden bei Adressen für Debian-Server alle Vorkommnisse von
main
ersetzt durch main contrib non-free
.
Danach muss apt-get update
aufgerufen werden um die Paketlisten neu
einzulesen. Anschließend werden folgende Schritte durchgeführt:
apt-get install module-assistant build-essential madwifi-source
- Diese Pakete werden zum Bauen der madwifi-Treiber benötigt
module-assistant prepare
- Falls ein Debian-Kernel verwendet wird kann
module-assistant
die zum Kernel passenden kernel-headers finden und installieren. - oder Kernel-Headers von Hand installieren
- Falls ein eigener Kernel verwendet wird reicht es, wenn die zum Bauen
benutzten Kernelquellen noch vorhanden sind.
make-kpkg
kann übrigens nicht nur ein kernel-image-Paket sondern auch ein kernel-headers-Paket erstellen. module-assistant auto-install madwifi-source
- module-assistant baut zum Kernel passende Treiber, erstellt ein Debian-Paket mit den Treibern und installiert dieses.
apt-get install wireless-tools
- Das Paket wireless-tools enthält die Programme
iwconfig
undiwpriv
.
Nun muss noch eine Moduloption eingestellt werden, je nach Konfiguration
(Ad-Hoc oder Infrastruktur mit Access Point). Dazu legt man eine Datei
in /etc/modprobe.d an, z.B. /etc/modprobe.d/local
, und fügt
die benötigte Option dort ein.
Für ein Ad-Hoc-Netzwerk auf allen Rechnern:
options ath_pci autocreate=adhoc
Für ein Infrastruktur-Netzwerk mit Access Point auf dem AP:
options ath_pci autocreate=ap
Auf dem Client muss man in diesem Fall keine Option eintragen.
Das Modul wird von hotplug oder discover beim Systemstart automatisch geladen. Falls beides nicht verwendet wird, kann man das Modul auch zu /etc/modules hinzufügen:
echo ath_pci >> /etc/modules
Um das Modul im laufenden Betrieb zu laden benutzt man
modprobe ath_pci
Im laufenden Betrieb kann man die oben genannten Einstellungen mit
wlanconfig
ändern oder alternativ das Modul entladen und neu laden.
WLAN-Modus und Netzwerk einrichten
Die Inbetriebnahme eines rudimentären unverschlüsselten WLANs erfolgt nun in zwei Schritten:
iwconfig
verwenden, um die WLAN-Einstellungen vorzunehmenifconfig
verwenden, um weitere Netzwerkeinstellungen (IP-Adresse usw.) vorzunehmen
Um die grundlegende Funktionalität des Netzwerkes zu testen kann man den Ad-Hoc-Modus verwenden. Es ist darauf zu achten daß man auf allen Systemen die gleiche essid verwendet:
iwconfig ath0 mode Ad-Hoc essid meinwlan key off
Danach müssen noch die Netzwerkeinstellungen wie IP-Adresse, Netzmaske und ggf. Gateway vorgenommen werden.
ifconfig ath0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
Wenn die Werte dauerhaft verwendet werden sollen fügt man einen
entsprechenden Eintrag in der Datei /etc/network/interfaces ein. Danach
kann man die Verbindung mit ifup ath0
aufbauen und mit
ifdown ath0
abbauen. Hier die Datei auf dem Desktop-Rechner:
#Interface beim Booten hochfahren: auto ath0 #Statische IP-Adresse usw. iface ath0 inet static wireless-mode Ad-Hoc wireless-essid meinwlan wireless-key off address 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255
Auf dem Laptop wird eine andere IP-Adresse verwendet. Außerdem wird ein
gateway
-Eintrag gesetzt, damit der Desktop-Rechner als Router
benutzt wird. Desweiteren soll hotplug das Interface automatisch
aktivieren, wenn die WLAN-Karte in den Laptop eingesteckt wird:
#Hotplug-Konfiguration allow-hotplug ath0 #Statische IP-Adresse usw. iface ath0 inet static wireless-mode Ad-Hoc wireless-essid meinwlan wireless-key off address 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.1
Die Rechner sollten sich nun anpingen können. Damit der Laptop die Internetverbindung des Desktops mitbenutzen kann muß auf diesem noch NAT/Masquerading eingerichtet werden. Am einfachsten geht das mit dem Paket ipmasq. Um Rechnernamen wie z.B. debian.org auflösen zu können muß man die IP-Adressen der DNS-Server seines Providers in der Datei /etc/resolv.conf auf dem Laptop eintragen:
nameserver 212.6.108.140 nameserver 212.6.108.141 search localdomain
Damit ist das WLAN betriebsbereit und der Laptop hat Zugriff auf das Internet. Leider hat jeder andere Rechner in Reichweite das auch, denn in diesem Zustand ist das WLAN ungeschützt und jeder kann es belauschen und selbst teilnehmen. Daher muß nun noch eine Verschlüsselung eingerichtet werden.
Verschlüsselung
Verschlüsselung mit OpenVPN
Wie oben schon erwähnt funktioniert eine VPN-Software wie OpenVPN unabhängig
von den Verschlüsselungsfähigkeiten des WLANs. Auch ein offenes unverschlüsseltes
WLAN kann damit nachträglich abgesichert werden. Voraussetzung dafür ist, daß
der Netzwerkverkehr über die virtuellen VPN-Interfaces läuft und nicht direkt
über das WLAN-Interface. Nur die OpenVPN-Software selbst arbeitet direkt auf
dem WLAN-Interface. Anderer Netzwerkverkehr kann mit z.B. mit iptables
unterbunden werden. Folgende Schritte sind notwendig:
- openvpn installieren
- Schlüssel für das VPN generieren und auf beide Rechner kopieren
- OpenVPN konfigurieren
- OpenVPN starten und testen
- WLAN durch
iptables
absichern, nur VPN-Verbindungen erlauben
Debian enthält schon openvpn-Pakete:
apt-get install openvpn
Den Schlüssel kann man durch openvpn
selbst erstellen
lassen:
openvpn --genkey --secret geheim.key
Die erstellte Datei kann auf beiden Rechnern nach /etc/openvpn kopiert werden. Das darf natürlich nicht über das unverschlüsselte WLAN geschehen, da der Schlüssel dadurch kompromittiert wird. Die Datei darf nur für root lesbar sein.
Das VPN-Netzwerk besteht in meinem Fall nur aus zwei Rechnern. Sie müssen je eine IP-Adresse für das VPN-Interface bekommen, die in einem anderen Subnetz als das WLAN liegen sollte. Auf dem Laptop muß außerdem das Routing so angepasst werden, daß alle Anfragen außer der VPN-Verbindung selbst über das VPN-Interface laufen, nicht über das unverschlüsselte WLAN-Interface.
Konfiguration auf dem Deskop:
#Kernelmodul "tun" muß geladen sein dev tun #VPN-Adresse dieses Rechners und des Gegenübers #Die VPN-Adressen liegen im Netz 192.168.2.x, #die WLAN-Adressen liegen im Netz 192.168.1.x ifconfig 192.168.2.1 192.168.2.2 #Die WLAN-Adresse des Gegenübers remote 192.168.1.2 #Name des geheimen Schlüssels in /etc/openvpn secret geheim.key
Konfiguration auf dem Laptop:
dev tun #wie auf dem Desktop, nur umgekehrt ifconfig 192.168.2.2 192.168.2.1 remote 192.168.1.1 secret geheim.key #VPN-Adresse des Desktop-Rechners, da er als Router dient route-gateway 192.168.2.1 #Routing so ändern daß der Desktop über VPN Standardgateway ist redirect-gateway
Nun ist das VPN als solches funktionsfähig. Allerdings können Fremde immer noch das unverschlüsselte WLAN benutzen, um ins Internet zu gelangen. Das lässt sich mit iptables ändern. Hier der Befehl, der auf dem Desktop ausgeführt werden sollte:
iptables -t nat -A PREROUTING -i ath0 -d 192.168.1.1 -p udp --dport 1194 -j ACCEPT iptables -t nat -A PREROUTING -i ath0 -j REJECT
Damit erlaubt man einkommende Verbindungen auf ath0, also dem WLAN-Interface, falls die Zieladresse die des Desktops ist (aber nicht falls die Zieladresse im Internet liegt). Verbindungen werden nur für Port 1194/udp erlaubt. Alle anderen Anfragen werden zurückgewiesen.
Auf dem Laptop sollte man ebenfalls nur die OpenVPN-Verbindung auf dem WLAN-Interface erlauben:
iptables -A INPUT -i ath0 -p udp --dport 1194 -j ACCEPT iptables -A INPUT -i ath0 -j RECECT
Das erlaubt nur Verbindungen zu Port 1194/udp über das WLAN-Interface, andere Verbindungen werden zurückgewiesen.
Verschlüsselung mit WPA/WPA2
Etwas einfacher als eine VPN-Verbindung auf dem WLAN funktioniert die Verschlüsselung des WLANs selbst mit WPA. In einem kleinen Netzwerk ist WPA-PSK eine unkomplizierte Lösung. Man verwendet auf allen Rechnern einen gemeinsamen Schlüssel, der Zugang zum Netz gewährt. Das funktioniert allerdings nicht im Ad-Hoc-Modus, daher muß einer der Rechner als Access Point dienen. Dazu werden zwei Pakete benötigt:
- hostapd auf dem Desktop wandelt den Rechner in einen Access Point um und verwaltet die Anmeldung aller Rechner im WLAN.
- wpasupplicant auf dem Laptop meldet diesen als Client beim Access Point an und handelt die Verschlüsselung mit diesem aus.
Als nächstes wird ein gemeinsamer Schlüssel erstellt. Diesen kann man aus einem Passwort berechnen lassen. Die Sicherheit der Verschlüsselung steht und fällt mit der Qualität des Passwortes. Es darf maximal 63 Zeichen lang sein und sollte Buchstaben und Zahlen, aber keine Wörter beinhalten. Um an ein geeignetes Passwort zu kommen kann man pwgen benutzen:
pwgen -N1 -s 63
Das Passwort sollte man ausdrucken oder sonstwie sichern.
Zum Einrichten des hostapd-Dienstes werden zwei Dateien angepasst:
- /etc/default/hostapd enthält ein paar Startoptionen für den Dienst, dort kann man auch einstellen, daß er automatisch beim Systemstart geladen wird.
- /etc/hostapd/hostapd.conf enthält die eigentliche Konfiguration und Einstellungen für die diversen Authentifizierungs- und Verschlüsselungsmodi.
In der /etc/default/hostapd braucht man nur eine Zeile ändern. Aus
#RUN_DAEMON=yes
wird
RUN_DAEMON=yes
Nun muß der Dienst noch konfiguriert werden. Die vorgegebene Datei /etc/hostapd/hostapd.conf enthält schon viele nützliche Kommentare, hier sind meine Einstellungen:
#WLAN-Interface interface=ath0 #verwendeter Treiber driver=madwifi #Logging-Optionen logger_syslog=-1 logger_syslog_level=2 logger_stdout=-1 logger_stdout_level=2 debug=0 dump_file=/tmp/hostapd.dump #Weitere Standardeinstellungen ctrl_interface=/var/run/hostapd ctrl_interface_group=0 #Meine WLAN-SSID ssid=meinwlan #Keine Filterung von MAC-Adressen - leicht zu umgehen macaddr_acl=0 #Shared Key Authentifizierung auth_algs=2 #Standardeinstellungen eap_authenticator=0 eap_message=hello eapol_key_index_workaround=0 own_ip_addr=127.0.0.1 #WPA und WPA2 erlauben wpa=3 #Der Pre Shared Key wpa_passphrase=mein Schlüssel #Pre Shared Keys, kein EAP wpa_key_mgmt=WPA-PSK #CCMP/AES verwenden, kein TKIP wpa_pairwise=CCMP
Mit einem /etc/init.d/hostapd start
kann man den Dienst
nun laden. Beim nächsten Booten wird das automatisch geschehen. Damit ist die
Konfiguration des Access Points abgeschlossen.
Auf dem Client richtet mal wpasupplicant ein. Hier kann man alle
benötigten Optionen in der Datei /etc/network/interfaces
eintragen:
auto ath0 iface ath0 inet static wpa-driver madwifi wpa-ssid wlan wpa-key-mgmt WPA-PSK wpa-passphrase mein Schlüssel address 192.168.1.2 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.1
Mit ifdown ath0
und ifup ath0
kann man das Interface neu starten und die neue Konfiguration übernehmen.
Der hostapd-Dienst auf dem Access Point schreibt Statusmeldungen über
Anmeldungen im WLAN ins System-Log (/var/log/syslog), den Status
von wpa_supplicant auf dem Client kann man mit dem Programm
wpa_cli
überwachen. Nach dem Programmaufruf kann man mit
help
die verfügbaren Befehle anzeigen lassen, status
bzw. status verbose
zeigen die wichtigsten aktiven
Einstellungen an.
Wenn alles läuft ist die Konfiguration nun abgeschlossen und das WLAN abgesichert. Da die verwendeten Mechanismen als ausreichend sicher gelten dürfte es keinem Fremden gelingen, in das WLAN einzudringen, es sei denn er erfährt den Schlüssel für das Netz.
Betrieb unter FreeBSD
Treiber laden
Eine Inbetriebnahme unter FreeBSD war sehr einfach. Die benötigten
Konfigurationen für hostapd und wpa_supplicant hatte ich schon unter
Linux erstellt, und FreeBSD 6.0-RELEASE oder neuer unterstützt die WLAN-Karten
von Haus aus. Ebenso sind hostapd und wpasuppliant schon im Basissystem
enthalten. Der GENERIC-Kernel bringt passende Module mit, eigene Kernel
ebenfalls, wenn man sie mit make buildkernel
zusammen mit
allen verfügbaren Modulen gebaut hat. Man kann die Module von Hand laden oder
den Bootloader entsprechend konfigurieren. Dazu passt man die Datei
/boot/loader.conf an und fügt folgende Zeilen hinzu:
if_ath_load="YES" wlan_ccmp_load="YES" wlan_xauth_load="YES"
Das lädt beim Systemstart automatisch die Module für die Karte und für
WPA/CCMP. Das xauth-Modul ist eigentlich nicht erforderlich für meine
Konfiguration, allerdings weigert sich hostapd zu starten, wenn es nicht
geladen ist. Um die Module ohne Neustart direkt zu laden kann man
kldload
benutzen.
Netzwerk und Verschlüsselung aktivieren
Als nächstes werden die Netzwerkdaten eingestellt. Dazu legt man für das Interface ath0 eine Zeile in der /etc/rc.conf an:
ifconfig_ath0="inet 192.168.1.1 netmask 255.255.255.0 \ ssid meinwlan mode 11g mediaopt hostap"
Das weist der WLAN-Karte die IP 192.168.1.1 und die Netzmaske 255.255.255.0 zu, setzt die SSID auf "meinwlan", den Modus auf 802.11g und aktiviert die hostap-Option. Unter FreeBSD wird auf dem Desktop hostapd gestartet wenn das WLAN-Interface aufgebaut wird, entsprechend wird hostapd beendet wenn das Interface abgebaut wird. Dazu kann man zwei Dateien in /etc anlegen welche bei diesen Aktionen automatisch ausgeführt werden.
Die erste heißt start_if.ath0:
#!/bin/sh /usr/sbin/hostapd -B /etc/hostapd.conf
Die zweite heißt stop_if.ath0:
#!/bin/sh /usr/bin/killall hostapd
Durch /etc/rc.d/netif restart
kann man das WLAN-Interface
starten. Hostapd wird automatisch mitgeladen. Auf dem Client kann man
das Interface mit wpa_supplicant entsprechend einrichten.
Gateway-Funktionalität auf dem Access Point
Ich benutze auf dem Desktop eine ISDN-Verbindung mit isdnd und user-ppp. Um den Desktop unter FreeBSD dazu zu bewegen die Internetverbindung zu teilen sind zwei Schritte notwendig:
- Allgemeine Gateway-Funktion aktivieren
- Dazu fügt man in der /etc/rc.conf folgende Zeile ein:
gateway_enable="YES"
Danach führt man/etc/rc.d/routing restart
aus. - NAT/Masquerading für user-ppp aktivieren
- Dazu fügt man in der /etc/rc.conf folgende Zeile ein:
ppp_nat="YES"
Danach führt man/etc/rc.d/ppp-user restart
aus.
ndiswrapper und weitere Treiber in Debian
Debian Sarge enthält noch einige weitere Treiber für WLAN-Karten.
Die meisten davon kann man mit module-assistant bauen und installieren.
Einige der Pakete befinden sich allerdings nicht in main-Bereich von
Debian, sondern in contrib oder non-free. Damit man sie benutzen kann
muß apt-get
darauf Zugriff haben. Hier sind die Beispieleinträge
aus meiner /etc/apt/sources.list:
deb http://ftp.de.debian.org/debian sarge main contrib non-free deb http://security.debian.org/debian-security sarge/updates \ main contrib non-free
Nach einer Änderung muß apt-get update
ausgeführt werden.
Danach können die gewünschten Treiber installiert werden. Einige davon benötigen
zusätzlich noch die Firmware der Karte, welche nicht fest in der Karte
gespeichert ist sondern bei jedem Systemstart wieder neu dorthin geladen wird.
Den Paketen liegt üblicherweise eine entsprechende Anleitung bei. Hier sind
einige Beispiele:
- ndiswrapper
- erlaubt es, Windows-Treiber für Netzwerkkarten (nicht nur WLAN) einzubinden.
Neben dem Kernelmodul braucht man noch das Paket ndiswrapper-utils,
welches ebenfalls in Debian vorhanden ist. Auf der
ndiswrapper-Supportseite gibt es weitere Informationen.
module-assistant auto-install ndiswrapper-source
- hostap
- Neben dem hostapd-Dienst gibt es auch Treibermodule für Prism2/2.5/3
Chipsätze. Für einige Debian-Kernel gibt es fertige Pakete, man kann
die Treiber aber auch selbst bauen. Aktuelle 2.6er Kernel (Debian Testing
oder Unstable) beinhalten diese Treiber schon.
module-assistant auto-install hostap-source
- acx100
- Das Paket enthält Treiber für einige Texas Instruments Chipsätze. Leider
sind sie inkompatibel mit hostapd und wpasupplicant, so daß man diese Programme
bei acx100-Karten nicht verwenden kann:
module-assistant auto-install acx100-source
- at76c503a
- Unterstützung für Atmel AT76C503A basierte USB-WLAN-Adapter. Diese
Treiber werden ebenfalls nicht von hostapd und wpasupplicant unterstützt:
module-assistant at76c503a-source
- ipw2100, ipw2200
- Die enthaltenen Treiber unterstützen diverse Intel-WLAN-Chipsätze, wie
man sie in Centrino-Laptops finden kann. Aktuelle 2.6er Kernel (Debian Testing
oder Unstable) beinhalten diese Treiber schon.
module-assistant auto-install ipw2100-source
module-assistant auto-install ipw2200-source
Weiterführende Links
http://www.andreasjanssen.de - andreas.janssen@gmail.com