Publié le 5 mars 2021 - par

Un portail captif avec un Raspberry Pi

Il arrive parfois qu’on ait besoin de mettre en place un accès Internet via un Access Point WiFi, en obligeant l’utilisateur à s’authentifier pour se connecter (hôtels, campings…). C’est un portail captif qui remplit cette fonction. Nodogsplash est un portail captif léger, adapté au Raspberry PI. Pour découvrir comment ça fonctionne, je vous propose d’installer un portail captif basique, suffisant pour découvrir le fonctionnement.

Cliquez pour en savoir plus sur les niveaux

Cette installation met en œuvre de nombreuses connaissances en réseau et en système Linux. Même si un débutant soigneux peut reproduire ce tutoriel, je le classe en Avancé car en cas d’erreur il faudra « mettre les mains dans le cambouis ».

Un portail captif nodogsplash sur Raspberry Pi

Man in the Middle : Méfies-toi du WiFi

Pourquoi je vous parle de l’attaque Man in the Middle (MITM = l’homme au milieu) ? Parce que mine de rien, un portail captif ça a des relents de MITM… Je vous explique :

Prenez un gars qui veut se connecter au SERVEUR de sa banque. Appelons le CLIENT. En temps normal il se connecte en WiFi et tout se passe bien. Mais voilà qu’un intrus s’est glissé dans le circuit. C’est « L’homme du milieu » ou MITM. Par un moyen quelconque il empêche que le CLIENT ne se connecte à sa borne WiFi et prend la place de cette borne WiFi.

Du coup le CLIENT se connecte à l’ordinateur de MITM, qui relaie ensuite la demande au SERVEUR de la banque. Le client reçoit bien la page web de sa banque (qui transite simplement par MITM), tape ses identifiants, regarde son compte etc. Pour le CLIENT et pour la banque, tout semble normal. Semble… car MITM intercepte et enregistre tout ce qui passe et il récupère les accès bancaires de CLIENT. D’où la mise en place des nouvelles règles de double authentification, avec envoi d’un code par SMS par exemple. Quand MITM voudra se connecter plus tard au SERVEUR il ne recevra pas le code par SMS et sera donc bloqué.

Après, ce n’est pas forcément une banque, mais ça peut être un magasin en ligne sur lequel vous aurez enregistré votre carte bancaire… MITM peut changer l’adresse de livraison, commander ce qu’il veut et… payer avec vos deniers !

Dans la réalité on est plus proche de la configuration ci-dessus. MITM empêche la connexion de la victime à l’ACCESS POINT WiFi pour qu’il se connecte à son propre AP. Méfiez vous donc de ces AP WiFi gratuits qui fleurissent (gares, bibliothèques, espaces publics…). A moins de passer par un VPN (qui n’offre malgré tout qu’une sécurité relative). Si le sujet vous intéresse, cliquez sur les liens de ce paragraphe et/ou regardez les articles référencés en bas de l’article, dans les sources.

C’est quoi, un portail captif ?

Cette technique est généralement mise en œuvre pour les accès Wi-Fi. Elle peut aussi être utilisée pour l’accès à des réseaux filaires. c’est le système que vous trouvez dans les hôtels, les camping… Lorsque vous souhaitez consulter une page web comme framboise314 (bin oui !) vous aboutissez en fait sur une page web souvent au couleurs de l’hôtel, qui vous demande de vous authentifier pour vous connecter.

Le portail captif force donc les clients HTTP d’un réseau à afficher une page web spéciale (le plus souvent dans un but d’authentification) avant de pouvoir accéder à Internet normalement. Après authentification, les portails captifs permettent d’offrir différentes classes de services et tarifications associées pour l’accès Internet. Par exemple, WiFi gratuit, payant, une heure gratuite…

Portail captif - d'après la notice HotSpot Manager - ADIPSYS

Exemples de portails captifs

