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. Pour un portail captif vous avez plusieurs possibilités :
- 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.
- 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.
Notice
Attention dans l’ensemble des instructions ci-dessous, l’interface du point d’accès est wlan0 et l’interface de sortie vers Internet est eth0Un portail captif en PHP
- 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; } }
- Installer les paquets supplémentaires :
apt-get install conntrack
- 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 : - 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]
- 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.
- 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
- Sauvegarder les règles pour les prochains redémarrages
service iptables-persistent
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]*
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 :