« Le routeur en tête réseau PI » : différence entre les versions
Balises : Révoqué Éditeur visuel |
Balises : Révocation manuelle Éditeur visuel |
||
| Ligne 259 : | Ligne 259 : | ||
</syntaxhighlight>et on voit du bruit sur l'écran. | </syntaxhighlight>et on voit du bruit sur l'écran. | ||
=== La configuration du | === La configuration du réseau === | ||
Les Raspberry PI ne sont malheureusement équipés que d'un seul port Ethernet. Il faut en ajouter un autre sur l'un des ports USB. | Les Raspberry PI ne sont malheureusement équipés que d'un seul port Ethernet. Il faut en ajouter un autre sur l'un des ports USB. | ||
Version du 5 décembre 2025 à 22:53
Présentation
La première étape sera de créer ce qui sera la tête du réseau.
Schématiquement on a un raspberry PI en frontal. Il n'a en aucun cas besoin de wifi donc un simple Raspbery PI2 sera suffisant.
En revanche il lui faudra deus "pattes" réseau donc un adaptateur USB - Ethernet sera nécessaire. De plus un écran Adafruit 2.8' sera utilisé pour le "status".
Architecture réseau:
- eth0 (le port Ethernet standard) sera relié au WAN en tant que client DHCP. C'est sur le routeur auquel il est relié que le serveur DHCP attribuera (ou pas) une IP fixe.
- eth1 (le port Ethernet sur USB) sera relié au LAN. Il sera configuré en serveur DHCP et s'occupera du sub-net 10.11.11.0/24. Les autres raspberry seront reliés à ce port via un switch.
Derrière on aura toute sorte de serveurs basés sur des raspberry PI du genre:
- Serveur node-red
- Serveur MariaDB
- Serveur MediaWiki
- ce dont on aura besoin...
Modules installés
Sur ce serveur "front" on aura donc installé:
- Un serveur DHCP pour eth1
- Un serveur ssh sur eth0 et eth1 utilisé comme "rebond"
- Un reverse proxy pour faire suivre les demandes vers les serveurs sur le "LAN 10.11.11"
- Un broker MQTT ouvert sur eth0 et eth1
- Un driver d"écran Adafruit é.8'
Installation
La carte SD
On utilise Raspberry Pi Imager https://www.raspberrypi.com/software/
On choisit le modèle (moi c'est un raspberry PI 2 y'a pas besoin de mieux). Puis "SUIVANT"
On ne veut pas de "desktop" on choisit "Raspberry PI OS (other)
On choisit la dernière version sans desktop puis "SUIVANT"
Moi j'ai qu'un seul port SD il n'y a pas d'ambiguïté je le sélectionne puis "SUIVANT"
On donne le nom à notre serveur puis "SUIVANT"
On donne la localisation puis "SUIVANT"
On définit le nom de l'utilisateur et son mot de passe puis "SUIVANT"
On peut ignorer le wifi dans notre cas (un raspberry PI 2 n'est pas équité!) "SUIVANT"
On s'arrête un peut sur cette page.
On a définit un login que n'est pas "pi" mais qui peut être aisément trouvé. Notre mot de passe est sûrement très sécurisé mais toujours faillible. Comme le routeur sera probablement acessible de l'extérieur il est nécessaire, a mon avis, de sécuriser le process de login ssh par une clé. J'ai mis la clé publique du PC que j'utilise habituellement pour la maintenance. Une seconde clé pourra être ajouté ultérieurement.
"SUIVANT"
Je ne penses pas que ce soit nécessaire d'utiliser Pi Connect, d'autant plus que le PI devra être le moins chargé possible. "SUIVANT"
On a un dernier récapitulatif. "WRITE".
Oui je comprends, on efface et on flashe la carte!
Ca s'écrit... si une fenêtre proposant de formater la carte s'ouvre... fermez là.
Apres avoir écrit la carte, on la vérifie (c'est indispensable pour être sûr de la qualité de la carte)
C'est terminé. On peut soit en faire une seconde (un backup? mais il faudrait plutôt faire la copie après les étapes suivantes). "FINISH"
La carte est prête on peut lancer le premier boot.
On insère la carte dans le PI2 en question. On y branche un clavier et un écran (ne pas brancher l'adaptateur USB Ethernet la première fois) et GO! On blanche le courant.
Premier boot
Il boote correctement.
Moi il bloque un moment sur Network Manager mais continue (je penses que c'est eth1 sur le port USB qui n'est relié a rien qui le gène)
Il boote normalement, affiche la progression sur la console sur l'écran HDMI.
La fin est un succinct :
[ OK ] Reached target cloud-init.target - Cloud-init target.
Et rien ne se passe. C'est normal, pas de panique.
La console à l'écran se limite à... la console de base pour voir les erreurs. Pour se loguer il y a deux solutions :
- Par ssh depuis une autre machine
- en allant sur une autre console de login "hardware" grâce a <ctrl> + <F2> jusqu'à <F6>. La première <ctrl> <F1> sera toujours là ou seront affichés les messages.
On va configurer les trucs de base.
raspi-config
On lance le programme "raspi-config". On a fait beaucoup du travail au moment de la préparation de la carte SD mais il en reste un peu.
sudo raspi-config
On a le "classique"
Dans 1 "System options" choisir S6 "Autologin"
Selectionner <Yes> qui nous réponds "Console autologin is enabled".
Oui si quelqu'un rentre chez nous, branche un écran et un clavier sur la machine il sera logué automatiquement... c'est un risque que je prends car, comme ces machines marchent très bien et durent des années il m'arrive d'oublier leur mot de passe.
Dans 6 "Advanced Options" on choisit A1 "Expand Filesystem"
Et le PI nous réponds :
Root partition has been resized.
The filesystem will be enlarged upon the next reboot
On valide par <OK>
Au cas ou on lance un 8 "Update" mais si on vient de faire la carte il ne doit pas se passer grand chose.
On branche l'adaptateur USB Ethernet et on reboote
sudo reboot
on voit le shutdown se dérouler sur la console et le redémarrage.
Le boot bloque un moment sur le démarrage du network manager sur eth1 mais on peut utiliser le serveur quand même.
On peut vérifier que le "resize filesystem" est bien passé:
df -h /
Filesystem Size Used Avail Use% Mounted on
/dev/mmcblk0p2 229G 2.6G 217G 2% /
J'ai utilisé une carte de 256 Go on y est presque!
Configuration de l'écran
Adafuit le fabricant de l'écran donnait autrefois une distribution spécifique pour cet écran. C'était rapide mais pas très "propre".
Maintenant il y a un script python pour faire ce travail. Adafuit donne le process ici: https://learn.adafruit.com/adafruit-2-8-pitft-capacitive-touch/easy-install-2
Je suis bon camarade je donne ici la méthode.
Installation des outils
Il faut d'abord installer les outils python de virtualisation d'environnement.
sudo apt install python3-venv
python -m venv env --system-site-packages
source env/bin/activate
Ensuite on installe le script qui installera lui même l'écran.
cd ~
sudo apt-get update
sudo apt-get install -y git python3-pip
pip3 install --upgrade adafruit-python-shell click Flask-SQLAlchemy
git clone https://github.com/adafruit/Raspberry-Pi-Installer-Scripts.git
cd Raspberry-Pi-Installer-Scripts
Bon je penses que certains apt-get install sont superflus mais je ne prends pas de risques.
Installation elle même
Ici chez Adafruit donne une instruction pour chaque modèle d'écran.
Pour l'écran 2.8'' capacitif :
sudo -E env PATH=$PATH python3 adafruit-pitft.py --display=28c --rotation=90 --install-type=console
SI j'avais utilisé la version résistive
sudo -E env PATH=$PATH python3 adafruit-pitft.py --display=28r --rotation=90 --install-type=console
Ca se termine
PITFT Updating console to PiTFT...
Remove fbcp from /etc/rc.local, if it's there...
Configuring boot/config.txt for default HDMI
Installing console fbcon map helper...
Installing console fbcon map service...
PITFT Created symlink '/etc/systemd/system/multi-user.target.wants/con2fbmap.service' → '/etc/systemd/system/con2fbmap.service'.
PITFT Job for con2fbmap.service failed because the control process exited with error code.
See "systemctl status con2fbmap.service" and "journalctl -xeu con2fbmap.service" for details.
Turning off console blanking
Setting raspi-config to boot to console w/o login...
PITFT Success!
Settings take effect on next boot.
REBOOT NOW? [Y/n] Reboot started...
Connection to 192.168.0.77 closed by remote host.
Connection to 192.168.0.77 closed.
En rebootant le PI.
Et l'écran est actif.
Un dernier problème: Lorsque on reboote sans l'écran HDMI... l'écran LCD ne marche pas c'est ballot
Fichier config.txt
On l'édite avec
sudo vi /boot/firmware/config.txt
Et on y trouves
# --- added by adafruit-pitft-helper ---
[all]
hdmi_force_hotplug=0
dtparam=spi=on
dtparam=i2c1=on
dtparam=i2c_arm=on
dtoverlay=pitft28-capacitive,rotate=90,speed=64000000,fps=30,drm
# --- end adafruit-pitft-helper ---
Alors qu'avec :
# --- added by adafruit-pitft-helper ---
[all]
hdmi_force_hotplug=0
dtparam=spi=on
dtparam=i2c1=on
dtparam=i2c_arm=on
dtoverlay=pitft28-capacitive,rotate=270,speed=64000000,fps=30,drm
hdmi_force_hotplug=1
hdmi_group=2
hdmi_mode=82
dtoverlay=gpio-key,gpio=17,keycode=105,label="BTN1"
dtoverlay=gpio-key,gpio=22,keycode=106,label="BTN2"
dtoverlay=gpio-key,gpio=23,keycode=107,label="BTN3"
dtoverlay=gpio-key,gpio=27,keycode=108,label="BTN4"
# --- end adafruit-pitft-helper ---
C'est mieux et en plus on peut gérer les 4 boutons de droite.
J'ai ai profité pour retourner l'écran (rotate=270) car avec un rotatate=90 les boutons sont a gauche.
Le fichier cmdline.txt
Toujours pour le modifier:
sudo vi /boot/firmware/cmdline.txt
On y trouve
console=serial0,115200 console=tty1 root=PARTUUID=b104592a-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=FR
On supprime la "sérial console" et on active fbcon.
console=tty1 fbcon=map:10 root=PARTUUID=b104592a-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=FR
On reboote et ca marche! Même sans l'écran HDMI. Dans tous les cas on peut acceder au frame buffer sur /dev/fb1 pour la carte écran LCD.
cp /dev/random /dev/fb1
et on voit du bruit sur l'écran.
La configuration du réseau
Les Raspberry PI ne sont malheureusement équipés que d'un seul port Ethernet. Il faut en ajouter un autre sur l'un des ports USB.
Cependant ce n'est pas catastrophique. Le port eth0 est lui aussi un device USB sauf qu'il est soudé sur la carte.
Lorsque je banche mon adaptateur réseau sur un prise USB, j'ai dans dmesg :
[ 67.026854] usb 1-1.4: new high-speed USB device number 5 using dwc_otg
[ 67.132758] usb 1-1.4: New USB device found, idVendor=0b95, idProduct=1790, bcdDevice= 2.00
[ 67.132807] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 67.132831] usb 1-1.4: Product: AX88179B
[ 67.132851] usb 1-1.4: Manufacturer: ASIX
[ 67.132869] usb 1-1.4: SerialNumber: 004132D3
[ 67.275834] usbcore: registered new interface driver cdc_ether
[ 67.323914] cdc_ncm 1-1.4:2.0: MAC-Address: 9c:69:d3:41:32:d3
[ 67.323953] cdc_ncm 1-1.4:2.0: setting rx_max = 16384
[ 67.324279] cdc_ncm 1-1.4:2.0: setting tx_max = 16384
[ 67.325521] cdc_ncm 1-1.4:2.0 eth1: register 'cdc_ncm' at usb-3f980000.usb-1.4, CDC NCM (NO ZLP), 9c:69:d3:41:32:d3
[ 67.325863] usbcore: registered new interface driver cdc_ncm
[ 67.346165] usbcore: registered new interface driver cdc_wdm
[ 67.352494] usbcore: registered new interface driver cdc_mbim
Avec ifconfig j'ai bien deux interfaces:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.X.XX netmask 255.255.255.0 broadcast 192.168.X.255
inet6 fe80::xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x20<link>
inet6 2a01:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx prefixlen 64 scopeid 0x0<global>
ether b8:27:eb:1c:05:fc txqueuelen 1000 (Ethernet)
RX packets 340 bytes 39348 (38.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 266 bytes 78263 (76.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 9c:69:d3:41:32:d3 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth0 est bien en DHCP sur mon routeur lui même connecté sur internet.
eth1 est disponible. Configurons la.
Notre objectif:
eth1(USB‑Ethernet) en IP statique10.11.11.1/24– passerelle du LAN.- Serveur DHCP via
dnsmasq: plage10.11.11.100–10.11.11.200, passerelle10.11.11.1. - Routage IPv4 activé et NAT (masquerade) avec
nftables.
SI l'adaptateur Ethernet n'a pas été détecté en tant que eth1 il faudra changer cette valeur dans les commandes qui suivent.
On entre les commandes:
sudo nmcli con add type ethernet ifname eth0 con-name wan ipv4.method auto ipv6.method ignore
sudo nmcli con add type ethernet ifname eth1 con-name lan ipv4.method manual ipv4.addresses 10.11.11.1/24 ipv4.never-default yes ipv6.method ignore
sudo nmcli con up wan
sudo nmcli con up lan
DHCP (dnsmasq)
On entre les commandes
sudo apt install -y dnsmasq
sudo tee /etc/dnsmasq.d/lan.conf >/dev/null <<'EOF'
interface=eth1
bind-interfaces
domain-needed
bogus-priv
dhcp-range=10.11.11.100,10.11.11.200,255.255.255.0,24h
dhcp-option=option:router,10.11.11.1
EOF
sudo systemctl enable --now dnsmasq
Ca y est notre serveur DHCP est fonctionnel.
Routage IPv4 et NAT
Il faut maintenant orchestrer le routage entre eth0 et eth1.
On active le routage:
echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.conf
sudo sysctl -p /etc/sysctl.d/99-ip-forward.conf
On configure nftables:
sudo tee /etc/nftables.conf >/dev/null <<'EOF'
flush ruleset
table inet filter {
chain input { type filter hook input priority 0; policy accept; }
chain output { type filter hook output priority 0; policy accept; }
chain forward { type filter hook forward priority 0; policy drop;
ct state established,related accept
iif "eth1" oif "eth0" accept
}
}
table ip nat {
chain postrouting { type nat hook postrouting priority 100;
oif "eth0" masquerade
}
}
EOF
sudo systemctl enable --now nftables
On vérifie par :
ip addr show eth1
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 9c:69:d3:41:32:d3 brd ff:ff:ff:ff:ff:ff
inet 10.11.11.1/24 brd 10.11.11.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
Bon il n'est relié a rien (NO-CARRIER et state DOWN) mais il a bien une adresse IP correcte. SI je branche mon PC dessus j'ai bien :
ip addr show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 9c:69:d3:41:32:d3 brd ff:ff:ff:ff:ff:ff
inet 10.11.11.1/24 brd 10.11.11.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::9e69:d3ff:fe41:32d3/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
L'état est passé à BROADCAST et state UP
Un petit dashboard sur la console
Un petit script permet d'avoir les info essentielles :
#!/bin/bash
printf "\e[2J"
while [ 1 ]
do
printf "\e[1;1H"
date
echo "-----------------------------------------------"
echo -n "Routeur WAN IP: "
ifconfig eth0 | grep "inet " | awk '{print $2}'
echo -n "LAN Gateway : "
ifconfig eth1 | grep "inet " | awk '{print $2}'
echo "-----------------------------------------------"
echo "LAN Clients: "
cat /var/lib/misc/dnsmasq.leases | awk '{print $2,$3,$4}'
sleep 1
done
Si on le lance:
Thu 4 Dec 00:49:47 CET 2025
-----------------------------------------------
Routeur WAN IP: 192.168.X.X
LAN Gateway : 10.11.11.1
-----------------------------------------------
LAN Clients:
d8:3a:dd:d8:XX:XX 10.11.11.XXX database
dc:a6:32:67:XX:XX 10.11.11.XXX main-host
b8:27:eb:e1:XX:XX 10.11.11.XXX test
Le plus élégant serait que ce script se lance sur le petit écran LCD du PI au démarrage. Facile on a configuré l'autologin...
vi ~/.profile
Et on ajoute à la fin:
if [ -n "$SSH_CONNECTION" ]; then
echo "Welcome to SSH users"
else
tput civis # Hide carret
./router-dash.sh
tput cnorm # Show carret
fi
Sur la console principale (l'écran LCD adafruit) il est toujours possible de sortir du dashboard avec <Ctrl> + C
Administration
Une fois installé voici les opérations d'administrations possibles.
Gestion de l'allocation d'IP fixes en DHCP
Autant je sous traite l'adresse du routeur lui même sur sa "patte" eth0 au routeur qui lui est supérieur (ma box par exemple) autant, pour les machines branchées sur eth1 il peut être intéressant de leur donner une IP fixe.
On peut rendre l'IP statique sur le client mais le plus propre est de laisser le client en DHCP mais reconnaitre l'adresse MAC du client et configurer le serveur DHCP pour lui donner TOUJOURS la même IP.
Par exemple je voudrais que mon serveur de base de données appelé dadabase possède l'adresse IP 10.11.11.50
Je relève son adresse mac sur le dashboard:
Pour le moment on lui a donné:
b8:27:ee:cc:f9:ac 10.11.11.171 database
Il faut simplement éditer le fichier: /etc/dnsmasq.d/lan.conf
sudo vi /etc/dnsmasq.d/lan.conf
Et ajouter/modifier la ligne :
dhcp-host=b8:27:ee:cc:f9:ac,10.11.11.50,database
Le serveur "database" dont l'adresse MAC est b8:27:ee:cc:f9:ac se verra systématiquement affecté l'adresse 10.11.11.50. Pour que le serveur prenne en compte le changement il faut relancer dnsmasq
sudo systemctl restart dnsmasq
Et c'est tout.