Raspberry Pi, CoovaChilli et Freeradius pour un Hotspot Wifi avec portail captif

Pour une installation du hotspot en automatique, consultez l’article ici.

 

Je vous avais parlé il y a un moment de faire un point d’accès Wifi en PHP et de contrôler les connexions. Seulement si le principe était simple, le résultat l’était aussi peut être un peu trop. Donc aujourd’hui on va installer un outil beaucoup plus abouti : CoovaChilli.

WiFI-Hotspot-Raspberry Pi

Attention : cet article est long, très long…

Qu’est-ce que CoovaChilli ?

CoovaChilli est la version OpenSource du projet ChilliSpot. Il propose une interface utilisateur pour authentifier les utilisateurs qui se connectent à un hotspot (pas forcément Wifi). Il a l’avantage de ne pas nécessiter de modules spécifiques au niveau du kernel, la gestion AAA est déléguée à un serveur RADIUS (local ou non) et l’authentification OAuth (non testée par votre serviteur).

Bref ca fait tout ce qu’il faut pour gérer son hotspot (y compris authentification 802.1x ou par adresse MAC) !

Qu’est ce que FreeRadius ?

FreeRadius (version OpenSource de RADIUS) permet d’avoir sur son serveur/machine un protocole réseau qui est utilisé pour gérer les authentifications et les comptes d’utilisateurs. Il permet de contrôler les accès (authentification) mais aussi d’en surveiller les usages et d’y appliquer des règles d’autorisation ou de rejet sur base d’attributs comme par exemple l’heure, la durée, le volume de données, etc.. Le fameux AAA : authentication, authorization, and accounting

Installation

Ce dont vous allez avoir besoin :

  • Un Raspberry Pi avec sa carte SD (minimum 2Gb)
  • Un adaptateur Wifi. Pensez à vérifier sa compatibilité avec le Raspberry au moment de l’achat ! De plus la taille de la clé va jouer sur sa portée et le débit proposé. Il pourrait vous falloir une clé Wifi avec antenne intégrée. Dans ce cas un hub USB alimenté pourra être utile.
  • Un câble Ethernet pour relier le Raspberry à votre routeur. C’est par cette connexion que le Raspberry doit avoir accès à Internet (et que le SSH doit être disponible)

La connexion sur le hotspot se fait sur l’interface Wifi. Le Raspberry doit donc être connecté à Internet via le câble Ethernet. C’est d’ailleurs par lui que je vais me connecter en SSH pour faire l’installation et configuration.

Concernant le système d’exploitation, j’ai installé une Raspbian minimaliste par le réseau pour qu’elle soit à jour. Vous trouverez toutes les démarches ici.

Le Wifi

Il s’agit de mettre en place votre dongle wifi pour pouvoir faire office de hotspot. J’utilise une clé Ralink RT5370:

Ralink Technology, Corp. RT5370 Wireless Adapter

