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

<source lang="bash"> [Match] MACAddress=c0:4a:00:xx:xx:xx

[Link] Name=wifiwan0 </source>

vim /etc/systemd/network/10-wifilan0.link

<source lang="bash"> [Match] MACAddress=b8:27:eb:xx:xx:xx

[Link] Name=wifilan0 </source>

vim /etc/systemd/network/10-ethlan0.link

<source lang="bash"> [Match] MACAddress=00:23:57:xx:xx:xx

[Link] Name=ethlan0 </source>

Configuration IP

vim /etc/network/interfaces

<source lang="bash">

  1. Ethernet intégré (LAN)

auto ethlan0 iface ethlan0 inet static address 192.168.68.254 netmask 255.255.255.0

  1. Wifi intégré (LAN)

auto wifilan0 iface wifilan0 inet static

       address 192.168.67.254
       netmask 255.255.255.0
  1. 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

</source>

Configuration du hotspot Wifi

Appairage Wifirst

vim /etc/wpa_supplicant/wpa_supplicant.conf

<source lang="bash"> 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

} </source> 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

<source lang="bash">

  1. Partie commune

domain-needed expand-hosts bogus-priv interface=wifilan0,ethlan0

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

  1. Pour distribuer une IP statique
  2. dhcp-host=00:40:F4:XX:XX:XX,machinefixe,192.168.1.10
  1. Partie cache DNS

cache-size=256 </source> 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

<source lang="bash">

  1. Contenu de /etc/hostapd/hostapd.conf
  2. 1. Paramètres de l'interface d'écoute

interface=wifilan0 driver=nl80211

  1. 2. Paramètres du démon hostapd

ctrl_interface=/var/run/hostapd ctrl_interface_group=0

  1. 3. Configuration du réseau Wifi

ssid=Raspi channel=6 hw_mode=g ieee80211n=1

  1. 4. Sécurité du réseau Wifi

wpa=2 wpa_passphrase=VotreMotDePasse wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP rsn_pairwise=CCMP

  1. 5. Logs

logger_syslog=-1 logger_syslog_level=4 logger_stdout=-1 logger_stdout_level=2

  1. 6. Autres paramètres

beacon_int=100 auth_algs=3 wmm_enabled=1 </source> Test de bon fonctionnement

hostapd -dd /etc/hostapd/hostapd.conf

Lancement au démarrage du système

vim /etc/default/hostapd

<source lang="bash"> DAEMON_CONF="/etc/hostapd/hostapd.conf" RUN_DAEMON=yes </source>

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 <source lang="bash" inline>about:config</source> : 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

<source lang="bash">

  1. !/bin/bash
  1. 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" </source>

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