Point d'accès sécurisé par hostAPd

De Lea Linux
Aller à la navigation Aller à la recherche

AVERTISSEMENT

Cet article est en cours d'écriture/mise en page. Tant que cette avertissement n'a pas disparu, merci de NE PAS éditer cette page vous-même. Veuillez utiliser le lien "Page de discussion" pour soumettre vos idées. Merci par avance :) --Glandos 26 avr 2006 à 22:38 (CEST)

Fred> en fait tant que la page n'est pas modérée par un admin du site : elle n'apparaitra pas autrement qu'avec la version 'initiale'.

Introduction

Ce n'est pas vraiment un tutorial, mais plutôt un retour d'expérience. Mais finalement c'est ce que sont tous les tutoriaux. Je tiens simplement à vous prévenir qu'avant ce week-end, je n'avais jamais installé de matériels Wi-fi. Je ne suis donc pas un expert, mais j'ai appris un certain nombre de choses qui pourront être utile.

Présentation

Tout d'abord, il convient de préciser ce que je voulais faire, en plus de « installer le wifi chez moi ». Pour ne pas verser dans l'étalage de vie privée, voici ce dont je disposais :

  • Une freebox basique (sans fonctions routeur ni wifi).
  • Un PC (passerelle pour le reste du document) connecté directement à la freebox sous Debian/testing. Elle dispose de deux cartes réseau Ethernet RJ45 (filaire) qui sont identifiées par l'OS en tant que eth_adsl et eth_local. La freebox est reliée sur eth_adsl. Un firewall tourne entre eth_adsl et eth_local à l'aide d'iptables.
  • Un switch branché sur eth_local, et sur lequel sont reliés deux clients de manière on ne peut plus classique.
  • Une carte Wi-Fi D-Link DWL-G520 PCI avec chipset Atheros (le chipset importe beaucoup plus que la carte, croyez moi !!).
  • Un ordinateur portable Asus A7D, avec une carte Ethernet et une carte Wi-fi avec un chipset Broadcom 4318 (là encore, il a fallu le trouver...)

TODO : schéma

Le but est donc pour moi de faire que le portable puisse se brancher en Wi-fi sur le réseau local, exactement comme les autres clients. Je ne voulais pas me taper des règles firewall en plus, alors j'ai opté pour le bridge.

Le bridge, invention magique

Présentation du bridge

Le bridge (pont en anglais) permet de faire une chose miraculeuse : réunir de manière transparente plusieurs cartes réseaux, en une seule virtuelle. Il y a quelques inconvénients, notamment sur le fait que le démarrage est un peu plus lent, le temps que le bridge se fasse, et que c'est un peu compliqué pour la tête. Mais je voulais vraiment que le portable se connecte en Wi-fi en changeant le minimum de choses sur la passerelle.

Installation

Pour cela, il est donc nécessaire d'avoir un noyau compilés avec les bonnes options. Pour l'utilisateur normal qui n'a pas recompilé son noyau, ne chercher pas, c'est bon, ça ira :) Pour les autres, trouvez comment activer le bridging dans le noyau, je ne sais pas comment on fait :p Ensuite, il faut installer les utilitaires nécessaires :

apt-get install bridge-utils

Pour les autres systèmes ça doit être dans le même style. Il faut donc créer ce bridge. Sachez d'abord que tout sera géré par ce futur bridge. Cela veut donc dire que vous ne parlerez plus directement à vos interfaces (ici eth_local et ath0), mais directement à bridge_local (j'aime bien les noms explicites :) ). Cela implique donc que vous n'avez RIEN à configurer sur les cartes réseaux qui vont être incluses dans ce bridge, et même mieux : il faut enlever ce qui est propre à la configuration de ces cartes. Chez Debian, tout se passe dans /etc/network/interfaces ce qui est plutôt pratique. Voici donc le fichier AVANT l'installation du bridge :

# This file describes the network interfaces available on your system

  1. and how to activate them. For more information, see interfaces(5).
  1. The loopback network interface

