Création d'un point d'accès WiFi sous Debian Etch

WiFi

Introduction

Cet article détaille la création d'un point d'accès WiFi sécurisé sous Debian Etch. La solution recherchée ici n'aura pas pour but d'être la plus élégante ni la plus optimisée, mais simplement un moyen rapide de connecter une tablette Nokia N800 au réseau local en WiFi afin de mener divers tests sur cette plate-forme.

Matériel.

Toutes les cartes WiFi ne se valent pas et toutes ne sont pas supportées sous GNU/Linux. Il est donc grandement conseillé de préférer une carte basée sur un chipset Intersil Prism ou Atheros.

N'ayant jusqu'à présent aucune carte WiFi sous la main, je me suis naturellement tourné vers une carte WiFi au format Cardbus pour faire d'une pierre deux coups : équiper mon portable (Dell Latitude C610) avec une carte WiFi permettant de l'utiliser comme point d'accès au cours de ce test, puis de disposer d'une connectivité lors de certains déplacements (FOSDEM par exemple) par la suite.

La carte WiFi retenue est une Netgear WAG511, basée sur un chipset Atheros. Mon portable ayant rendu l'âme entre l'achat de la carte WiFi et sa réception, je me suis équipé d'un adaptateur Carbus PCI et réalisé le point d'accès sur la seule machine de test encore disponible, un Dell PowerEdge 2300. Celle-ci a été réinstallée avec une Debian Etch sans aucune modification (noyau y compris) juste avant ce test.

Installation de MadWiFi :

Les cartes basées sur le chipset Atheros sont supportées sous Linux par le projet MadWifi. Je vais donc détailler son installation selon la procédure décrite dans la documentation officielle du projet MadWiFi.

Les drivers MadWifi contiennent des éléments non-libres, il est donc nécessaire de commencer par inclure les sections contrib et non-free dans les sources d'APT. Les entrées correspondantes sont donc ajoutées au fichier de configuration /etc/apt/sources.list :

# 
# deb cdrom:[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 NETINST Binary-1 20070407-11:29]/ etch contrib main

#deb cdrom:[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 NETINST Binary-1 20070407-11:29]/ etch contrib main

deb http://ftp2.fr.debian.org/debian/ etch main contrib non-free
deb-src http://ftp2.fr.debian.org/debian/ etch main contrib non-free

deb http://security.debian.org/ etch/updates main contrib non-free
deb-src http://security.debian.org/ etch/updates main contrib non-free

On peut maintenant mettre à jour la liste de paquets disponibles et installer les sources de Madwifi et les en-têtes du noyau indispensables à leur compilation :

# apt-get update
# apt-get install linux-headers-2.6.18-4-686
# apt-get install madwifi-tools madwifi-doc madwifi-source

Les modules MadWiFi seront compilés et installés à la Debian. On va pour cela utiliser l'assistant de modules noyau de Debian, qui permet d'intégrer proprement et facilement les nouveaux modules au noyau installé. La procédure est alors grandement automatisée et deux commandes suffisent pour préparer l'environnement à la création de nouveaux modules, puis compiler et intégrer ces nouveaux modules au noyau :

# m-a prepare
# m-a a-i madwifi

Il ne nous reste plus qu'à charger le module fraichement créé et faire en sorte qu'il soit chargé automatiquement lors de chaque redémarrage du système :

# modprobe ath_pci
# echo ath_pci >> /etc/modules

Configuration de l'interface :

La carte réseau WiFi est maintenant reconnue par le noyau, il ne nous reste plus qu'à la configurer. Les interfaces WiFi, comme toute interface réseau, peuvent être listées par ifconfig. Les cartes basées sur le chipset Atheros apparaissent alors comme ath*, de la même manière que les cartes ethernet sont nommées eth*. Toutefois, ces cartes disposent d'extensions spécifiques aux interfaces WiFi qui ne peuvent être gérées par ifconfig, telles que l'ESSID ou le niveau de sensibilité. La commande iwconfig permet de manipuler ces paramètres spécifiques. Elle est fournie (ainsi que quelques autres) par le paquet wireless-tools que nous allons donc installer :

# apt-get install wireless-tools

Nous allons maintenant pouvoir configurer notre interface WiFi à travers le fichier de configuration /etc/network/interfaces, comme toute interface réseau. Nous disposons pour cela de toutes les directives classiques, plus quelques directives spécifiques qui seront passées au module MadWifi.

L'interface WiFi est destinée à fonctionner en tant que point d'accès utilisé par le Nokia N800. Par conséquent, nous allons configurer cette interface en tant que maître du réseau WiFi (wireless-mode master) et lui attribuer une IP fixe conforme au plan d'adressage du réseau local. L'entrée correspondante sera donc ajoutée dans le fichier /etc/network/interfaces :

