Monter une passerelle filaire + wifi avec un Raspberry Pi
Sommaire
La connectivité de votre box est perdue et votre FAI vous a gentiment prêté une clé 4G ? Super mais elle ne dispose pas d'une prise ethernet et tout votre LAN n'est pas en Wifi. Voyons comment configurer un Raspberry Pi en routeur pour que vos périphériques filaires puissent continuer à surfer.
État des lieux
Étant chez l'opérateur Orange, je dispose d'une Livebox 5 qui est bien suffisante dans un usage courant, voici sa configuration générale :
- ip fixe côté lan
192.168.1.1
- serveur
DHCP
activé, avec plage d'attribution d'ips de192.168.1.100
à192.168.1.200
- point d'accès
Wifi
activé
Quand soudain la panne
Un jour ma connexion se coupe: la box clignote dans tous les sens, le reboot ne donne rien et mon espace client m'indique un incident de quartier qui va durer la semaine !
Le truc sympa est que ce FAI peut me prêter une clé 4G de secours pendant toute la durée de l'intervention (et jusque 2 mois). Un aller-retour en boutique plus tard, j'allume la fameuse clé. Elle se nomme Airbox 4G
et possède une carte sim avec un quota de 200Go/mois.
Configuration initiale de l'airbox :
- ip fixe côté lan
192.168.1.1
- serveur
DHCP
activé, avec plage d'attribution de192.168.1.100
à192.168.1.200
- point d'accès
Wifi
Ça marche très bien (sous condition de couverture 4G), on se connecte au nouveau Wifi, on surfe sur le net...
Oui mais on a perdu l'accès à notre réseau local initial et nos périphériques filaires ne sont toujours pas connectés.
Nouvelle architecture
Pour réaliser mon projet j'ai à disposition un raspberry Pi 3 qui possède à la fois une prise ethernet et d'un module Wifi, on pourra donc s'en servir comme routeur, mais on va en plus s'en servir comme résolveur DNS récursif et serveur DHCP. On va couper le serveur DHCP de la livebox (il ne doit pas y avoir plusieurs serveurs DHCP au sein d'un même sous-réseau sous peine de conflit).
Nouvelle configuration de la airbox :
- migration vers le réseau
192.168.2.0/24
- ip fixe côté lan en
192.168.2.1
- serveur
DHCP
activé avec plage d'attribution de192.168.2.100
à192.168.2.200
- point d'accès
Wifi
toujours activé
Configuration du Raspberry Pi
- Raspberry Pi OS (basé sur Debian 12)
- ip fixe
192.168.1.2
sur l'interface filaireeth0
- ip fixe
192.168.2.2
sur l'interface sans filwlan0
Client DHCP
La configuration IP se décrit dans le fichier de configuration du client DHCP /etc/dhcp/dhcpcd.conf
1# Inform the DHCP server of our hostname for DDNS.
2hostname
3
4# Use the hardware address of the interface for the Client ID.
5clientid
6
7# Persist interface configuration when dhcpcd exits.
8persistent
9
10# Rapid commit support.
11# Safe to enable by default because it requires the equivalent option set
12# on the server to actually work.
13option rapid_commit
14
15# A list of options to request from the DHCP server.
16option domain_name_servers, domain_name, domain_search, host_name
17option classless_static_routes
18# Respect the network MTU. This is applied to DHCP routes.
19option interface_mtu
20
21# Most distributions have NTP support.
22#option ntp_servers
23
24# A ServerID is required by RFC2131.
25require dhcp_server_identifier
26
27# Generate SLAAC address using the Hardware Address of the interface
28#slaac hwaddr
29# OR generate Stable Private IPv6 Addresses based from the DUID
30slaac private
31
32interface eth0
33static ip_address=192.168.1.2/24
34#static routers=192.168.1.1 # bien commenter car la passerelle Livebox est HS
35static domain_name_servers=192.168.1.2
36
37interface wlan0
38static ip_address=192.168.2.2/24
39static routers=192.168.2.1
40static domain_name_servers=192.168.2.1
Pour scanner les réseaux Wifi accessibles et trouver les ESSID :
1# iwlist scan
2lo Interface doesn't support scanning.
3
4eth0 Interface doesn't support scanning.
5
6wlan0 Scan completed :
7 Cell 01 - Address: XX:XX:XX:XX:XX:XX
8 Channel:6
9 Frequency:2.437 GHz (Channel 6)
10 Quality=34/70 Signal level=-76 dBm
11 Encryption key:on
12 ESSID:"LE_NOM_DU_RESEAU_WIFI"
13 Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 6 Mb/s
14 9 Mb/s; 12 Mb/s; 18 Mb/s
15 Bit Rates:24 Mb/s; 36 Mb/s; 48 Mb/s; 54 Mb/s
16 Mode:Master
17 Extra:tsf=0000000000000000
18 Extra: Last beacon: 10ms ago
19 IE: Unknown: 000B416972626F785F37453738
20 IE: Unknown: 010882848B960C121824
21 IE: Unknown: 030106
22 IE: Unknown: 070646522006021E
23 IE: Unknown: 2A0100
24 IE: Unknown: 32043048606C
25 IE: Unknown: 2D1A2D101FFFFF000000000000000000000000000000000000000000
26 IE: Unknown: 3D1606000000000000000000000000000000000000000000
27 IE: IEEE 802.11i/WPA2 Version 1
28 Group Cipher : CCMP
29 Pairwise Ciphers (1) : CCMP
30 Authentication Suites (1) : PSK
31 IE: Unknown: DD180050F2020101800003A4000027A4000042435E0062322F00
32 IE: Unknown: DD1E00904C332D101FFFFF000000000000000000000000000000000000000000
33 IE: Unknown: DD1A00904C3406000000000000000000000000000000000000000000
34 IE: Unknown: DD0600E04C020160
Le paramétrage de la connexion sans fil est dans /etc/wpa_supplicant/wpa_supplicant.conf
1ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
2update_config=1
3country=FR
4
5network={
6 ssid="LE_NOM_DU_RESEAU_WIFI"
7 psk="LE_MOT_DE_PASSE_DU_RESEAU_WIFI"
8 mesh_fwding=1
9 scan_ssid=1 # opt
10 priority=100 # opt
11}
Un redémarrage du service réseau
1systemctl restart dhcpcd
Vous devriez avoir les 2 ips bien présentes, sur les 2 réseaux
1$ ip a | grep 192
2 inet 192.168.1.2/24 brd 192.168.1.255 scope global eth0
3 inet 192.168.2.2/24 brd 192.168.2.255 scope global noprefixroute wlan0
Serveur DNS
Nous voulons que notre serveur soit autonome sur la résolution des noms de domaines, qu'il puisse les mettre en cache ses requêtes, et que les clients du réseau local puissent s'y référer. On va donc installer bind
en tant que résolveur DNS récursif.
1apt install bind9
Paramétrage dans /etc/bind/named.conf.options
1options {
2 directory "/var/cache/bind";
3 dnssec-validation auto;
4 listen-on-v6 { any; };
5 allow-recursion { any; };
6};
Redémarrage du service
1systemctl restart bind9.service
Pour tester une résolution, on utilise la commande dig
(du paquet dnsutils
) :
1$ dig google.fr
2
3; <<>> DiG 9.18.16-1~deb12u1-Raspbian <<>> google.fr
4;; global options: +cmd
5;; Got answer:
6;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13745
7;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
8
9;; OPT PSEUDOSECTION:
10; EDNS: version: 0, flags:; udp: 1232
11; COOKIE: 0b079eec534e951f0100000064bcc2493b972410263ba3cc (good)
12;; QUESTION SECTION:
13;google.fr. IN A
14
15;; ANSWER SECTION:
16google.fr. 279 IN A 216.58.214.163
17
18;; Query time: 0 msec
19;; SERVER: 192.168.1.2#53(192.168.1.2) (UDP)
20;; WHEN: Sun Jul 23 07:01:45 BST 2023
21;; MSG SIZE rcvd: 82
Serveur DHCP
Maintenant on veut que ce serveur puisse attribuer les adresses IP et la configuration DNS aux machines du LAN connectées sur le réseau filaire.
1apt install isc-dhcp-server
Contenu de /etc/default/isc-dhcp-server
1INTERFACESv4="eth0"
Contenu de /etc/dhcp/dhcpd.conf
1# Bail de 24H
2default-lease-time 86400;
3
4# Bail maxi de 48H
5max-lease-time 172800;
6
7# this DHCP server to be declared valid
8authoritative;
9
10# specify network address and subnetmask
11subnet 192.168.1.0 netmask 255.255.255.0 {
12 range 192.168.1.100 192.168.1.200;
13 option broadcast-address 192.168.1.255;
14 option domain-name "rpi.home";
15 option domain-name-servers 192.168.1.2;
16 option routers 192.168.1.2;
17}
Pour redémarrer le service
1sudo systemctl restart isc-dhcp-server
Si utilisation d'un pare-feu sur le serveur, il faut ouvrir les bons ports
1systemctl enable --now dhcpd
2firewall-cmd --add-service=dhcp
3firewall-cmd --runtime-to-permanent
Routage
Pour que les paquets puissent être routés d'un réseau à l'autre, il faut explicitement autoriser ce transfert.
1echo net.ipv4.ip_forward = 1 > /etc/sysctl.d/30-ip-forward.conf
Puis on doit créer la règle MASQUERADE
suivante :
1iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
Pour rendre cette règle permanente au boot on peut la mettre dans /etc/rc.local
1/etc $ cat rc.local
2#!/bin/sh -e
3#
4# rc.local
5#
6# This script is executed at the end of each multiuser runlevel.
7# Make sure that the script will "exit 0" on success or any other
8# value on error.
9#
10# In order to enable or disable this script just change the execution
11# bits.
12#
13# By default this script does nothing.
14
15# Print the IP address
16_IP=$(hostname -I) || true
17if [ "$_IP" ]; then
18 printf "My IP address is %s\n" "$_IP"
19fi
20
21# règle de routage
22iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
23
24exit 0
Pour vérifier que la règle est bien appliquée, vérifiez la ligne MASQUERADE
de la chaune POSTROUTING
.
1$ sudo iptables -t nat -L
2Chain PREROUTING (policy ACCEPT)
3target prot opt source destination
4
5Chain INPUT (policy ACCEPT)
6target prot opt source destination
7
8Chain OUTPUT (policy ACCEPT)
9target prot opt source destination
10
11Chain POSTROUTING (policy ACCEPT)
12target prot opt source destination
13MASQUERADE all -- anywhere anywhere
Pour sécuriser mieux le pare-feu (todo: rendre la règle permanente)
1iptables -A FORWARD -i eth0 -j ACCEPT
2iptables -A FORWARD -o eth0 -j ACCEPT
Un reboot final du Raspberry Pi pour être sur que toutes les configurations sont bien appliquées.
La table de routage doit ressembler à ça :
1$ route
2Kernel IP routing table
3Destination Gateway Genmask Flags Metric Ref Use Iface
4default 192.168.2.1 0.0.0.0 UG 303 0 0 wlan0
5192.168.1.0 0.0.0.0 255.255.255.0 U 202 0 0 eth0
6192.168.2.0 0.0.0.0 255.255.255.0 U 303 0 0 wlan0
Connectivité retrouvée pour les appareils filaires !
Limites
les périphériques Wifi peuvent soit :
- se connecter sur le Wifi Livebox
- ils pourront accéder au lan (réseau 192.168.1.0)
- ils n'auront pas internet
- se connecter sur le Wifi Airbox
- ils auront internet
- ils n'auront pas accès au lan (réseau 192.168.1.0) car ils sont sur le réseau 192.168.2.0
Conclusion
Je me rends compte que le service Airbox Confort de l'offre Pro Orange permet de faire la même chose "juste en la branchant à la prise USB de la Livebox". Oui mais on est pas pro et on aurait moins appris 😎
L'architecture présentée me donne des idées pour me rendre moins dépendant d'une box particulière et rendre ma connexion internet domestique plus redondante.
Dédicace à Orange 🟧 pour le service rendu avec le prêt de cette clé de secours, je ne sais pas si les autres FAI proposent la même chose. Et à l'heure du télétravail c'est quand même important d'être confiant sur sa connectivité. 👌
Pas dédicace aux opérateurs d'infrastructure fibre de ma ville et à la jungle de la sous-traitance de ses techniciens. Est-ce que la panne que je subis est liée au raccordement fibre de mon voisin qui a eu lieu le même jour ? Coïncidence sans doute... 🙃