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]
    <!–?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>

    [/php]

  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...