auto lo iface lo inet loopback

  1. The primary network interface

auto eth_adsl iface eth_adsl inet dhcp

auto eth_local iface eth_local inet static

      address 192.168.0.254
      netmask 255.255.255.0
      broadcast 192.168.0.255

La carte eth_adsl est donc initialisée au démarrage (ligne auto eth_adsl), a une adresse IPv4 (inet) et ses paramètres réseaux lui sont attribués automatiquement (dhcp), en l'occurence par la Freebox. De même, la carte eth_local est initialisée au démarrage, mais ses paramètres réseaux sont fixés par moi (static), avec les paramètres spécifiés en dessous. Je pense que c'est assez clair.

Après l'installation du bridge, voici ce que j'ai :

# This file describes the network interfaces available on your system

  1. and how to activate them. For more information, see interfaces(5).
  1. The loopback network interface

auto lo iface lo inet loopback

  1. The primary network interface

auto eth_adsl iface eth_adsl inet dhcp

iface ath0 inet static

       wireless-mode master
       wireless-channel 9


auto bridge_local iface bridge_local inet static

       address 192.168.0.254
       netmask 255.255.255.0
       broadcast 192.168.0.255
       bridge_ports eth_local ath0

La partie eth_adsl n'a pas changé : c'est normal :) Par contre, on voit que bridge_local a les même paramètres que mon ex-carte eth_local. Sauf que en plus, on lui dit que c'est un bridge qui contient les cartes eth_local et ath0. Ainsi, dès que j'envoie des paquets depuis la passerelle sur l'adresse 192.168.0.254, ceux-ci seront transmis automatiquement aux deux cartes, et réciproquement, lorsqu'une carte reçoit un paquet pour 192.168.0.254, elle le transmet au bridge. Moi, je trouve ça magique :) Il y a également une partie sur ath0 me direz-vous. Oui d'accord, mais elle n'est là que pour régler certains paramètres propres au Wi-fi, rien de plus ! Vous remarquerez qu'il n'y a pas de ligne auto ath0, donc elle n'est pas initialisée au démarrage.

Activation

Ceci étant fait, il y a plusieurs méthodes pour activer ce bridge. Sachez que dans la plupart des cas, ceci va foutre en l'air la connexion ! C'est ce qui m'est arrivé, ça fait un peu tout drôle. Normalement, l'ADSL reste en place, mais ce n'est pas le cas de la connexion sur eth_local.

Soit vous faites :/etc/init.d/networking/force-reload

Soit :/etc/init.d/networking/stop && /etc/init.d/networking/start

Soit carrément un bon vieux reboot : reboot Je sais pas pourquoi je mets la commande... On sait jamais :p Enfin, après l'une de ses trois méthodes (voire les trois), en tapant

ifconfig

Vous devriez voir ça : ath0 Lien encap:Ethernet HWaddr 00:15:E9:3F:AA:90

         adr inet6: fe80::215:e9ff:fe3f:aa90/64 Scope:Lien
         UP BROADCAST RUNNING MULTICAST  MTU:2290  Metric:1
         RX packets:163080 errors:955516 dropped:0 overruns:0 frame:955509
         TX packets:315546 errors:613 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:200 
         RX bytes:13726343 (13.0 MiB)  TX bytes:462013643 (440.6 MiB)
         Interruption:185 Mémoire:e08e0000-e08f0000 

bridge_lo Lien encap:Ethernet HWaddr 00:11:95:C5:44:61

         inet adr:192.168.0.254  Bcast:192.168.0.255  Masque:255.255.255.0
         adr inet6: fe80::211:95ff:fec5:4461/64 Scope:Lien
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:294178 errors:0 dropped:0 overruns:0 frame:0
         TX packets:454533 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:0 
         RX bytes:458148569 (436.9 MiB)  TX bytes:541885943 (516.7 MiB)

