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 de 192.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 !

Livebox qui clignote, la hantise de tous les internautes

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 de 192.168.1.100 à 192.168.1.200
  • point d'accès Wifi

Airbox 4G

Ç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 de 192.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 filaire eth0
  • ip fixe 192.168.2.2 sur l'interface sans fil wlan0

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... 🙃

Ressources

comments powered by Disqus