C’est là qu’on se rend compte que le portail captif se comporte comme un MITM, puisqu’il intercepte la demande du CLIENT et lui impose une page web que le CLIENT n’a pas choisie. L’exemple typique quand vous arrivez dans un hôtel, vous essayez de vous connecter à site que vous aimez bien. Au hasard on va prendre www.framboise314.fr. Vous cliquez sur l’icône du site et… vous recevez un page web avec le nom de l’hôtel et une zone à remplir avec le nom de la personne qui a réservé la chambre, une adresse mail, parfois le N° de la chambre etc.

Pour ma part j’ai souvent une demande d’adresse mail (comme ça par la suite ils vous enverront gentiment des pubs ou revendront votre adresse…) et je mets comme adresse : moi@ici.com. Dans 90% des cas ça marche 😉 Dans les autres cas ils vous envoient un code par e-mail ou SMS et dans ce cas là ils récupèrent vos coordonnées vérifiées et pour eux ça veut dire :

Une fois que vous avez validé, accepté les Conditions d’utilisation (que vous n’avez pas lues), la page framboise314 s’affiche enfin.

Et vous pouvez commencer à utiliser l’Internet sur votre appareil… Pensez quand même à tout ça. Sans être paranoïaque dites vous que vos données peuvent être interceptées et que conformément à la réglementation, l’opérateur de ce genre de WiFi est censé conserver les données de consultation des clients pendant 1 an.

Interception de paquets

Vous l’aurez compris, le rôle du portail captif ça va être d’intercepter tous les paquets liés aux protocoles HTTP ou HTTPS quelles que soient leurs destinations jusqu’à ce que l’utilisateur ouvre son navigateur web. En utilisant un DNS menteur, l’utilisateur est redirigé vers une page web permettant de s’authentifier, d’effectuer un éventuel paiement, de remplir des informations, et de recueillir le consentement de l’utilisateur concernant les conditions d’utilisation ou la collecte de données personnelles.

C’est là que cette technique s’apparente à une attaque MITM, puisqu’un équipement intermédiaire usurpe l’identité du site visité pour le transformer en redirection vers le portail captif. Il arrive également que le portail captif utilise de faux certificats de sécurité pour rediriger également le protocole HTTPS, ce qui provoque une erreur de sécurité avec une page HTTPS simple et l’impossibilité d’être redirigé avec le protocole strict HSTS.

Le portail captif que nous allons installer sur le Raspberry Pi est nodogsplash.

Nodogsplash est un portail captif qui offre un moyen simple de fournir un accès restreint à l’Internet en affichant une page d’accueil à l’utilisateur avant que l’accès à l’internet ne lui soit accordé. Il est dérivé à l’origine de la base de code du projet Wifi Guard Dog. Nodogsplash (NDS) est publié sous licence GNU.

NDS est un portail captif à haute performance et à faible occupation des ressources (CPU, mémoire). Il offre connexion Internet restreinte via une simple page d’accueil. Il est optimisé pour des appareils ayant des ressources limitées et convient donc bien pour le Raspberry Pi. Si vous souhaitez un système d’authentification plus sophistiqué offrant une interface web dynamique, choisissez openNDS plutôt que de NoDogSplash.

Tous les appareils mobiles modernes, la plupart des systèmes d’exploitation récents et la plupart des navigateurs sont désormais dotés d’un système de détection de portail captif (CPD) qui émet automatiquement une demande sur le port 80 lors de la connexion à un réseau. NDS détecte cette requête et envoie en retour sa page web « splash« .

La page d’accueil, dans sa forme la plus simple, contient un bouton « Continue« . Lorsque l’utilisateur clique sur ce bouton, l’accès à l’internet lui est accordé, après un intervalle de temps prédéfini. NDS ne supporte pas actuellement le contrôle du trafic mais est entièrement compatible avec d’autres systèmes autonomes tels que le Smart Queue Management (SQM).

