Spin0us.net github

Localisation

Transformer un RaspberryPi en box internet avec un iPhone

par spin0us le 23 octobre 2017

Ce week end, ma freebox a rendu l'âme (elle redémarre en boucle, impossible de se connecter). Après les vérifications d'usage, je contacte l'assistance Free qui me programme une intervention d'un technicien le jeudi suivant. Sachant que je suis en télétravail, ce délais était intollérable (même si une semaine de vacances ne m'aurait pas spécialement dérangée).

Solution 1: utiliser un téléphone pour faire un partage de connexion via l'USB ou le Wifi. Malheureusement la configuration matérielle de mon espace travail ne me permettait pas ce type de configuration, il a fallu envisager une autre solution.

Solution 2: utiliser un téléphone pour faire un partage de connexion via l'USB connecté sur un Raspberry Pi qui fera office de routeur et serveur DHCP. De cette façon, je peux remplacer la quasi totalité des fonctionnalités de ma freebox de façon transparente vis à vis de la configuration actuelle du réseau.

Matériel requis

  • un Rapsberry Pi
  • un iPhone (attention à la consommation, tout votre trafic internet passera par votre téléphone)

Si vous disposez d'un téléphone de type Android, je vous invite à lire ce topic (en anglais)

Préparation du Raspberry Pi

Commencez par télécharger l'image officielle RASPBIAN STRETCH LITE. Puis installez la sur votre carte mémoire microSD.
Pensez à activer le ssh en créant simplement un fichier nommé "ssh" dans la partition de boot.
Pour éviter de devoir retrouver l'adresse ip de votre Raspberry Pi une fois qu'il aura booté, je vous invite à spécifier une ip en ajoutant par exemple "ip=192.168.0.1" dans le fichier "cmdline.txt" de la partition de boot (voir ici pour plus d'info).

Vous pouvez maintenant remettre la carte mémoire dans votre Raspberry Pi et le démarrer.

Etape 1 : Configuration de base

Ouvrez une session ssh sur votre Raspberry Pi (via le terminal sur MacOs/Linux ou Putty sur Windows).
Pour rappel, les identifiants de connexion par défaut sur le Raspberry Pi sont "pi" et mot de passe "raspberry".
Une fois connectez, passez en mode root (sudo su -) pour une question de facilité.

On commence par les mises à jour et l'installation des paquest nécessaires

root@rpi:~# rpi-update
root@rpi:~# apt-get update && apt-get dist-upgrade
root@rpi:~# apt-get install gvfs ipheth-utils libimobiledevice-utils gvfs-backends gvfs-bin gvfs-fuse
root@rpi:~# apt-get install dnsmasq ifuse iptables-persistent

rpi-update met à jour les firmwares de votre Raspberry Pi
apt-get update && apt-get dist-upgrade met à jour les paquets installés
Le deux commandes suivantes installent les paquets nécessaires à notre configuration.

On va ensuite identifier l'interface utilisée par notre téléphone connecté sur l'USB

root@rpi:~# ifconfig -s
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0      1500    14351      0      0 0          9621      0      0      0 BMRU
lo       65536       37      0      0 0            37      0      0      0 LRU
wlan0     1500        0      0      0 0             0      0      0      0 BMU

Branchez votre iPhone sur un des ports USB et activez le partage de connexion (Paramêtres > Partage de connexion). Puis relancez la même commande.

root@rpi:~# ifconfig -s
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0      1500    14351      0      0 0          9621      0      0      0 BMRU
eth1      1500     1111      0      1 0          1347      2      0      0 BMRU
lo       65536       37      0      0 0            37      0      0      0 LRU
wlan0     1500        0      0      0 0             0      0      0      0 BMU

Vous pouvez alors constater l'apparition d'une nouvelle interface (ici eth1) qui correspond donc à l'USB de votre téléphone. On peut donc la configurer :

root@rpi:~# echo "allow-hotplug eth1" >> /etc/network/interfaces
root@rpi:~# echo "iface eth1 inet dhcp" >> /etc/network/interfaces

De cette manière, votre connexion se configurera automatiquement. Si vous regardez sur l'écran de votre iPhone, vous constaterez que la connexion ne semble pas encore partagée. Pour terminez cette étape il faut créer un point de montage pour l'iPhone.

root@rpi:~# mkdir /media/iPhone
root@rpi:~# ifuse /media/iPhone

Il faut ensuite configurer le système pour qu'il fasse la manipulation du point de montage automatiquement lors de la connexion de l'iPhone. Editez le fichier /lib/udev/iphoneconnect et ajoutez les lignes suivantes :

#!/bin/bash
umount /media/iPhone
ifuse /media/iPhone
ipheth_pair

Il faut ensuite rendre ce script exécutable et le programmer dans l'automatisation de la détection

root@rpi:~# chmod 755 /lib/udev/iphoneconnect
root@rpi:~# sed -i -e "s/ipheth_pair/iphoneconnect/g" /lib/udev/rules.d/90-iphone-tether.rules
root@rpi:~# service networking restart

A ce stade, votre Raspberry Pi est connecté à internet et vous devriez le voir sur l'écran de votre iPhone.

Par contre, les autres ordinateur de votre réseau local ne sont pas encore reliés. Il faut transformer votre Raspberry Pi en routeur et éventuellement en serveur DHCP.

Etape 2 : Configuration du Raspberry Pi en routeur

Commencez par activer le routage ip v4

root@rpi:~# echo "1" > /proc/sys/net/ipv4/ip_forward

Et pour éviter d'avoir à taper cette commande à chaque redémarrage, décommentez à la #net.ipv4.ip_forward=1 dans le fichier /etc/sysctl.conf.

Il faut maintenant créer les règles de routage dans iptables

root@rpi:~# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
root@rpi:~# iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
root@rpi:~# iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
root@rpi:~# iptables-persistent save

Ici eth0 représente l'interface de votre réseau local branché sur le port ethernet de votre Raspberry Pi et eth1 l'interface du port USB de votre iPhone. Pour résumer, on redirige tout le trafic en provenance de votre réseau local vers la connexion de votre iPhone.
La dernière ligne permet de rendre ses règles persistantes. Sinon elles disparaissent à chaque redémarrage.

Etape 3 : Configuration du Raspberry Pi en serveur DHCP

Pour rappel, un serveur DHCP sert à fournir des adresses IP aux équipements qui en font la demande. Pour plus d'informations, je vous invite à lire ceci.

root@rpi:~# mv /etc/dnsmasq.conf /etc/dnsmasq.default
root@rpi:~# vi /etc/dnsmasq.conf

Ajoutez les lignes suivantes :

interface=eth0
dhcp-range=192.168.1.10,192.168.1.250,255.255.255.0,12h
dhcp-option=6,8.8.8.8,8.8.4.4
dhcp-host=aa:bb:cc:dd:ee:ff,MonPC,192.168.1.5

La première ligne précise l'interface concernée, ici le réseau local eth0.
dhcp-range spécifie la plage d'adresses IP disponnibles et la durée du bail (ici 12h).
dhcp-option permet de renseigner les adresses ip des DNS (option 6).
dhcp-host réserve une adresse ip à une adresse MAC donnée.

Il ne reste plus qu'à redémarrer le service de DHCP

root@rpi:~# service dnsmasq restart

Et voilà, vous en avez terminé. En démarrant vos autres équipements connectés sur l'ethernet, vous devriez pouvoir accéder à internet comme avant.

Conclusion

Cette procédure peut sembler compliquée, mais une fois en place, plus besoin d'y revenir. Vous démarrez votre Raspberry Pi, connectez votre iPhone sur l'USB, lancez le partage de connexion et tout est prêt !

Il doit également être possible d'activer le wifi du Raspberry Pi pour émuler la fonctionnalité de point d'accès et ainsi remplir tous les rôles de la Freebox, mais je n'en avais pas l'utilité, ni le besoin. Donc, à vous de jouer !