eth_adsl Lien encap:Ethernet HWaddr 00:11:D8:09:6D:31

         inet adr:xx.xx.xx.xx  Bcast:xx.xx.xx.xx  Masque:255.255.255.0
         adr inet6: fe80::211:d8ff:fe09:6d31/64 Scope:Lien
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:279243 errors:0 dropped:0 overruns:0 frame:0
         TX packets:264750 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:1000 
         RX bytes:189704796 (180.9 MiB)  TX bytes:66643253 (63.5 MiB)
         Interruption:177 Adresse de base:0xb000 

eth_local Lien encap:Ethernet HWaddr 00:11:95:C5:44:61

         adr inet6: fe80::211:95ff:fec5:4461/64 Scope:Lien
         UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
         RX packets:403023 errors:0 dropped:0 overruns:0 frame:0
         TX packets:142751 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:1000 
         RX bytes:460239899 (438.9 MiB)  TX bytes:80409812 (76.6 MiB)
         Interruption:169 Adresse de base:0xd800 

lo Lien encap:Boucle locale

         inet adr:127.0.0.1  Masque:255.0.0.0
         adr inet6: ::1/128 Scope:Hôte
         UP LOOPBACK RUNNING  MTU:16436  Metric:1
         RX packets:38438 errors:0 dropped:0 overruns:0 frame:0
         TX packets:38438 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 lg file transmission:0 
         RX bytes:3297781 (3.1 MiB)  TX bytes:3297781 (3.1 MiB)

On constate donc que eth_local et ath0 n'ont aucune adresse IPv4 (inet adr) et que bridge_local a bien l'adresse 192.168.0.254. Quant à eth_adsl, pour les xx, c'est moi qui les ai mis : j'ai une IP fixe, je tiens à garder ma vie privée :)

Créer le point d'accès

Présentation de hostAPd

Étape suivante : transformer une simple carte Wi-fi en puissant point d'accès (accesss point en anglais soit AP). Pour cela, après avoir parcouru rapidement le web, une solution s'est imposée : hostAPd disponible sur cette page Attention, il faut différencier les 3 projets du site : hostAP driver, hostAPd et wpa_supplicant. hostAP driver ne m'intéressait pas : c'est l'implémentation libre d'un driver pour carte Wi-fi. Wpa_supplicant est un client WPA, comme on va le voir par la suite. Et hostAPd est le logiciel capable de faire tourner votre carte Wi-fi « de base » en point d'accès genre « Enterprise » :)

Installation

Là, j'ai été confronté à l'instabilité de Debian/testing... En effet, les binaires hostAPd sont présents mais pas compilés avec les bonnes options pour madwifi, et les sources sont celles de la version 0.5.0 pleines de bugs corrigés depuis. J'ai perdu un temps monstre sur ça, que je vais vous épargner ici :) Mais du coup le moment est bien choisi pour aborder la compilation « à la mimine ».

Pour cela, il faut d'abord installer quelques outils, dont le fameux gcc. Sous Debian (et là ça marche bien :p ) :

apt-get install build-essential gcc

Je pense que seul gcc est nécessaire dans notre cas, mais bon on sait jamais, ça pourra servir :). Ensuite, on va avoir besoin des sources de hostAPd (normal). Ce qui m'intéressait étant aussi de faire fonctionner hostAPd avec madwifi, il me fallait également les sources de madwifi. On fait donc un petit

apt-get install madwifi-source

Et un téléchargement de hostAPd dans le répertoire /usr/src/, classique pour toute compilation standard. Il faut maintenant extraire les fichiers :

tar xvfj madwifi.tar.bz2 tar xvfz hostapd-0.5.2.tar.gz

Vous avez donc remarqué qu'à cette heure, la version en cours de hostAPd est la 0.5.2 ;) Rendez-vous dans le répertoire hostapd-0.5.2/ créé lors de l'extraction. Vous pouvez lire le README, c'est en anglais, mais ça peut faire du bien de temps à autre. L'essentiel à comprendre est qu'il faut créer un fichier .config lui disant quoi mettre lors de la compilation. Heureusement, un listing des options est présent. Faites donc :

cp defconfig .config Et éditez ce fichier .config. Voilà à quoi ressemble le mien :

