Transformer le Raspberry Pi en hot spot Wifi avec portail captif (2/2)

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

Dans un article précédent, nous avions installé notre propre point d’accès Wifi. Maintenant il s’agit de lui ajouter un portail captif pour contrôler qui va l’utiliser. Hotspot_WiFiPour un portail captif vous avez plusieurs possibilités :

  1. La méthode simple est le passage par une page PHP. Vous pourrez afficher un message dans une page HTML, attendre une validation puis autoriser l’accès à Internet.
  2. La méthode plus complexe où vous passez par un outil spécialisé comme par exemple YFi Hotspot Manager.

Chaque méthode a bien sur ses avantages et inconvénients mais dans un premier temps j’ai choisi la simplicité et uniquement contrôler l’accès Internet de manière basique. Ca sera donc par le biais d’une page PHP.

Un portail captif en PHP

  1. Installer Nginx avec le support PHP. Le plus simple c’est de suivre les instructions de cet article. Voici la configuration de mon serveur :
    server {
    	root /var/www;
    	index index.php;
    
    	server_name localhost;
    
    	location / {
    		try_files $uri $uri/ /index.php;
    	}
    
    	location ~ \.php$ {
    		fastcgi_split_path_info ^(.+\.php)(/.+)$;
    		fastcgi_pass unix:/var/run/php5-fpm.sock;
    		fastcgi_index index.php;
    		include fastcgi_params;
    	}
    }
  2. Installer les paquets supplémentaires :
    apt-get install conntrack
  3. Autoriser l’utilisateur www-data à exécuter les commandes nécessaires à gérer les accès :
    Lancer visudo puis ajouter les lignes suivantes à la fin du fichier :
  4. www-data ALL=NOPASSWD: /usr/sbin/arp
    www-data ALL=NOPASSWD: /sbin/iptables
    www-data ALL=NOPASSWD: /usr/bin/rmtrack [0-9]*.[0-9]*.[0-9]*.[0-9]*
    
  5. Créer la page d’accueil index.php
    <!--?php 
    $ip = $_SERVER['REMOTE_ADDR'];
    $mac = shell_exec("sudo /usr/sbin/arp -an " . $ip);
    preg_match('/..:..:..:..:..:../',$mac , $matches);
    $mac = @$matches[0];
    if( $mac === NULL) { echo "Access Denied."; exit; }
    ?-->
    
    <form action="process.php" method="post">
    <input name="mac" type="input" value="<?php echo $mac; ?>" /> 
    <input name="ip" type="input" value="<?php echo $ip; ?>" />
    <input style="padding: 10px 20px;" type="submit" value="OK" />
    </form>
    
    
  6. Créer la page qui va générer les règles pour autoriser l’accès à Internet process.php. Lorsque l’utilisateur aura validé le formulaire de la page précédente, c’est elle qui va être appelée pour donner l’accès complet.
    
    
  7. Créer l’ensemble des règles de routage
    iptables -t mangle -N internet
    iptables -t mangle -A PREROUTING -i wlan0 -p tcp -m tcp --dport 80 -j internet
    iptables -t mangle -A internet -j MARK --set-mark 99
    iptables -t nat -A PREROUTING -i wlan0 -p tcp -m mark --mark 99 -m tcp --dport 80 -j DNAT --to-destination 192.168.10.1
  8. Sauvegarder les règles pour les prochains redémarrages
    service iptables-persistent

 

Vous y voilà ! Un point d’accès avec un portail captif. A vous de modifier les pages PHP pour changer le look et les fonctionnalités. Une base de données pourrait par exemple mémoriser les adresses MAC pour ne pas redemander la connexion, gérer un temps de connexion, un volume, etc.

Sources :