La documentation complète est disponible ici : https://nodogsplashdocs.readthedocs.io/en/stable/

Installer nodogsplash

Dans ce tutoriel je vous invite à découvrir comment configurer un portail captif sur un Raspberry Pi en utilisant le logiciel nodogsplash. Le tutoriel est inspiré de tutoriels parus sur PiMyLifeUp. (voir sources)

Portail captif Raspberry Pi

Ce portail captif affiche un écran d’accueil qui sera présenté à toute personne qui se connectera à votre point d’accès (AP) WiFi. Avant que la personne ne commence à utiliser la connexion Wifi, elle devra obligatoirement accomplir une action, sinon elle restera sur la page d’accueil.

Vous pourrez faire afficher ce que vous voulez sur la page d’accueil du portail captif. Ceci peut vous permettre d’informer l’utilisateur des règles de base pour l’utilisation de votre AP avant qu’il n’ait accès à l’Internet.

Ce tutoriel se compose de deux parties :

Ce qu’il vous faut

  • Raspberry Pi 2, 3 ou 4. (J’ai utilisé le Pi400 pour ce tuto)
  • Clé Wifi USB (jusqu’au Raspberry Pi 3)
  • Carte Micro SD
  • Alimentation 5v / 3A
  • Connexion au réseau Ethernet

Installation du point d’accès WiFi (AP)

Pour cette installation on n’a pas besoin d’interface graphique. J’ai choisi Raspberry Pi OS Lite (32 bits) que j’ai installé avec Raspberry Pi Imager.

On va commencer par mettre en place un Point d’accès WiFi qui va permettre à des appareils mobiles de se connecter en WiFI au Raspberry Pi et d’accéder à Internet vis le réseau filaire connecté sur la prise Ethernet du Raspberry Pi.

Pour mettre en place le point d’accès sans fil Raspberry Pi, nous utiliserons deux paquets. Ces deux logiciels sont hostapd et dnsmasq.

  • hostapd est le logiciel qui nous permet d’utiliser le WiFi du Raspberry Pi.
  • dnsmasq estt à la fois serveur DHCP et DNS. Il permet d’attribuer des adresses IP et de traiter des requêtes DNS avec le Raspberry Pi.

dnsmasq est assez facile à mettre en place et à configurer. Il a l’avantage d’être plus léger que les paquets isc-dhcp-server et bind9.

Pour faire fonctionner l’ensemble il vous faudra également une connexion réseau ethernet qui sera accessible depuis le WiFi. La connexion Internet est indispensable pour l’installation des paquets.

Comme d’habitude commencez l’installation par une mise à jour de votre Raspberry Pi OS.

Installez les paquets hostapd et dnsmasq.

Après l’installation, il faut configurer ces paquets. Pour cela on va commencer par arrêter leur exécution

On peut maintenant modifier la configuration de dhcpd afin de prendre le contrôle de l’interface wlan0 (le WiFi). C’est ici que nous allons fixer une adresse IP statique pour l’AP et que nous lui dirons de ne pas utiliser le fichier wpa_supplicant pour que le Raspberry Pi soit uniquement un point d’accès et pas un client WiFi.

Exécutez la commande suivante pour modifier le fichier dhcpcd.conf

Le fichier s’ouvre dans nano. Descendez tout en bas du fichier et ajoutez les lignes suivantes pour configurera l’interface wlan0 comme souhaité. J’ai choisi une plage d’adresse réseau en 192.168.220.0

Enregistrez le fichier et quittez nano en appuyant sur Ctrl +X puis sur O et enfin sur [Entrée].

On va maintenant redémarrer le service dhcpd afin qu’il prenne en charge les modifications de configuration. Pour cela exécutez la commande suivante

Nous allons configurer hostapd, pour ce faire ouvrez le fichier de configuration avec la commande