Utilisant un composant non supporté par défaut il a donc fallu mettre en place un module avant de configurer l’interface :

  1. Télécharger le module pour supporter le rt2870 (si vous en avez besoin !)
    wget "http://git.kernel.org/?p=linux/kernel/git/firmware/linux-firmware.git;a=blob_plain;f=rt2870.bin" -O /lib/firmware/rt2870.bin
  2. Désactiver le mode turbo qui pose des problèmes de stabilité (si vous utilisez une clé avec un chipset rt2870)
    bash -c "echo options smsc95xx turbo_mode=N > /etc/modprobe.d/smscnonturbo.conf"
  3. Vous pouvez redémarrer le Raspberry pour que le module soit pris en charge. La commande « ifconfig -a » va lister votre nouvelle interface.
  4. Pensez à contrôler que cette clé peut être utilisée en tant que point d’accès (c’est quand même le but !) :
    • Téléchargez les outils iw pour obtenir des informations sur votre clé Wifi
      wget https://www.kernel.org/pub/software/network/iw/iw-3.14.tar.gz
      tar zxvf iw-3.14.tar.gz
      cd iw-3.14
      make
    • Vous pouvez maintenant tester si votre clé Wifi supporte le mode Access Point avec la commande iw list

      Si vous avez « AP » (Access Point) dans les modes supportés, c’est gagné !
  5. Pour configurer maintenant cette interface, il faut éditer le fichier /etc/network/interfaces et y ajouter la configuration suivante à la fin du fichier :
    auto wlan0
    allow-hotplug wlan0
    iface wlan0 inet static
        address 192.168.10.1
        netmask 255.255.255.0
        network 192.168.10.0
        post-up echo 1 > /proc/sys/net/ipv4/ip_forward
    

    Vous définissez le réseau 192.168.10.0 comme étant celui lié à l’interface Wifi. Votre clé sera le routeur du réseau. Et vous activez l’IP forwarding pour lier l’interface sans fil avec l’interface Ethernet.

  6. Enfin il faut activer l’IP Forwarding au niveau système. Je pense que cela fait double emploi avec le post-up de l’interface, mais il vaut mieux être sûre. Enlever le caractère # à la ligne 29 du fichier /etc/sysctl.conf :
    net.ip4.ip_forward=1

    Pour une prise en charge immédiate, exécutez la commande

    /etc/init.d/networking restart

Freeradius

  1. Préparation de l’installation des paquets. Le mot de passe Mysql est fixé à « raspbian ». Vous pouvez bien entendu mettre ce que vous voulez mais pensez à changer la valeur dans les différentes instructions sur la base de données.
    apt-get install -y debconf-utils
    debconf-set-selections <<< 'mysql-server mysql-server/root_password password raspbian'
    debconf-set-selections <<< 'mysql-server mysql-server/root_password_again password raspbian'
    apt-get install -y debhelper libssl-dev libcurl4-gnutls-dev mysql-server freeradius freeradius-mysql gcc make libnl1 libnl-dev pkg-config iptables
  2. Configuration de FreeRadius :
    1. Création de la base de données dans MySQL dédiée à FreeRadius. Vous devrez saisir le mot de passe demandé lors de l’installation de MySQL.
      echo "create database radius;" | mysql -u root -praspbian
    2. Installation du schéma de la base radius que nous venons de créer
      mysql -u root -praspbian radius < /etc/freeradius/sql/mysql/schema.sql
    3. Installation de la partie d’administration. Cela va créer un utilisateur d’administration et lui donner tous les droits nécessaires.
      mysql -u root -praspbian radius < /etc/freeradius/sql/mysql/admin.sql
    4. Installation de tables supplémentaires pour le NAS
      mysql -u root -praspbian radius < /etc/freeradius/sql/mysql/nas.sql
    5. Editez le fichier /etc/freeradius/radiusd.conf pour charger le module SQL. Il faut décommenter la ligne 700 :
      freeradius sql module
    6. Vous devez activer l’authentification par la base MySQL. Pour ça éditez le fichier /etc/freeradius/sites-enabled/default et cherchez les lignes où sql est commenté. Chez moi je l’ai trouvé trois fois aux lignes 177, 406 et 454. Vous enlevez la mise en commentaire en supprimant # du début de chaque ligne.
    7. Vous pouvez dès maintenant tester votre configuration en arrêtant FreeRadius et en le relançant en mode debug.
      service freeradius stop

      puis

      freeradius -X

      Si vous n’avez pas d’erreur c’est champagne !
      freeradius ready

    8. Nous allons faire un test de connexion. Pour cela, nous allons créer un utilisateur de test usertest avec son mot de passe passwd
      echo "insert into radcheck (username, attribute, op, value) values ('usertest', 'Cleartext-Password', ':=', 'passwd');" | mysql -u root -praspbian radius

      Et maintenant pour tester vous utilisez la commande

      radtest usertest passwd localhost 0 testing123

      La valeur testing123 vient du fichier de configuration /etc/freeradius/clients.conf. C’est le mot « secret » qui va être utilisé pour sécuriser la connexion entre FreeRadius et ce qui s’appelle le NAS, ce qui va capter les connexions.
      Vous devrez donc changer cette valeur lorsque vous allez installer votre hotspot en « production » !
      freeradius radtest

