Hotspot wifirst

De Wiki doc

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. On crée donc un lien symbolique du script dans le répertoire d'exécution des évènements à la configuration DHCP de sorte à avoir une temporalité cohérente dans le déroulement des étapes.
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

Source : https://unix.stackexchange.com/questions/40087/is-there-a-way-to-list-the-connected-devices-on-my-wifi-access-point

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