nano ouvre un fichier vide. Ajoutez les lignes suivantes. Elles définissent essentiellement la manière d’interagir avec l’interface WiFi  wlan. Les seules lignes dont il faut se préoccuper sont la ligne ssid= et la ligne wpa_passphrase=. Essayez de choisir un mot de de passe WPA qui fasse plus de 6 caractères pour sécuriser (un tant soit peu) votre connexion.

Bien entendu vous mettrez vos propres identifiants dans le fichier 🙂  Assurez-vous que vous choisissez quelque chose de sûr afin que des personnes « curieuses » ne puissent pas se connecter à votre point d’accès WiFi.

Vous pouvez maintenant enregistrer et quitter le fichier en appuyant sur Ctrl +X puis sur O et enfin sur [Entrée].

On va pouvoir passer à la configuration de hostapd, pour cela il faut modifier deux fichiers, ceux que hostapd va lire pour trouver notre nouveau fichier de configuration.

Ouvrez le premier de ces deux fichiers avec la commande suivante

Dans ce dossier, trouvez la ligne suivante. (CTRL+W dans nano lance la recherche)

Remplacez-la par :

Puis enregistrez le fichier et quittez nano.

Ouvrez le deuxième fichier de configuration. Ce fichier se trouve dans le dossier init.d.

Trouvez la ligne suivante

Remplacez-la (si besoin) par :

Enregistrez le fichier et quittez nano.

hostapd étant configuré, passons à la configuration de dnsmasq. Avant de commencer à modifier le fichier de configuration, renommez le fichier existant car la configuration actuelle qu’il contient est inutile dans notre cas.

On peut alors créer notre propre fichier de configuration :

Ajoutez les lignes suivantes pour indiquer au service dnsmasq comment traiter toutes les connexions qu’il gère et sur quelle interface il doit les traiter.

Enregistrez le fichier et quittez nano.

Ensuite, il faut configurer le Raspberry Pi de manière à ce qu’il transfère tout le trafic de l’interface wlan0 vers la connexion ethernet.

Tout d’abord, on va activer le routage IP dans le fichier de configuration sysctl.conf

Dans ce fichier, trouvez la ligne suivante et supprimez le # du début (décommenter)

Supprimez le # du début de la ligne :

Comme nous sommes impatients et que nous ne voulons pas attendre que le routage s’active au prochain démarrage, nous allons l’activer immédiatement.

Maintenant que l’IPv4 Forwarding est activé, nous pouvons configurer un NAT entre notre interface wlan0 et notre interface eth0. En gros, cela permettra de rediriger tout le trafic de notre point d’accès vers notre connexion ethernet, en effectuant une translation d’adresse entre les deux interfaces.

Exécutez la commande suivante pour ajouter les nouvelles règles à iptables.

iptable est remis à zéro lors de chaque boot du Raspberry Pi. Il faut donc enregistrer nos nouvelles règles dans un fichier afin de les réinitialiser lors de chaque boot.

Pour sauvegarder les nouvelles règles, exécutez la commande suivante.

On va recharger ce fichier à chaque redémarrage. La façon la plus simple de procéder est de modifier le fichier rc.local.

Exécutez la commande suivante pour commencer à modifier le fichier.

Amenez le curseur au dessus de exit 0

Ajouter au-dessus de « exit 0 » :

Enregistrez le fichier et quittez nano.

C’est presque fini pour l’Access Point WiFi, il reste à lancer les deux services et à les activer dans systemctl. Exécutez les commandes suivantes.

Vous disposez maintenant d’un point d’accès sans fil Raspberry Pi pleinement opérationnel. Vous allez vous assurer de son bon fonctionnement en utilisant l’un de vos appareils (téléphone, tablette, PC portable) et en vous connectant à ce nouveau point d’accès grâce au SSID et à la phrase de passe WPA définis un peu plus haut (AP-framboise314 et raspberrypi).

Ouvrez vos paramètres WiFi et connectez vous à l’Access Point que vous avez défini (ici AP-framboise314).

 