CoovaChilli

  1. Compilation et installation de CoovaChilli
    1. Téléchargez l’archive
      cd /usr/src
      wget https://coova.github.io/Download/coova-chilli-1.3.0.tar.gz
      tar zxvf coova-chilli-1.3.0.tar.gz
      cd coova-chilli-1.3.0
    2. Lancez la configuration pour la compilation
      export CFLAGS="-Wno-error"
      ./configure  --prefix=/usr --mandir=\$${prefix}/share/man \
      --infodir=\$${prefix}/share/info \
      --sysconfdir=/etc --localstatedir=/var --enable-largelimits \
      --enable-binstatusfile --enable-statusfile --enable-chilliproxy \
      --enable-chilliradsec --enable-chilliredir --with-openssl --with-curl \
      --with-poll --enable-dhcpopt --enable-sessgarden --enable-dnslog \
      --enable-ipwhitelist --enable-redirdnsreq --enable-miniconfig \
      --enable-libjson --enable-layer3 --enable-proxyvsa --enable-miniportal \
      --enable-chilliscript --enable-eapol --enable-uamdomainfile \
      --enable-modules --enable-multiroute
      
    3. Modifiez le niveau de compatibilité pour la compilation
      echo 9 > debian/compat
    4. Modifier le répertoire où va être créé le paquet en modifiant la ligne 54 du fichier /usr/src/coova-chilli-1.3.0/debian/rules :
      $(MAKE) DESTDIR=/ install
    5. Lancez la compilation
      dpkg-buildpackage -us -uc

      Vous devriez obtenir un paquet prêt à être installé (au bout de 15 minutes environ sur un modèle B 512Mb)!

    6. Installez le paquet
      cd ..
      dpkg -i coova-chilli_1.3.0_armhf.deb

      Utilisez l’option Y lorsqu’on va vous poser une question. L’erreur à la fin est normale car nous n’avons pas encore configuré CoovaChilli et n’existe pas (en principe)
      Capture d’écran 2015-07-15 à 21.00.48

  2. Compilation et installation de Haserl. Il s’agit d’un outil qui à partir de script UNIX ou LUA va générer des script CGI. Il est nécessaire pour le fonctionnement de CoovaChilli.
    1. Téléchargez Haserl
      cd /usr/src
      wget http://downloads.sourceforge.net/project/haserl/haserl-devel/haserl-0.9.35.tar.gz
      tar zxvf haserl-0.9.35.tar.gz
      cd haserl-0.9.35
    2. Compilez puis installer Haserl
      ./configure && make && make install
  3. Configurer CoovaChilli
    1. A la fin du fichier /etc/chilli/up.sh vous ajoutez la ligne
      iptables -I POSTROUTING -t nat -o $HS_WANIF -j MASQUERADE

      Elle va permettre de transférer ce qui arrive par le Wifi vers l’Ethernet

    2. Dans le fichier /etc/default/chilli vous remplacez
      START_CHILLI=0

      par

      START_CHILLI=1

      Cela autorise le démarrage de CoovaChilli

    3. Dans le fichier /etc/chilli/wwwsh il faut donner l’emplacement exact de haserl à la ligne 9
      haserl=/usr/local/bin/haserl
    4. Dans le fichier /etc/chilli/config se trouve la configuration principale de Chilli. Là où vous allez pouvoir définir quelles interfaces sont utilisées, quel réseau, etc. Certaines des valeurs ci-dessous sont commentées par défaut, il faudra donc enlever le # en début de ligne si nécessaire. Et toutes ces valeurs ne sont pas regroupées au même endroit.
      HS_WANIF=eth0
      HS_LANIF=wlan0
      HS_NETWORK=192.168.10.0
      HS_UAMLISTEN=192.168.10.1
      HS_UAMALLOW=192.168.10.0/24
      HS_SSID=PiHomeServerAP

      Le détail des paramètres configurés :
      HS_WANIF est l’interface reliée à Internet
      HS_LANIF est l’interface du Wifi/Hotspot
      HS_NETWORK le réseau du hotspot
      HS_UAMLISTEN la gateway du réseau du hotspot
      HS_UAMALLOW les IP du réseau du hotspot autorisées à se connecter
      HS_SSID le SSID (ne semble pas avoir d’effet)

    5. Rendre le démarrage définitif
      update-rc.d chilli start 99 2 3 4 5 . stop 20 0 1 6 .
  4. Démarrez le service
    service chilli start

    Avec la commande ifconfig vous devriez voir apparaitre une interface tun0 qui confirme que CoovaChilli est bien exécuté.
    Capture d’écran 2015-07-15 à 21.29.18