# Driver interface for Host AP driver

  1. CONFIG_DRIVER_HOSTAP=y
  1. Driver interface for wired authenticator
  2. CONFIG_DRIVER_WIRED=y
  1. Driver interface for madwifi driver

CONFIG_DRIVER_MADWIFI=y CFLAGS += -I../modules/madwifi/ # change to reflect local setup; directory for madwifi src

  1. Driver interface for Prism54 driver
  2. CONFIG_DRIVER_PRISM54=y
  1. Driver interface for drivers using Devicescape IEEE 802.11 stack
  2. CONFIG_DRIVER_DEVICESCAPE=y
  1. Driver interface for FreeBSD net80211 layer (e.g., Atheros driver)
  2. CONFIG_DRIVER_BSD=y
  3. CFLAGS += -I/usr/local/include
  4. LIBS += -L/usr/local/lib
  1. IEEE 802.11F/IAPP
  2. CONFIG_IAPP=y
  1. WPA2/IEEE 802.11i RSN pre-authentication
  2. CONFIG_RSN_PREAUTH=y
  1. IEEE 802.11i/IEEE 802.11e STAKey negotiation for direct link connection
  2. CONFIG_STAKEY=y
  1. Integrated EAP server

CONFIG_EAP=y

  1. EAP-MD5 for the integrated EAP server
  2. CONFIG_EAP_MD5=y
  1. EAP-TLS for the integrated EAP server

CONFIG_EAP_TLS=y

Tout le reste est commenté, j'en ai rien à faire, je n'ai besoin que du WPA avec un driver madwifi. Pour les plus curieux, j'ai dû laisser CONFIG_EAP et CONFIG_EAP_TLS, parce que sinon ça plantait, ce sera visiblement corrigé dans la version 0.5.3. Remarquez aussi la ligne pour madwifi : CFLAGS contient le chemin vers les sources de madwifi, fraîchement décompressé dans le répertoire /usr/src/modules/madwifi/. Sauvegardez et quittez. C'est parti pour l'instant geek crucial :

make

Simple non ? Moi ça me déroute parfois tout ce qu'il peut écrire avec aussi peu de lettres tapées :) Si tout se passe bien, il n'affiche aucune ligne trop inquiétante remplie d'étoiles et de mot ERROR. Sinon, ben euh, posez vos questions après le bip.

Maintenant que c'est compilé, faut l'installer. En gros, la plupart du temps, ça consiste en un simple copier/coller des fichiers compilés. Rassurez-vous la procédure standard est on ne peut plus explicite :

make install

Et pouf. Comme c'est indiqué, les exécutables sont installés dans /usr/local/bin par défaut. C'est très bien là où c'est :)

Configuration de hostAPd

Prochaine étape : la configuration de hostAPd. Je vous propose une astuce pour pas trop se casser la tête : installer le paquet Debian de hostAPd, qui, même s'il est défectueux, installe les fichiers par défaut au bon endroit pour vous. Il n'y aura plus qu'à faire quelques retouches. C'est parti :

apt-get install hostapd Si jamais vous voulez retirer les exécutables (présent dans /sbin ou /usr/sbin pour le paquet Debian) pour éviter de s'emmêler les pinceaux :

apt-get remove hostapd Et normalement les fichier de configuration sont restés là :) À savoir :

 * /etc/default/hostapd - Permet d'activer ou de désactiver le lancement automatique de hostAPd
 * /etc/hostapd/hostapd.conf - Fichier de configuration de hostAPd
 * /etc/init.d/hostapd - Script shell gérant l'exécution et l'arrêt de hostAPd en tant que démon.

On va d'abord éditer le script afin de lancer le bon programme. Dans votre éditeur de texte chercher la ligne suivante :

DAEMON=/usr/sbin/hostapd Chez moi, c'est la douzième. Remplacez la par :

DAEMON=/usr/local/bin/hostapd Ensuite, on va aller configurer hostAPd. Le plus dur est de lire tous les commentaires en fait :) Mais pour aller un peu plus vite, voici les lignes qui servent dans MON cas (simple WPA-PSK) : #La carte Wifi, forcément indispensable :) interface=ath0

  1. Si la carte est bridgée et utilise madwifi, il faut préciser le nom du bridge