auto ath0
iface ath0 inet static
	madwifi-base wifi0
	address	192.168.5.1
	netmask	255.255.255.0
	wireless-mode Master
	wireless-essid site_sans_nom
	wireless-key restricted 9975EEF080405F0717FC41F2A32C1E71FEAD120EE2B6ED12FE872D3047BE7385

Naturellement, la PSK donnée ici n'est pas celle utilisée réellement dans mon fichier de configuration. Les clés que j'utilise dans cet article ou dans mes fichiers de configuration proviennent toutes du générateur de clés GRC's Ultra High Security Password Generator. Ce générateur vous permet d'obtenir à chaque visite un nouvel ensemble de trois chaînes utilisables comme clé hexadécimale (chaîne 1) ou comme phrase de passe ASCII imprimable (chaîne 2) ou alphanumérique (chaîne 3).

Notre interface étant maintenant configurée, il faut s'assurer que le système permettra la connexion du N800 vers les machines du réseau local et l'extérieur. Nous allons pour cela utiliser les fonctionnalités de Netfilter afin d'accepter la circulation des paquets entre l'interface WiFi et l'interface Ethernet et d'assurer au passage la translation d'adresse afin d'intégrer simplement la machine WiFi au réseau local.

Nous allons pour cela utiliser une méthode décrite dans l'article WIFI sous Linux de Melaneum en ajoutant les lignes suivantes au fichier /etc/rc.local :

modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat
iptables -A FORWARD -i ath0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o ath0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.5.0/24 -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward

Il suffit maintenant de redémarrer les fonctionnalités réseau et de lancer le script précédent pour tester notre nouveau point d'accès :

# /etc/init.d/networking stop
# /etc/init.d/networking start
# /etc/rc.local

La configuration mise en place jusqu'à présent fonctionne. Toutefois, elle est loin d'être acceptable étant donné que la clé WEP spécifiée dans le fichier /etc/network/interfaces n'est pas utilisée par l'interface utilisée en tant que master. La carte semble alors rester en mode open et non en mode restricted malgrès la directive donnée dans le fichier de configuration. Le réseau est donc ouvert à tous les vents. A ce niveau, il est donc conseillé de désactiver l'interface avant la venue du premier "wardriver".

Sécurisation du point d'accès :

La sécurisation du point d'accès sera assurée par le système de contrôle d'accès hostapd.

# apt-get install hostapd

Nous allons commencer par modifier le fichier de configuration principal de hostapd, /etc/hostapd/hostapd.conf pour aboutir à un fichier presque analogue à celui décrit dans Bering-uClibc User's Guide, chapter 18 : Setting up a wireless access point with WPA. Par soucis de concision, je ne donne ici que les sections modifiées par rapport au fichier par défaut :

# AP netdevice name (without 'ap' postfix, i.e., wlan0 uses wlan0ap for
# management frames); ath0 for madwifi
interface=ath0

# Driver interface type (hostap/wired/madwifi/prism54; default: hostap)
driver=madwifi

# SSID to be used in IEEE 802.11 management frames
ssid=wlan_sans_nom

# IEEE 802.11 specifies two authentication algorithms. hostapd can be
# configured to allow both of these or only one. Open system authentication
# should be used with IEEE 802.1X.
# Bit fields of allowed authentication algorithms:
# bit 0 = Open System Authentication
# bit 1 = Shared Key Authentication (requires WEP)
auth_algs=3

# This field is a bit field that can be used to enable WPA (IEEE 802.11i/D3.0)
# and/or WPA2 (full IEEE 802.11i/RSN):
# bit0 = WPA
# bit1 = IEEE 802.11i/RSN (WPA2) (dot11RSNAEnabled)
wpa=1

# WPA pre-shared keys for WPA-PSK. This can be either entered as a 256-bit
# secret in hex format (64 hex digits), wpa_psk, or as an ASCII passphrase
# (8..63 characters) that will be converted to PSK. This conversion uses SSID
# so the PSK changes when ASCII passphrase is used and the SSID is changed.
# wpa_psk (dot11RSNAConfigPSKValue)
# wpa_passphrase (dot11RSNAConfigPSKPassPhrase)
#wpa_psk=0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
#wpa_passphrase=secret passphrase
wpa_passphrase=OzxosGBIgFgEfErSaLwedZUBvAUhCg89WdmYKwPY21BNhqxShTAZhFtseeaUPam

# Set of accepted key management algorithms (WPA-PSK, WPA-EAP, or both). The
# entries are separated with a space.
# (dot11RSNAConfigAuthenticationSuitesTable)
#wpa_key_mgmt=WPA-PSK WPA-EAP
wpa_key_mgmt=WPA-PSK

