Depuis quelque jours, je subis une panne de connexion Internet : pour une raison que j’ignore encore, je n’ai plus de signal optique sur la fibre qui arrive dans mon appartement.
Un généreux voisin m’a alors proposé de me laisser un accès à son réseau Wi-Fi “invité” pour me dépanner. Mon fournisseur d’accès ne pouvant pas envoyer un technicien avant une semaine, c’est avec plaisir que j’ai accepté l’offre.
Remarque : je ne parlerai pas ici des solutions permettant “d’emprunter” un réseau Wi-Fi sans l’accord de son propriétaire. Allez plutôt sonner chez lui avec un pack de bières, ce sera certainement plus rapide et tout aussi efficace.
Cela me retire donc une bonne épine du pied, surtout en cette période de confinement où le télétravail est privilégié. Malheureusement, cela a tout de même quelques inconvénients :
- Le signal Wi-Fi qui arrive jusqu’à chez moi est plutôt faible et ne couvre pas la totalité de l’appartement.
- Il faudrait reconfigurer tous les équipements pour utiliser le nouveau réseau. Pour des ordinateurs ou des téléphones, cela est simple à réaliser, mais cela l’est moins pour certains objets connectés faits maison qui ont les identifiants de connexion écrits en dur dans leur firmware.
Bref, vous l’aurez compris : ce n’est pas l’idéal. Je vais donc décrire comment utiliser le serveur comme passerelle pour reconnecter mon réseau local (filaire et Wi-Fi) à Internet grâce au réseau sans-fil généreusement prêté. Le but étant que le LAN récupère sa connectivité, de manière complètement transparente pour tous les équipements connectés.
Je préfère toutefois prévenir que je suis loin d’être un expert réseau, ce qui explique qu’il est peut-être possible de faire bien mieux que ce que je vais décrire plus bas.
Comment réinjecter la connexion Internet du voisin dans son propre réseau local (filaire et Wi-Fi)
Comme la plupart des particuliers, je possède une box Internet grand public qui met à disposition des liaisons Ethernet filaires et un réseau sans-fil. L’architecture du réseau est donc la suivante :
Pour résoudre les deux problèmes cités plus haut, il faut réinjecter la connexion du voisin “à l’envers” dans le réseau local afin que le point d’accès Wi-Fi de la box utilise cette connexion-là plutôt que sa propre connexion. C’est tout-à-fait possible et je vais utiliser le serveur pour créer un pont entre mon réseau local et celui du voisin afin d’interconnecter les deux :
Il faut donc en premier lieu connecter le serveur au réseau sans-fil du voisin.
Première étape, connecter le serveur sous Debian Buster à un réseau Wi-Fi
Remarque : le bloqueur de publicités pi-hole est installé sur mon serveur et je ne sais pas exactement dans quelle mesure il a changé la configuration réseau par défaut du système. Chez vous, elle est donc peut-être légèrement différente.
Toutes les commandes qui suivent sont exécutées sous root.
Il faut donc dans un premier temps connecter l’interface Wi-Fi du serveur au réseau prêté, chose que je ne sais faire qu’avec l’outil wpa_supplicant. Il n’était malheureusement pas installé par défaut, j’ai donc dû d’abord connecter un smartphone en USB pour partager sa connexion 4G et télécharger le paquet.
Une fois la connexion du téléphone partagée, une nouvelle carte réseau qui a bien reçu une adresse IP via DHCP apparaît. Suivant votre configuration, vous pouvez avoir dès maintenant récupéré une connectivité à Internet ou pas. Si ce n’est pas le cas, il y a certainement quelques manipulations supplémentaires à réaliser :
- Si la box Internet était utilisée comme serveur DNS, il faut en choisir un autre, par exemple 1.1.1.1 :
- echo nameserver 1.1.1.1 > /etc/resolv.conf
- Si une autre interface réseau du serveur est configurée en statique, le client DHCP n’a pas ajouté à la table de routage du système la passerelle par défaut offerte par la nouvelle connexion. La passerelle par défaut est, en gros, le routeur qui met Internet à disposition à la machine : en l’occurrence le téléphone. Il a chez moi l’adresse IP 192.168.42.1, il faut donc le faire manuellement :
- ip route add default via 192.168.42.1
A ce stade, la machine devrait donc être connectée à Internet et un ping vers votre site Web préféré permet de le vérifier.
L’installation de wpa_supplicant peut alors se faire de manière traditionnelle : apt-get install wpa_supplicant. Ensuite, il faut créer ou modifier le fichier /etc/wpa_supplicant/wpa_supplicant.conf :
country=FR
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="SSID de votre voisin"
psk="mot de passe du réseau de votre voisin"
}
Après, il faut modifier le fichier /etc/network/interfaces pour indiquer au système que la carte Wi-Fi doit être gérée par wpa_supplicant. La partie en rapport avec votre carte réseau, wlp3s0 chez moi, doit alors ressembler à cela :
auto wlp3s0
allow-hotplug wlp3s0
iface wlp3s0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
Après avoir redémarré la carte (ifdown wlp3s0 ; ifup wlp3s0), le serveur doit s’être connecté au réseau du voisin et récupéré une adresse IP :
Comme décrit plus haut, si une autre interface est configurée en statique (ce qui est le cas chez moi de la carte Ethernet), le client DHCP n’ajoute pas le routeur du voisin comme nouvelle passerelle par défaut après s’être connecté. Il faut donc le faire manuellement, comme cela a été fait avec le téléphone : ip route add default via 10.72.64.1
Maintenant que le serveur est de nouveau connecté à Internet, il ne reste plus qu’à s’en servir comme passerelle pour le réseau local.
Seconde étape, modifier la configuration du serveur DHCP du réseau local
Normalement, un serveur DHCP est présent sur le réseau local pour attribuer des adresses IP aux clients qui se connectent et qui en font la demande. En leur attribuant leur adresse, il leur fournit aussi les informations suivantes :
- L’adresse d’un serveur DNS qu’il est possible d’utiliser,
- L’adresse de la passerelle par défaut, afin qu’ils sachent à quelle machine adresser leurs paquets qui doivent sortir du LAN.
Dans la plupart des cas, le serveur DHCP est fourni par la box et se désigne elle-même comme serveur DNS et passerelle par défaut. Or dans notre cas, elle ne peut plus jouer le rôle de passerelle ni de serveur DNS, vu qu’elle ne dispose plus de connexion Internet.
Il faudrait donc modifier la configuration de son serveur DHCP pour qu’elle indique au client les adresses de notre choix pour la passerelle (il faudra mettre notre serveur, qui se chargera ensuite de transmettre les paquets au voisin) et pour le serveur DNS (n’importe lequel conviendra, par exemple 1.1.1.1).
Malheureusement, cette personnalisation est très souvent impossible sur les box grand public. Il n’y a donc pas d’autre solution que d’utiliser un autre serveur qui autorise ces fonctionnalités.
J’ai été confronté exactement à ce problème pour mettre en place le bloqueur de publicités pi-hole, j’ai donc déjà réalisé cette opération dans le passé : je n’utilise déjà plus le serveur DHCP de la box mais celui de pi-hole à la place. Tant mieux, cela facilite la tâche aujourd’hui : si cela n’était pas déjà fait, cela aurait été le moment de le faire.
Bref, il faut obtenir l’architecture réseau suivante :
Après avoir désactivé le serveur DHCP de la box, il faut donc modifier la configuration de pi-hole et en particulier le serveur DHCP qu’il embarque :
- Dans /etc/dhcpcd.conf, il faut modifier l’adresse de la passerelle par défaut envoyée via DHCP. Avant, c’était la box, mais désormais, cela doit être le serveur (qui transfèrera ensuite les paquets au voisin). Chez moi, cela revient à changer la ligne :
static routers=192.168.1.1
en :
static routers=192.168.1.250
- De même, changer dans /etc/dnsmasq.d/02-pihole-dhcp.conf la ligne
dhcp-option=option:router,192.168.1.1
En :
dhcp-option=option:router,192.168.1.250
- Ensuite, /etc/dnsmasq.d/01-pihole.conf indique l’adresse du serveur DNS proposé via DHCP. Avant, c’était l’IP de mon serveur (puisque pi-hole est pour rappel un serveur DNS filtrant) mais pour ne pas s’embêter durant le dépannage, on va proposer un “vrai” serveur DNS. Il faut donc changer la double ligne :
server=192.168.1.250 server=192.168.1.250
en
server=1.1.1.1 server=1.1.1.1
- Enfin, il faut mettre à jour plusieurs paramètres dans /etc/pihole/setupVars.conf :
PIHOLE_INTERFACE=enp1s0
IPV4_ADDRESS=192.168.1.250/24
IPV6_ADDRESS=
PIHOLE_DNS_1=192.168.1.1 <== ICI : 1.1.1.1
PIHOLE_DNS_2=192.168.1.1 <== ICI : 1.1.1.1
QUERY_LOGGING=false
INSTALL_WEB_SERVER=false
INSTALL_WEB_INTERFACE=true
LIGHTTPD_ENABLED=false
WEBPASSWORD=
DHCP_ACTIVE=true
DHCP_START=192.168.1.20
DHCP_END=192.168.1.249
DHCP_ROUTER=192.168.1.1 <== ICI : 192.168.1.250
DHCP_LEASETIME=24
PIHOLE_DOMAIN=lan
DHCP_IPv6=false
DHCP_rapid_commit=false
BLOCKING_ENABLED=true
Le serveur DHCP est désormais configuré pour donner aux clients des adresses de passerelle par défaut et DNS corrects. Même s’ils n’auront pas pour l’instant retrouvé une connexion à Internet, vous pouvez valider cette étape en affichant les valeurs de ces paramètres sur un client connecté à votre Wi-Fi.
Dernière étape, router les paquets entre les deux interfaces réseau du serveur pour faire le lien entre le LAN et le Wi-Fi du voisin
Pour terminer d’alimenter le réseau local “à l’envers” avec la connexion généreusement prêtée, il faut que le serveur route les paquets entre ses interfaces réseau :
- Tous les paquets arrivant sur l’interface interne (filaire, enp1s0 chez moi) doivent être routés vers l’interface externe (Wi-Fi, wlp3s0 chez moi).
- Les paquets correspondants à une connexion déjà établie (-m state –state ESTABLISHED,RELATED) entrants sur l’interface externe doivent être transférés vers l’interface interne.
- Pour terminer, il faut activer le NAT : le serveur doit remplacer à la volée les adresses privées du réseau local vers des adresses publiques au moment de router les paquets dans un sens ou dans l’autre.
Ces opérations sont réalisées grâce aux trois lignes suivantes :
iptables -A FORWARD -i enp1s0 -o wlp3s0 -j ACCEPT
iptables -A FORWARD -i wlp3s0 -o enp1s0 -m state --state ESTABLISHED,RELATED -j
iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
Pour terminer, il faut activer dans le noyau le routage des paquets :
echo 1 > /proc/sys/net/ipv4/ip_forward
Bravo ! A ce stade, la connexion est normalement rétablie sur le réseau local : tous les périphériques peuvent à nouveau accéder à Internet comme si de rien n’était !
Malheureusement, le serveur est toujours inaccessible… Mais cela ne va pas durer !
A noter : certaines opérations ne sont pas persistantes après un redémarrage. J’ai donc créé un script, à exécuter au démarrage (grâce à cron ou rc.local) pour réaliser automatiquement toutes les actions décrites plus haut :
#!/bin/bash
# On arrête puis on redémarre la carte Wi-Fi
ifdown wlp3s0
ifup wlp3s0
# Grâce à wpa_supplicant, elle s'est connectée automatiquement au réseau du voisin
# On active le transfert de paquets entre les 2 interfaces du serveur ainsi que le NAT
iptables -A FORWARD -i enp1s0 -o wlp3s0 -j ACCEPT
iptables -A FORWARD -i wlp3s0 -o enp1s0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
# Le serveur doit utiliser un serveur DNS accessible
echo nameserver 1.1.1.1 > /etc/resolv.conf
# Comme au moins une interface réseau est configurée en statique, il faut ajouter manuellement à la table de routage la passerelle par défaut apportée par la connexion du voisin
ip route add default via 10.72.64.1