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.

Nach oben

verwendete Hardware

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.

Nach oben

verwendete Software

Nach oben

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.

Nach oben

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.

Nach oben

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 und iwpriv.

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:

modprobe ath_pci

Im laufenden Betrieb kann man die oben genannten Einstellungen mit wlanconfig ändern oder alternativ das Modul entladen und neu laden.

Nach oben

WLAN-Modus und Netzwerk einrichten

Die Inbetriebnahme eines rudimentären unverschlüsselten WLANs erfolgt nun in zwei Schritten:

  1. iwconfig verwenden, um die WLAN-Einstellungen vorzunehmen
  2. ifconfig 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.

Nach oben

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:

  1. openvpn installieren
  2. Schlüssel für das VPN generieren und auf beide Rechner kopieren
  3. OpenVPN konfigurieren
  4. OpenVPN starten und testen
  5. 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.

Nach oben

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:

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:

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.

Nach oben

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.

Nach oben

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.

Nach oben

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.

Nach oben

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

Nach oben

Weiterführende Links

Nach oben

letzte Aktualisierung: 2013-04-20, 07:07:21
http://www.andreasjanssen.de - andreas.janssen@gmail.com
Valid XHTML
 1.1! Valid CSS!