# Set of accepted cipher suites (encryption algorithms) for pairwise keys
# (unicast packets). This is a space separated list of algorithms:
# CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
# TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
wpa_pairwise=TKIP CCMP

Il y a deux moyens de spécifier la PSK dans la configuration de hostapd. La première est d'utiliser la directive wpa_psk avec une clé de 64 caractères hexadécimaux. La seconde est de spécifier une phrase de passe de 63 caractères ASCII avec la directive wpa_passphrase. Cette phrase de passe sera "mixée" avec l'ESSID afin d'obtenir une PSK. Le Nokia N800 ne permettant d'utiliser que la seconde méthode, le choix est tout relatif.

La génération d'une PSK à partir d'une phrase de passe est possible lorsqu'on utilise WPA, mais pas WPA2. Le paramètre wpa sera donc obligatoirement fixé à 1 et non à 3.

Nous pouvons maintenant décommenter la ligne suivante dans le fichier /etc/default/hostapd afin de permettre le démarrage du démon :

RUN_DAEMON="yes"

Et lancer manuellement ce démon :

# /etc/init.d/hostapd start

Le point d'accès WiFi est maintenant sécurisé par hostapd. On peut d'ailleurs remarquer que l'ESSID utilisé est bien celui spécifié dans la configuration hostapd et non celui du fichier de configuration de l'interface. La connexion au réseau wlan_sans_nom est possible depuis le N800 avec la phrase de passe spécifiée dans la configuration de hostapd.

Attribution dynamique d'adresses IP :

La configuration obtenue à ce stade est satisfaisante. Toutefois, il peut être plus confortable d'installer un serveur DHCP sur le point d'accès afin d'attribuer dynamiquement des adresses IP aux machines s'y connectant. Nous allons utiliser pour cela le paquet dhcpd3-server :

# apt-get install dhcp3-server

La configuration du service est définie par le fichier /etc/dhcp3/dhcpd.conf. La configuration est ici minimale. Elle ne couvre qu'une seule plage d'adresses pour laquelle le serveur fait autorité. De plus, les serveurs DNS sont spécifiés de manière statique :

# The ddns-updates-style parameter controls whether or not the server will
# attempt to do a DNS update when a lease is confirmed. We default to the
# behavior of the version 2 packages ('none', since DHCP v2 didn't
# have support for DDNS.)
ddns-update-style none;

# option definitions common to all supported networks...
option domain-name "site-sans-nom.org";
option domain-name-servers 82.216.111.125, 82.216.111.124, 82.216.111.121;


default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
authoritative;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

subnet 192.168.5.0 netmask 255.255.255.0 {
  range 192.168.5.129 192.168.5.254;
  option routers 192.168.5.1;
  option broadcast-address 192.168.5.255;
}

De plus, le service ne sera actif que sur l'interface ath0, ce que nous spécifions dans le fichier /etc/default/dhcp3-server :

# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACES="ath0"

Conclusion :

Le point d'accès a été mis en place en une après-midi. La solution obtenue correspond aux besoins initiaux, à savoir permettre l'accès de la plate-forme Nokia N800 au réseau local avec un niveau de sécurité convenable. Encore une fois, le système a été mis en place pour répondre au plus vite à un besoin ponctuel. Cette solution est donc loin d'être parfaite et de nombreuses améliorations peuvent y être apportées. Outre le fait qu'un serveur Dell PowerEdge soit inadapté à la réalisation d'un simple point d'accès, bien des points restent à revoir dans la configuration des services pour obtenir un système "de production".

On devra par exemple permettre le routage entre le segment ethernet (192.168.2.0/24) et le segment WiFi (192.168.5.0/24) sans recourir à une translation d'adresse. Il pourrait aussi être interessant d'établir des règles de filtrage aux paquets transitant entre les deux segments.

Il peut aussi être interessant de mettre en place un mécanisme permettant de transmettre aux clients DHCP les adresses des DNS utilisés par le point d'accès lui-même, au lieu de les spécifier "en dur". De même, la modification du script rc.local réalisée ici n'est pas des plus élégantes et devrait être entièrement revue si elle était destinée à une installation propre et utilisée sur le long terme.

Enfin et surtout, les fonctionnalités du paquet hotplug peuvent être exploitées pour gérer l'insertion et le retrait de la carte WiFi de l'adaptateur cardbus.

Tout cela dépasse toutefois le cadre de cet article, la procédure recherchée et décrite ici n'ayant pour but que de répondre à des besoins limités en termes de fonctionnalités et de durée.

RSL (03/09/2007)

Sommaire / Administration système et réseau / Création d'un point d'accès WiFi sous Debian Etch

Valid HTML 4.01 Created with VIM