« Hotspot wifirst » : différence entre les versions

De Wiki doc

(Page créée avec « Category:Raspberry_pi Cette article décrit la mise en place d'un routeur Wifi - Wifi + RJ45 relayant une connexion Wifirst avec authentification automatique au portai... »)
 
(→‎Script d'auto-connexion : Ajout d'une explication sur le lien symbolique.)
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
[[Category:Raspberry_pi]]
[[Category:Raspberry_pi]]
Cette 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 identifiant 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).
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).
 
{{Info|Ce document reprend en grande partie des éléments du tutoriel sur le [[Hotspot_wifi|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=
=Matériels utilisés=
Dans cet exemple on utilise un Raspberry Pi 3 pour bénéficier de sa clé Wifi intégré, par ce que c'est pas cher, que ça ne fait pas de bruit et que ça ne consomme rien.
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)
* 1 Raspberry Pi 3 (Raspbian jessie)
* Une clé wifi externe (une TP-Link tl-wn722n dans cet exemple)
* 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=
=Installation des paquets=
  apt install vim hostapd dnsmasq curl bridge-utils
  apt install vim hostapd dnsmasq curl
=Interfaces réseaux=
=Interfaces réseaux=
==Changement des noms d'interface==
==Changement des noms d'interface==
{{info|La fonctionnalité [[Paramètres_linux#Nom des interfaces réseaux|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
  vim /etc/systemd/network/10-wifiwan0.link
<source lang="bash">
<source lang="bash">
Ligne 31 : Ligne 33 :
<source lang="bash">
<source lang="bash">
[Match]
[Match]
MACAddress=00:23:57:9c:14:20
MACAddress=00:23:57:xx:xx:xx


[Link]
[Link]
Ligne 38 : Ligne 40 :


==Configuration IP==
==Configuration IP==
vim /etc/network/interfaces
vim /etc/network/interfaces
 
<source lang="bash">
#Ethernet intégré (LAN)
#Ethernet intégré (LAN)
auto ethlan0
auto ethlan0
Ligne 57 : Ligne 59 :
         wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
         wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
         up iptables -t nat -A POSTROUTING -j MASQUERADE
         up iptables -t nat -A POSTROUTING -j MASQUERADE
</source>


############################
=Configuration du hotspot Wifi=
 
==Appairage Wifirst==
vim /etc/wpa_supplicant/wpa_supplicant.conf
vim /etc/wpa_supplicant/wpa_supplicant.conf
 
<source lang="bash">
country=FR
country=FR
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
Ligne 69 : Ligne 72 :


network={
network={
     ssid="Wifirst BA 105"
     ssid="SSID du Wifirst"
     key_mgmt=NONE
     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">
# Partie commune
domain-needed
expand-hosts
bogus-priv
interface=wifilan0,ethlan0


vim /etc/hostapd/hostapd.conf
# 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
</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">
# Contenu de /etc/hostapd/hostapd.conf
# Contenu de /etc/hostapd/hostapd.conf
# 1. Parametres de l'interface d'écoute
# 1. Paramètres de l'interface d'écoute
interface=wifilan0
interface=wifilan0
driver=nl80211
driver=nl80211


# 2. Parametres du démon hostapd
# 2. Paramètres du démon hostapd
ctrl_interface=/var/run/hostapd
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
ctrl_interface_group=0
Ligne 94 : Ligne 118 :
# 4. Sécurité du réseau Wifi
# 4. Sécurité du réseau Wifi
wpa=2
wpa=2
wpa_passphrase=TestOsterone
wpa_passphrase=VotreMotDePasse
wpa_key_mgmt=WPA-PSK
wpa_key_mgmt=WPA-PSK
wpa_pairwise=CCMP
wpa_pairwise=CCMP
Ligne 105 : Ligne 129 :
logger_stdout_level=2
logger_stdout_level=2


# 6. Autres parametres
# 6. Autres paramètres
beacon_int=100
beacon_int=100
auth_algs=3
auth_algs=3
wmm_enabled=1
wmm_enabled=1
 
</source>
############################
Test de bon fonctionnement
 
hostapd -dd /etc/hostapd/hostapd.conf
chmod +x /usr/bin/wifirst_autoconnect
Lancement au démarrage du système
 
vim /etc/default/hostapd
############################
<source lang="bash">
 
hostapd -dd /etc/hostapd/hostapd.conf
 
############################
 
vim /etc/default/hostapd
 
DAEMON_CONF="/etc/hostapd/hostapd.conf"
DAEMON_CONF="/etc/hostapd/hostapd.conf"
RUN_DAEMON=yes
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.


vim /usr/bin/wifirst_autoconnect
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 [https://www.jgachelin.fr/connexion-automatique-au-portail-captif-wifirst/ 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">
#!/bin/bash
#!/bin/bash


sleep 10
#Indentifiants
#Indentifiants
login="w/6588593@wifirst.net"
login="w/1234567@wifirst.net"
password="qrtrcnjqk6xp7gwkmkbd"
password="fheotudbf2zy3hdvsyeg"
url="https://duckduckgo.com"
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"
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.


############################
{{Info|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.}}
#Execution du script à l'optention de l'adresse IP DHCP (avec un post-up dans le fichier interfaces, ça execute le script après le up mais avant le bail DHCP, ce qui fait que ça ne fonctionne pas.)
ln -s /usr/bin/wifirst_autoconnect /etc/dhcp/dhclient-enter-hooks.d/
ln -s /usr/bin/wifirst_autoconnect /etc/dhcp/dhclient-enter-hooks.d/
 
############################
 
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:6C:43:AF,machinefixe,192.168.1.10
 
# Partie cache DNS
cache-size=256
 
############################
#debug wpa supplicant si ça fonctionne pas
wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant.conf -iwifiwan0 -f /tmp/wpa.log


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


vim /etc/sysctl.conf
* */2 * * * /usr/bin/wifirst_autoconnect


net.ipv4.ip_forward=1
=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
#Voir qui est connecté (fonctionne)
iw dev wlan0 station dump
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 qlq'un (à tester)
=À venir=
hostapd_cli deauthenticate 00:5e:3d:38:fe:ab
Voici une liste des fonctionnalités que j'aimerais ajouter:
#Source : https://stackoverflow.com/questions/19400117/disconnect-user-on-hostap#19426711
* 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=
* Notre [[Hotspot_wifi|propre tutoriel]] sur l'installation d'un point d'accès Wifi sous Debian
* https://www.jgachelin.fr/connexion-automatique-au-portail-captif-wifirst/

Dernière version du 17 mai 2018 à 22:02

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