Hostapd

  1. Pour rendre votre point d’accès Wifi visible, nous allons installer hostapd qui va faire tout le travail
    apt-get install -y hostapd
  2. Editer le fichier /etc/default/hostapd et ajouter à la fin :
    DAEMON_CONF="/etc/hostapd/hostapd.conf"
  3. Editer le fichier /etc/hostapd/hostapd.conf (qui n’existe pas encore) et y copier les lignes suivantes :
    # interface wlan du Wi-Fi
    interface=wlan0
    # nl80211 avec tous les drivers Linux mac80211
    driver=nl80211
    # Nom du spot Wi-Fi
    ssid=PiHomeServerAP
    # mode Wi-Fi (a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g)
    hw_mode=g
    # canal de fréquence Wi-Fi (1-14)
    channel=6
    # Wi-Fi ouvert, pas d'authentification !
    auth_algs=1
    # Beacon interval in kus (1.024 ms)
    beacon_int=100
    # DTIM (delivery trafic information message)
    dtim_period=2
    # Maximum number of stations allowed in station table
    max_num_sta=255
    # RTS/CTS threshold; 2347 = disabled (default)
    rts_threshold=2347
    # Fragmentation threshold; 2346 = disabled (default)
    fragm_threshold=2346
  4. Vous pouvez démarrer manuellement le service
    service hostapd start

Nous voilà arriver à la fin de la configuration ! Ouf ! Il est temps de tester la connexion (avec le user créé plus haut : usertest / passwd) :

  1. Se connecter au point d’accès
    raspberry pi hotspot SSID selection
  2. Vous allez automatiquement avoir une fenêtre de redirection (sur mon Mac. Sur iPhone/iPad/Windows il faut essayer d’accéder à Internet via le navigateur)
    raspberry pi hotspot redirection
  3. Saisissez vos identifiants (usertest / passwd)
    raspberry pi hotspot login
  4. Vous aurez ensuite des écrans confirmant la connexion
    raspberry pi hotspot success raspberry pi hotspot success end
  5. A vous les joies d’Internet par votre Hotspot !
    raspberry pi hotspot wifi coovachilli freeradius internet

Bonus : daloRADIUS

Ok mais certains d’entre vous vont me poser la question : « oui mais comment je gère les utilisateurs ? », « Je dois faire une requête SQL à chaque fois ? ». En théorie oui ! Il n’y a pas d’interface par défaut pour FreeRadius. Sauf que … il existe des projets pour vous aider. Et daloRadius en fait partie ! Grâce à une interface web vous allez pouvoir gérer les utilisateurs, gérer leurs droits, heures de connexion, débits autorisés, etc.

  1. Installer un serveur web. Mon préféré reste Nginx.
    apt-get install -y php5-mysql php-pear php5-gd php-db php5-fpm libgd2-xpm-dev libpcrecpp0 libxpm4 nginx php5-xcache
    apt-get remove -y apache2.2-bin apache2-utils apache2.2-common
  2. Télécharger daloRadius
    cd /usr/src
    wget http://downloads.sourceforge.net/project/daloradius/daloradius/daloradius0.9-9/daloradius-0.9-9.tar.gz
    tar zxvf daloradius-0.9-9.tar.gz -C /usr/share/nginx/www/
    mv /usr/share/nginx/www/daloradius-0.9-9 /usr/share/nginx/www/daloradius
    cd /usr/share/nginx/www/daloradius
  3. Ajouter les informations utilisées par daloRadius dans la base de données de FreeRadius
    mysql -u root -praspbian radius < /usr/share/nginx/www/daloradius/contrib/db/fr2-mysql-daloradius-and-freeradius.sql
    mysql -u root -praspbian
    GRANT ALL ON radius.* to 'radius'@'localhost';
    GRANT ALL ON radius.* to 'radius'@'127.0.01';
    exit;
  4. Dans le fichier /usr/share/nginx/www/daloradius/library/daloradius.conf.php vous définissez les droits d’accès à la base de données (ici les valeurs par défaut)
    $configValues['CONFIG_DB_USER'] = 'radius';
    $configValues['CONFIG_DB_PASS'] = 'radpass';
    $configValues['CONFIG_DB_NAME'] = 'radius';
  5. Mettre à jour la configuration du site par défaut en activant le support PHP. Les informations sont à ajouter (ou enlever les commentaires) dans la section server.
    A la ligne 25 (toujours par défaut)
