Hotspot wifirst
Cet article décrit la mise en place d'un routeur Wifi - Wifi + RJ45 relayant une connexion Wifirst avec authentification automatique au portail captif. L'objectif est de ne pas avoir à entrer les identifiants sur chaque appareil et pouvoir en connecter plusieurs à la fois, le tout, sans les déconnexions intempestives au point d'accès (car Wifirst déconnecte régulièrement les équipements au bout d'un certain temps, ce qui fait qu'on passe notre vie à retaper les identifiants).
INFORMATION
Ce document reprend en grande partie des éléments du tutoriel sur le point d'accès Wifi. Il se démarque par l'aspect spécifique et non conventionnelle d'un accès Internet universitaire Wifirst qui est particulièrement casse couille.Matériels utilisés
Dans cet exemple on utilise un Raspberry Pi 3 pour bénéficier de sa puce Wifi intégré, parce que ce n'est pas cher, que ça ne fait pas de bruit et que ça ne consomme rien.
- 1 Raspberry Pi 3 (Raspbian jessie)
- Une clé wifi externe qui gère le mode AP (une TP-Link tl-wn722n - nécessitant le pilote non-free firmware-atheros - dans cet exemple )
Installation des paquets
apt install vim hostapd dnsmasq curl
Interfaces réseaux
Changement des noms d'interface
INFORMATION
La fonctionnalité Predictable Network Interface Names doit être activée pour personnaliser le nom des interfaces réseaux, ce qui n'est pas le cas dans Debian et Raspbian Jessie.vim /etc/systemd/network/10-wifiwan0.link
[Match]
MACAddress=c0:4a:00:xx:xx:xx
[Link]
Name=wifiwan0
vim /etc/systemd/network/10-wifilan0.link
[Match]
MACAddress=b8:27:eb:xx:xx:xx
[Link]
Name=wifilan0
vim /etc/systemd/network/10-ethlan0.link
[Match]
MACAddress=00:23:57:xx:xx:xx
[Link]
Name=ethlan0
Configuration IP
vim /etc/network/interfaces
#Ethernet intégré (LAN)
auto ethlan0
iface ethlan0 inet static
address 192.168.68.254
netmask 255.255.255.0
#Wifi intégré (LAN)
auto wifilan0
iface wifilan0 inet static
address 192.168.67.254
netmask 255.255.255.0
#Wifi externe (WAN)
auto wifiwan0
iface wifiwan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
up iptables -t nat -A POSTROUTING -j MASQUERADE
Configuration du hotspot Wifi
Appairage Wifirst
vim /etc/wpa_supplicant/wpa_supplicant.conf
country=FR
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
iap_scan=1
network={
ssid="SSID du Wifirst"
key_mgmt=NONE
}
En cas de problème de connexion avec le point d'accès, wpa_supplicant peut envoyer des logs dans un fichier journal
wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -iwifiwan0 -f /tmp/wpa.log
Création du serveur DHCP et relais DNS
vim /etc/dnsmasq.conf
# Partie commune
domain-needed
expand-hosts
bogus-priv
interface=wifilan0,ethlan0
# Partie DHCP
dhcp-range=wifilan0,192.168.67.1,192.168.67.250,255.255.255.0,12h
dhcp-range=ethlan0,192.168.68.1,192.168.68.250,255.255.255.0,12h
# Pour distribuer une IP statique
#dhcp-host=00:40:F4:XX:XX:XX,machinefixe,192.168.1.10
# Partie cache DNS
cache-size=256
Les serveurs DNS qui seront utilisés par le relais sont ceux contenus dans le fichier /etc/resolv.conf.
Création du point d'accès local
vim /etc/hostapd/hostapd.conf
# Contenu de /etc/hostapd/hostapd.conf
# 1. Paramètres de l'interface d'écoute
interface=wifilan0
driver=nl80211
# 2. Paramètres du démon hostapd
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
# 3. Configuration du réseau Wifi
ssid=Raspi
channel=6
hw_mode=g
ieee80211n=1
# 4. Sécurité du réseau Wifi
wpa=2
wpa_passphrase=VotreMotDePasse
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
rsn_pairwise=CCMP
# 5. Logs
logger_syslog=-1
logger_syslog_level=4
logger_stdout=-1
logger_stdout_level=2
# 6. Autres paramètres
beacon_int=100
auth_algs=3
wmm_enabled=1
Test de bon fonctionnement
hostapd -dd /etc/hostapd/hostapd.conf
Lancement au démarrage du système
vim /etc/default/hostapd
DAEMON_CONF="/etc/hostapd/hostapd.conf"
RUN_DAEMON=yes
Authentification Wifirst
L'objectif de cette section va être de permettre à notre routeur de se connecter automatiquement au portail captif de Wifirst. Nous utiliserons pour ceci un script.
Avant toute chose, une petite précision sur la façon don Wifirst gère l'authentification. La page de connexion récupère les identifiants entré par l'utilisateur via une requête HTTP POST et le redirige vers l'adresse suivante : https://connect.wifirst.net/?perform=true. Cette page va se charger de récupérer une correspondance identifiant/mot de passe hachés avant de rediriger le client vers une autre page (https://wireless.wifirst.net:8090/goform/HtmlLoginRequest) avec ce couple d'identifiant (c'est donc ceux-ci qui servent réellement à ce connecter et non l'adresse email + mot de passe). Le problème est que le navigateur redirige instantanément la page, il est donc impossible de lire le code source et de récupérer ces informations.
Pour régler ça sans mettre en place une usine à gaze à base de Wireshark, il suffit de changer cette valeur dans le about:config
: accessibility.blockautorefresh (true). Une fois ceci fait, il est possible de cliquer sur le lien https://connect.wifirst.net/?perform=true et de récupérer les informations souhaités. Ce billet de blog explique en détail la marche à suivre.
Script d'auto-connexion
Les informations en votre possession, il devient possible d'utiliser le script suivant (à adapter hein, ne pas faire un copier/coller sauvage sans rien changer avec les identifiants bidons que j'ai mis là)
vim /usr/bin/wifirst_autoconnect
#!/bin/bash
#Indentifiants
login="w/1234567@wifirst.net"
password="fheotudbf2zy3hdvsyeg"
url="https://duckduckgo.com"
curl -d username="$login" -d password="$password" -d qos_class="0" -d success_url="$url" -d error_url="$url" -d accept="submit" "https://wireless.wifirst.net:8090/goform/HtmlLoginRequest"
chmod +x /usr/bin/wifirst_autoconnect
Exécution du script à l'obtention de l'adresse IP dynamique.
INFORMATION
Un test a été effectué avec un post-up dans le fichier /etc/network/interfaces, le script s'exécute bien après le montage de l'interface mais avant que le serveur DHCP ne fournisse un bail DHCP au client, ce qui fait que la requête de connexion au Wifirst est envoyé avant d'avoir une adresse IP et forcément ça ne fonctionne pas dans ces conditions.ln -s /usr/bin/wifirst_autoconnect /etc/dhcp/dhclient-enter-hooks.d/
Ajout d'une tâche Cron afin d'éviter les déconnexions pour cause d'inactivité (exécution du script toute les 2h de tout les jours)
contab -e
* */2 * * * /usr/bin/wifirst_autoconnect
Configuration du routeur
Activation du routage pour ce démarrage
echo 1 > /proc/sys/net/ipv4/ip_forward
Activation du routage au démarrage
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
À venir
Voici une liste des fonctionnalités que j'aimerais ajouter:
- Interface web de listage des personnes connectés au point d'accès local
- Possibilité de déconnecter un utilisateur
- Possibilité de bannir un utilisateur
Voir qui est connecté (fonctionne)
iw dev wlan0 station dump
Faire la correspondance adresse MAC/nom netbios
arp -a
Déconnecter quelqu'un (à tester)
hostapd_cli deauthenticate 00:5e:3d:38:fe:ab
Source : https://stackoverflow.com/questions/19400117/disconnect-user-on-hostap#19426711
Sources
- Notre propre tutoriel sur l'installation d'un point d'accès Wifi sous Debian
- https://www.jgachelin.fr/connexion-automatique-au-portail-captif-wifirst/