Vous aimerez aussi...

  • EL OUALI ACHRAF

    Très bon tuto ,
    Une remarque enlevez les commentaires du code php dans les deux fichiers index.php et process.php.

  • luckidu33

    ATTENTION !!! Ce tuto permet à un attaquant de prendre le contrôle du serveur en injectant (avec des droits très élevés!!!!!!) des commandes système dans la variable $ip et $mac!!! Un contrôle doit être fait au moment $ip = $_POST['ip'];
    $mac = $_POST['mac'];

  • Hi, code on point 5 is empty 🙁

    • Hi
      Updated. You have to copy/paste in a page called process.php

      • perfet, thank you

      • Prasan Dutt

        Code is still missing… what should be the process?

        • Look at http://www.andybev.com/index.php/Using_iptables_and_PHP_to_create_a_captive_portal
          I lost code and have no time to rebuild it. Else you the automatic script with coovachilli

          • Prasan Dutt

            You won’t believe but I was using the same link to modify my index.php and was trying to understand. 🙂 However, thanks for recommending coovachilli, it seems simpler, will give it a try…

          • Prasan Dutt

            Today I guessed one strange thing, the DHCP server is internal wifi on RPi3, not external USB wifi dongle. WiFi is generated even without the dongle.
            I guessed it yesterday only as the range of wifi was just 10-15 feet. How to route the internet to external USB wifi dongle? WLAN1 is the configuration which I think will be helpful in setting up.

          • Identify your dongle and confirm that it’s wlan1 and replace wlan0 by wlan1 in all steps. Never tested but should work

  • lesjno

    Bonjour,
    Ca a l’air d’être un bon tuto; malheureusement j’ai un souci.
    Juste avant de faire l’étape 6 (règles de routage), le système se comporte bien comme un point d’accès simple : on se connecte bien en wifi et on accède bien à internet, que ce soit en http ou en https.
    Mais après l’étape 6 on obtient un « 404 Not Found » lorsqu’on tape une adresse http alors que je m’attendais à afficher la page index.php du point d’accès (la page /var/www/index.php qui s’affiche bien lorsque que je tape directement l’adresse 192.168.10.1 dans le navigateur).
    Que manque-t-il à ma configuration pour arriver à aller automatiquement sur le portail captif ?

    Merci d’avance !

    • lesjno

      Petite info supplémentaire : voici ce que j’ai dans les log si je veux accéder par exemple à la page http://lesjno.free.fr/Solar/index.html

      dans /var/log/nginx/access.log ==>
      192.168.10.4 – – [29/Dec/2014:17:10:44 -0100] « GET /Solar/index.html HTTP/1.1 » 404 142 « - » « Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0 »

      dans le fichier error.log ==>
      2014/12/29 17:10:44 [error] 6830#0: *14 open() « /var/www/Solar/index.html » failed (2: No such file or directory), client: 192.168.10.4, server: , request: « GET /Solar/index.html HTTP/1.1 », host: « lesjno.free.fr »

      • Le fichier index.html n’existe donc pas. C’est voulu ? Sinon en le creeant ca enlevera l’erreur

        • lesjno

          Bonjour,

          Je me suis mal exprimé. L’exemple donné n’était qu’un « exemple » ! Je me plaçais en tant que « client » connecté en wifi au point d’accès et qui souhaitait aller visiter une page web quelconque. Le site internet lui même n’est pas le problème, j’aurais pu prendre des milliers d’autres exemples.
          Pour être générique, imaginez que l’on veuille accéder au site http://aaaaa/bbbbb : Je suppose qu’en fonctionnement « normal » du point d’accès avec portail captif je devrais d’abord aller non pas sur la page demandée mais sur la page de connexion préparée pour l’identification de l’utilisateur, donc la page qui se trouve en local sur la Raspberry : /var/www/index.php. Or ce n’est pas le cas : les log indiquent que le système essaie de faire un open() de « /var/www/bbbbb » (qui n’existe pas bien entendu !), request « GET /bbbbb HTTP/1.1 », host: « aaaaa ».
          Il y a donc quelque chose qui ne va pas dans la configuration. Est-ce dans la config iptables ? est-ce ailleurs ?

          • Ok effectivement le passage par la page devrait etre par defaut. Si c’est correct cote login mot de passe alors les ip tables sont mises en place pour ouvrir l’acces vers l’exterieur. Mais je ne sais plus si la page est mise par defaut des le debut ou s’il faut se rendre dessus la premiere fois ….

          • Nicolas Leleu

            Et si on faisait la page de logon via la page d’erreur 404, page non trouvée? ou alors, la page 404 redirigerait vers index.php

  • Ricardo

    Bonjour,

    Le point 5 est vide, pourriez vous le remettre s’il vous plaît, merci.

  • Henry Bernard

    Merci bcp pour ce tuto, il m a permis de mettre en place un accès wifi. Par contre, meme avec un ipforward a 0, je n’ai pas la popup/splash-page des portails captifs… ni sur mac, ni ios, ni android. Savez vous comment faire ? Ce serait tres top de pouvoir faire ca, on se connecte et – pop – une fenetre browser s affiche comme dans les restaus, hotels, etc.

    • Je ne sais pas mais moi aussi ca m’interresse de savoir comment faire 🙂

      • Henry Bernard

        Le truc, c est que ça devrait se faire tout seul. Comme pour free wifi… Lorsqu un OS (iOS, Android, Mac) se connecte au wifi il vérifie s il est captif ou pas… Si oui, il envoie une popup. Ce qui est bizarre c est que ça se fasse pas déjà …

        • Iptv

          Je suis intéressé par ce que vous pouvez faire avec l’appareil , Voir page d’accueil des hôtels ou des restaurants . merci

          • Pour info je vais faire un article avec CoovaChilli qui affiche une popup dès l’arrivée sur le réseau Wifi, dans la popup il y a une page HTML customisable et les utilisateurs sont gérées par une authentification via FreeRadius

  • Iptv

    hola, veo que los comentarios NO son en español, podrías responderme dudas en español?

  • Chris

    The code on point 5 seems to be missing.

  • Mohit Madan

    The code is missing(Point 5)

  • cpS

    The codes in section 4 and 5 are missing.

  • The code in section 4 and 5 are again missing…….

  • Tania Daniela Paiva Falcón

    Hello, code on point 5 is misisng.

  • Chris

    Hello what has happened to section 4 and 5 after-all?

    • Code has been deleted and I do not find any backup sorry. I should take time to recreate it. Else use my post with coovachilli

  • Rodrigue ANDRIANOMENJANAHARY

    Bonjour

    Comment on va faire si on a installé apache2 et phpmyadmin sur le raspberry??

    J’arrive a partager la connexion de mon raspberry avec un téléphone et un ordinateur mais je veux pas qu’à chaque fois je dois taper mon addresse ip suivi du dossier que je veux voir.Alors je veux qu’en connectant à mon réseaux avec un téléphone,lorsque j’ouvre le navigateur,y a tout de suite la page d’accueil qui s’affiche.

    Est-ce que quelqu’un peut m’aider??,merci beaucoup

    • Utilisez plutôt la solution freeradius et coovachilli qui est présentée sur ce site et qui fonctionne comme vous attendez

  • Paddy