index index.php index.html index.htm;

Et activer le support PHP

location ~ .php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
  • Redémarrez Nginx
    service nginx restart
  • Vous pouvez maintenant vous connecter sur http://<ip de votre raspberry>/daloradius
    Login : administrator / Password : radius

Alors maintenant comment créer un utilisateur ? Rien de plus simple :

  1. Connectez-vous puis allez dans l’onglet Management
    raspberry pi daloradius management hotspot
  2. Saisissez le Username puis Password et cliquez sur Apply. Vous pouvez bien sur choisir le type d’encodage du mot de passe, saisir des informations sur l’utilisateur et … des attributs. Nous y reviendrons plus tard (oui ça n’est pas encore terminé !)
    raspberry pi daloradius management hotspot create user

Vous pouvez dès maintenant utiliser cet identifiant. Il apparait dans la liste des utilisateurs avec un beau drapeau vert pour signaler que l’utilisateur est activé.raspberry pi daloradius management hotspot list users

Double bonus : les attributs

Nous avons un hotspot Wifi, un service d’authentification, une interface de gestion des utilisateurs. Mais comment faire pour définir des heures de connexions ? Une durée de connexion ? Un volume de données maximum ? Bref que ce ne soit pas open bar all inclusive !

Tout se passe au niveau des attributs associés à un utilisateur. Dans l’interface de daloRadius, vous pouvez éditer un utilisateur et lui ajouter des attributs.

hotspot raspberry pi coovachilli daloradius attributes

Ci dessus, j’ajoute à l’utilisateur pi, l’attribut Login-Time avec la valeur Wk1800-2100. L’utilisateur ne pourra se connecter que de 18:00 à 21:00 du lundi au vendredi. Vous pouvez aller plus loin : « Wk0855-2355,Sa,Su1655-2305 », les jours de la semaine de 08:55 à 23:55, le samedi et le dimanche de 16:55 à 23:05.

Vous pouvez retrouver plus en détail certains attributs ici. Les plus courants : Login-Time, Simultaneous-Use, Expiration. Malheureusement je n’ai pas trouvé un endroit où l’ensemble des attributs sont détaillés avec leur signification et les valeurs possibles. Si vous avez un lien n’hésitez pas à le partager dans les commentaires.

Si vous êtes arrivés au bout de cet article vous méritez une médaille ! Mais vous avez maintenant un super hotspot raspberry inside !

Prochaine étape : intégrer Squid comme proxy transparent ?

Sources :

  • https://www.raspberrypi.org/forums/viewtopic.php?t=24105&p=224789
  • http://doc.ubuntu-fr.org/coovachilli
  • http://ehc.ac/p/radiusdesk/wiki/install_ubuntu_nginx/?version=14#install-radiusdesk
  • http://www.binaryheartbeat.net/2013/12/raspberry-pi-based-freeradius-server.html
  • google, bing, duckduck, etc.

Vous aimerez aussi...