bridge=bridge_local

  1. Le driver nécessité par la carte

driver=madwifi

  1. Options de log par défaut, elles sont très bien :)

logger_syslog=-1 logger_syslog_level=1 logger_stdout=-1 logger_stdout_level=2

debug=2

dump_file=/tmp/hostapd.dump

  1. Contrôle du programme, encore une fois, le réglage par défaut est nickel :)

ctrl_interface=/var/run/hostapd

ctrl_interface_group=0

  1. Le nom de votre réseau. C'est important. Choisissez un nom à peu près reconnaissable et pas trop long.

ssid=MADOUIFI

  1. Comment gérer les adresses MAC (adresse Hardware des cartes réseaux)
  2. C'est une sécurité qui peut facilement être contournée, mais est néanmoins pratique, car elle est facile à mettre en place
  3. En effet, hostAPd va vérifier l'adresse MAC de la carte Wifi qui fait une demande d'accès et pourra alors, sur cette seule adresse, soit continuer le processus d'identification, soit s'arrêter et refuser la carte.
  4. Les paramètres possibles sont les suivants :
  5. 0 : Tout accepter à moins qu'elle ne soit dans la liste noire
  6. 1 : Tout refuser, à moins qu'elle ne soit dans la liste blanche
  7. 2 : Vérifier l'adresse auprès d'un serveur RADIUS (honnêtement, pour son réseau local, ça ne sert à rien)
  8. Le meilleur paramètre pour commencer est 1. Ça réduit de beaucoup les risques de piratage.

macaddr_acl=1

  1. Chemin des fichiers pour les listes noire et blanche
  2. Je vous conseille de les créer tout de suite, on verra plus tard pour les remplir correctement

accept_mac_file=/etc/hostapd/hostapd.accept deny_mac_file=/etc/hostapd/hostapd.deny

  1. La description anglaise pour les curieux :)

auth_algs=1

  1. Celui là, je sais pas trop... Je crois qu'on peut l'enlever, mais bon je suis pas sûr, j'ai pas testé :)

eap_server=0

  1. Dis qu'on veut faire du WPA-PSK

wpa=1

  1. Votre clé, le coeur de la sécurité du WPA-PSK :)

wpa_passphrase=SupèRecléDelAmor,Avecdetrucch3l0us;)

  1. Pour un petit peu plus de sécurité, vous pouvez attribuer une clé WPA par adresse MAC (donc par ordinateur).
  2. C'est quand même un peu plus embêtant à maintenir...
  3. wpa_psk_file=/etc/hostapd/wpa_psk
  1. On définit ce qu'on veut comme WPA

wpa_key_mgmt=WPA-PSK

  1. Et l'algo de cryptage

wpa_pairwise=TKIP

  1. Quelques options temporelles. Pas forcément nécessaire pour que ça marche :)

wpa_group_rekey=600

wpa_gmk_rekey=86400

Et la touche finale. Éditez le fichier /etc/default/hostapd et décommentez la ligne suivante :

RUN_DAEMON=yes Et voilà. C'est fini. Enfin, non, ce n'est pas tout à fait exact. La configuration du serveur est finie. Il reste à la tester et à configurer des clients :) En avant toute !

Première validation du point d'accès

Premier test. Normalement, la commande suivante :

/etc/init.d/hostapd start

devrait donner un résultat positif. Faites ensuite

/etc/init.d/hostapd stop hostapd -dd /etc/hostapd/hostapd.conf

Cela lance le programme en avant plan en mode débug, idéal pour vérifier que tout marche bien. Ne vous inquiétez pas trop de ce qu'il dit, tant qu'il ne vous redonne pas la main, c'est bon signe :) En général, il dit qu'il se met en attente.

Configurer le client

La dernière étape, c'est de configurer son client.

Sous Ubuntu ...

... comme sous Windows