Modem FreeWifi_secure
Introduction#
Depuis quelques années Free à mis en place des réseaux sans fils pour ces abonnés mobiles. Chaque FreeBox installé dispose et émet un signal wifi « FreeWifi_secure » sur lequel il est possible de ce connecter via son smartphone. Pour la connexion, nul besoin d’identifiants, ceux-ci sont contenus dans la carte SIM (Free donc) du téléphone. Il est ainsi possible de profiter d’une bonne connexion internet sur l’abonnement à 2€ par mois sans passer par la 3G, à condition d’avoir une borne « FreeWifi_secure » dans les parages.
Pour des besoins temporaires je voulais me connecter à l’un de ces réseaux pour refaire mon propre réseaux sans fils (disponibles pour plusieurs pc et smartphones). Mon but étant d’utiliser le réseau « FreeWifi_secure » en tant que point d’accès internet.
Prérequis#
Pour ce faire, il va me falloir à minima:
- Un abonnement Free mobile 2€ et la carte SIM
- un réseau « FreeWifi_secure »
- un ordinateur
- une carte wifi
- un lecteur de carte sim
- un routeur wifi pour mon réseau sans fil privé
Pour l’ordinateur, il me fallait quelque chose de compact. Je me suis donc tourné vers un Raspberry Pi 3 B. Abordable, facile à configurer, celui-ci dispose d’une carte Wifi intégré. Pour qu’il fonctionne il lui faut encore une carte MicroSD de 8go ou plus et une alimentation 5V (2A).
Pour le lecteur de carte SIM je me suis en premier lieu tourné vers un modèle à 2$ Chinois disponible sur ebay. Malheureusement celui-ci est avéré défectueux et j’ai donc investi dans un lecteur de Smart-Card plus cher, le Cherry TC-1100, ma principal contrainte étant que celui-ci devait être compatible avec Linux.
Pour le routeur, n’importe quel routeur sans fils avec une prise Ethernet devrait faire l’affaire.
Installation#
La première chose à faire est d’installer un système d’exploitation sur le Raspberry Pi. J’ai choisi Raspbian Lite. Le guide d’installation complet est ici.
Pour ma part je copie l’image de Raspbian sur la carte SD:
sudo dd bs=4M if=2017-04-10-raspbian-jessie-lite.img of=/dev/mmcblk0
Ensuite j’ai besoin d’une adresse IP fixe pour me connecter plus tard à mon Raspberry via SSH. Pour ce faire, il faut éditer le fichier:
sudo nano /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
Pour certaines raisons on peut vouloir utiliser une carte Wifi externe au quel cas on peut désactiver la carte Wifi intégré au Raspberry Pi (3 B uniquement):
sudo nano /boot/config.txt
dtoverlay=pi3-disable-wifi
De coutume je n’utilise jamais l’IP V6 et le désactive donc pour simplifier le reste de la configuration:
sudo nano /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1
net.ipv6.conf.wlan0.disable_ipv6 = 1
Mise à jour et installation des logiciels#
Connecter maintenant votre Raspberry Pi à internet pour faire les mises à jours et installer les logiciels nécessaires au bon déroulement des opérations.
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install pcscd pcsc-tools libccid iptables-persistent
Test du lecteur de carte#
Élément crucial, le lecteur de cartes. On vient d’installer les logiciels nécessaires à sont bon fonctionnement, il faut maintenant tester:
sudo pcsc_scan
PC/SC device scanner
V 1.4.23 (c) 2001-2011, Ludovic Rousseau <ludovic.rousseau@free.fr>
Compiled with PC/SC lite version: 1.8.11
Using reader plug'n play mechanism
Scanning present readers...
0: Cherry Smart Card Reader USB (OKCM0030407140701284559729565853) 00 00
Si tout à fonctionner correctement on peut insérer la carte SIM dans le lecteur et on devrait voir s’afficher quelque chose comme ça:
Card state: Card inserted, Shared Mode
C’est très bon signe!
Configuration Wifi#
Il nous faut créer un fichier de configuration pour wpa_supplicant:
sudo nano /etc/wpa_supplicant/FreeWifi.conf
cred={
imsi="none" # anything but blank value
}
network={
#bssid=MACADRESS #A Ajouter si plusieurs reseaux sont disponibles et que l'un est meilleur
ssid="FreeWifi_secure"
key_mgmt=WPA-EAP IEEE8021X
eap=SIM
pin="1234" #Code de la carte SIM par defaut
pcsc=""
}
sudo iwconfig wlan0 essid "FreeWifi_secure" && sudo wpa_supplicant -i wlan0 -d nl80211 -c /etc/wpa_supplicant/FreeWifi.conf -B
Si tout a fonctionner correctement vous devriez avoir une adresse IP et devriez être capable de pinger 8.8.8.8 sans avoir internet sur la partie Ethernet de votre Raspberry.
On peut alors configurer les interfaces pour que le Raspberry se connecter automatiquement au réseau Wifi lors du démarrage de celui-ci:
sudo nano /etc/network/interfaces
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-driver nl80211
wpa-conf /etc/wpa_supplicant/FreeWifi.conf
wireless-power off
sudo reboot
Mécanismes periodiques#
A ce stade, vous devriez avoir internet sur votre Raspberry Pi via la connexion « FreeWifi_secure ». Mais il y a un bemol… Vous vous rendrez rapidement compte qu’au bout de 30 minutes maximum vous n’aurez plus accès à internet. C’est parce que le wifi « FreeWifi_secure » doit recevoir des informations d’authentifications toutes les 30 minutes, sinon il coupe l’accès à internet. Heureusement il existe une commande pour renvoyer les informations d’authentifications sans pour autant ce déconnecter du réseau wifi:
sudo wpa_cli reauthenticate
Pour être sur de ne pas perdre la connexion internet il faut exécuter cette commande au moins toutes les 30 minutes. 15 minutes c’est plus sur, et ça ne coûte pas bien cher. Pour ce faire nous utiliserons l’utilitaire crontab.
sudo crontab -e
*/15 * * * * sudo wpa_cli reauthenticate >/dev/null 2>&1
Internet devrait être beaucoup plus stable maintenant et vous devriez pouvoir profiter d’internet pendant plus de 30 minutes d’affiler sans déconnexion.
Mais mais mais, il se peut que de temps à autres, pour X raisons, ça ne fonctionne plus. C’est pourquoi j’ai crée un script chargé de vérifier l’état de la connexion et de régler les problèmes si l’accès à internet est perdu.
sudo nano CheckInternet.sh
#!/bin/bash
up=true
for i in {1..24}
do
if $up ; then
pingGoogle=`ping 8.8.8.8 -I wlan0 -s 0 -c 3 -i 1 >>/dev/null; echo $?`
if [ $pingGoogle -eq 0 ]; then
echo up
else
date +%s >> /home/pi/dhclient.log
#echo Internet is down >> /home/pi/dhclient.log
up=false
wlan=`iwconfig wlan0 | grep "FreeWifi_secure" | wc -l`
if [ $wlan -eq 0 ]; then
echo wlan disconnected >> /home/pi/dhclient.log
sudo ifdown wlan0
sudo ifup wlan0
else
echo reinit dhcp client >> /home/pi/dhclient.log
sudo dhclient -r wlan0
sudo dhclient wlan0
fi
sudo wpa_cli reauthenticate
fi
fi
done
sudo chmod +x CheckInternet.sh
sudo ./CheckInternet.sh
Ce script s’exécute toutes les minutes:
sudo crontab -e
*/1 * * * * sudo bash /home/pi/CheckInternet.sh >/dev/null 2>&1
Redirection du trafic vers le port Ethernet#
C’est bien beau tout ça, mais moi ce que je voulais c’était avoir mon propre réseau wifi, accessible par tous mes objets (pc, smartphones, …) en même temps. C’est bien pour ce que nous disposons d’un routeur wifi. Il sera connecter au port Ethernet du Raspberry. Mais avant cela, il faut dire au Raspberry de rediriger tout le trafic du réseau wifi vers le port Ethernet, et de rediriger les requêtes qui arrive via le port Ethernet vers le réseau wifi.
Première chose a faire, activer la redirection de trafic:
sudo nano /etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1
sudo iptables -A FORWARD --in-interface eth0 -j ACCEPT
sudo iptables --table nat -A POSTROUTING --out-interface wlan0 -j MASQUERADE
sudo iptables -I FORWARD 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables-save
# Generated by xtables-save v1.8.2 on Wed Apr 1 20:40:02 2020
*filter
:INPUT ACCEPT [349:30887]
:FORWARD ACCEPT [162:57661]
:OUTPUT ACCEPT [261:30187]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
COMMIT
# Completed on Wed Apr 1 20:40:02 2020
# Generated by xtables-save v1.8.2 on Wed Apr 1 20:40:02 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o wlan0 -j MASQUERADE
COMMIT
# Completed on Wed Apr 1 20:40:02 2020
sudo nano /etc/iptables/rules.v4
# Generated by iptables-save v1.4.21
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Generated by iptables-save v1.4.21
*filter
:INPUT ACCEPT [445:55513]
:FORWARD ACCEPT [543:45114]
:OUTPUT ACCEPT [345:50556]
-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i eth0 -o wlan0 -j ACCEPT
COMMIT
# Generated by iptables-save v1.4.21
:PREROUTING ACCEPT [484:32167]
:INPUT ACCEPT [1:237]
:OUTPUT ACCEPT [17:1323]
:POSTROUTING ACCEPT [1:172]
-A POSTROUTING -o wlan0 -j MASQUERADE
COMMIT
# Completed
sudo reboot
Routeur#
Il faut configurer le routeur pour que celui-ci se connecte sur le port WAN à l’adresse configurer précédemment sur le Raspberry, à savoir 192.168.1.1.
C’est tout!
Sources#
https://ohnomoregadgets.wordpress.com/2013/08/28/free-wifi-with-eap-sim-on-a-desktop-computer/
https://www.raspberrypi.org/documentation/installation/installing-images/linux.md
https://www.raspberrypi.org/documentation/remote-access/ssh/README.md
https://wiki.debian.org/NetworkConfiguration#Configuring_the_interface_manually
https://github.com/raspberrypi/firmware/blob/master/boot/overlays/README
https://wiki.debian.org/DebianIPv6#How_to_turn_off_IPv6
https://wiki.archlinux.org/index.php/Internet_sharing