Vous devez pouvoir naviguer sur votre site web préféré 😉  .

Pour vous assurer que tout fonctionne bien, redémarrez le Raspberry Pi. Cela permet de vérifier que tout est bien mis en place lors du démarrage de Raspberry Pi OS.

Refaites le test ci-dessus : Connexion à l’AP et navigation web.

[stextbox id=’alert’ caption=’Tester… Tester… Tester’]Si un de ces deux tests ne fonctionne pas, ne continuez pas ! Il faut impérativement que cette partie fonctionne pour mettre en place le portail captif.[/stextbox]

Installation du portail captif

Ce deuxième tutoriel repose sur le point d’accès WiFi installé précédemment. Ne démarrez pas cette installation sans être sûr(e) que la première partie est bien fonctionnelle.

L’installation de nodogsplash nécessite quelques dépendances qu’il faut installer.

Répondez O pour autoriser l’installation.

On peut à présent récupérer nodogsplash depuis le dossier github

puis compiler nodogsplash (cela ne prend que quelques instants).

nodogsplash est installé sur Raspberry Pi OS, il reste à le configurer.

On va lui indiquer l’interface à utiliser, et sur quelle adresse il doit écouter. Si vous avez choisi des valeurs différentes, il faudra adapter les valeurs ci-dessous. Remplacez la ligne

GatewayInterface br-lan

par les lignes suivantes :

Enregistrez le fichier et quittez nano.

On peut ensuite démarrer nodogsplash

Sur un appareil mobile, accédez à l’Access Point

Ici depuis une tablette, je me suis connecté à l’AP-framboise314. Le navigateur (comme la plupart des navigateurs modernes) a détecté l’existence d’un portail captif (CPD = Captive Portal Detection) et a généré une requête HTTP initiale sur le port 80.  Une bandeau s’est affiché en haut de l’image (entouré en rouge). En appuyant dessus, on accède à la page d’accueil du portail captif.

Si vous vous êtes déjà connecté(e) au WiFi d’un hôtel, c’est généralement aussi ce qui se passe. Si ça ne fonctionne pas, faites manuellement une requête vers un site HTTP, même inexistant (http://toto.com). Ça devrait déclencher l’envoi de la page d’accueil (splash screen) par nodogsplash.

En cliquant sur le bouton Continue, vous pourrez accéder à Internet Internet. Si vous ne cliquez pas, le portail captif continue indéfiniment à afficher cette page d’accueil sur votre appareil.

On sait maintenant que le portail captif fonctionne et que la page d’accueil est affichée. Mais nous avons lancé nodogsplash manuellement. Si vous avez observé l’écran vous avez certainement vu qu’il affiche des informations intéressantes…

Pour rendre son lancement automatique au démarrage du système Raspberry Pi OS, il reste encore une étape.

On peut automatiser le lancement de nodogsplash dans  rc.local.

C’est déjà dans ce fichier que nous avions ajouté le rechargement des iptables au lancement de hostapd. Placez cette fois encore le curseur au-dessus de la ligne exit 0 et ajoutez

Vous devriez lire ceci à la fin de votre fichier :

Enregistrez le fichier et quittez nano.

Redémarrez le Raspberry Pi. Après le lancement, et si tout s’est bien passé, vous disposez d’un portail captif opérationnel.

Modifier l’aspect de la page d’accueil

Si vous souhaitez modifier l’aspect du portail captif par défaut, vous pouvez le faire en modifiant le fichier de la page d’accueil : /etc/nodogsplash/htdocs/splash.html

Je vous propose de remplacer l’image représentant le « splash » par un logo de framboise314. Oui, je sais… mais après vous le remplacerez bien par ce que vous voulez ! Rendez vous dans le dossier des images :

Récupérez le logo de framboise314

On va modifier la page d’accueil pour franciser les textes et afficher ce logo

Modifiez le fichier pour avoir ceci dans la partie HTML (entre les balises body)

$gatewayname Page d’accueil.

Page d'accueil : Cliquez sur Continue pour accéder à Internet.


Bienvenue !


Pour accéder à Internet, cliquez sur le bouton « Continue ».


 




 


Copyright © The Nodogsplash Contributors 2004-2019.
This software is released under the GNU GPL license.

 

 

Vous devez maintenant obtenir cette page lorsque vous vous connectez :

Vous pouvez également personnaliser davantage Nodogsplash, vous trouverez de la documentation à ce sujet en vous rendant sur le site web de documentation de Nodogsplash.

Conclusion

Vous disposez maintenant d’un portail captif fonctionnant sur un Raspberry Pi. bien que l’authentification soit réduite au minimum, vous avez une base de départ si vous souhaitez aller plus loin pour gérer le trafic de votre Access Point WiFi.

On peut imageiner d’aller plus loin en demandant au client de s’authentifier avec un mot de passe, voir confier l’authentification à un serveur Radius spécialisé.

Si vous avez des remarques ou souhaitez suggérer des améliorations, n’hésitez pas en faire part dans les commentaires ci-dessous.

 

Sources

Comment éviter une attaque du type « Man-in-the-Middle » ?

How-to: CREATE A FAKE AP (ROGUE AP)

 

 

 

 

 

 

À propos François MOCQ

Électronicien d'origine, devenu informaticien, et passionné de nouvelles technologies, formateur en maintenance informatique puis en Réseau et Télécommunications. Dès son arrivée sur le marché, le potentiel offert par Raspberry Pi m’a enthousiasmé j'ai rapidement créé un blog dédié à ce nano-ordinateur (www.framboise314.fr) pour partager cette passion. Auteur de plusieurs livres sur le Raspberry Pi publiés aux Editions ENI.

6 réflexions au sujet de « Un portail captif avec un Raspberry Pi »

  1. Jean Parent

    Après plusieurs essais, ça ne marche pas.
    pi@raspberrypi:~ $ iptables-restore < /etc/iptables.ipv4.nat
    iptables-restore v1.8.2 (nf_tables): Chain 'MASQUERADE' does not exist
    Error occurred at line: 7
    Try `iptables-restore -h' or 'iptables-restore –help' for more information.
    pi@raspberrypi:~ $ sudo systemctl start hostapd
    Job for hostapd.service failed because the control process exited with error code.
    See "systemctl status hostapd.service" and "journalctl -xe" for details.

    Répondre
    1. François MOCQ Auteur de l’article

      Bonjour Jean
      comme indiqué en début d’article il va falloir « mettre les mains dans le cambouis »
      est ce que la commande
      sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      passe sans erreur ?
      si oui c’est que MASQUERADE est bien reconnu
      regardez ensuite le contenu du fichier /etc/iptables.ipv4.nat
      et vérifiez qu’il est conforme à ce que vous envoyez dedans…
      J’ai utilisé plusieurs fois ces commandes pour réaliser et tester le tuto sans souci…
      il faut reprendre pas à pas en vérifiant ce qui se passe…
      cdt
      françois

      Répondre
  2. HoM3r17

    L’idée est bonne, mais en pratique il est très difficile de mettre un pratique un portail captif conforme aux besoins de l’ARCEP pour un hôtel / chambre d’hôtes soi même.
     
    J’y ai passé des heures, essayé différents systèmes du simple RaspAP + Nodogsplash jusqu’a Alcasar qui est une solution bien plus complète (et compliquée), mais j’ai du me faire une raison, pour être vraiment protégé il faut passer par un prestataire…
     

     

     

     

    Répondre
  3. polo

    Bonjour, j’ai testé ce tutoriel sur un Raspberry Pi 5, des fois au redémarrage le SSID apparait sur mon téléphone, des fois non, d’où peut provenir le problème au démarrage de RPiOS lite ? merci

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Complétez ce captcha SVP *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.