« Le routeur en tête réseau PI » : différence entre les versions

De knowledge
Aller à la navigation Aller à la recherche
mAucun résumé des modifications
Ligne 372 : Ligne 372 :
       valid_lft forever preferred_lft forever
       valid_lft forever preferred_lft forever
</syntaxhighlight>L'état est passé à BROADCAST et state UP
</syntaxhighlight>L'état est passé à BROADCAST et state UP
==== Un petit dashboard sur la console ====
Un petit script permet d'avoir les info essentielles :<syntaxhighlight lang="bash">
#!/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
</syntaxhighlight>Si on le lance:<syntaxhighlight lang="text">
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
</syntaxhighlight>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...<syntaxhighlight lang="bash">
vi ~/.profile
</syntaxhighlight>Et on ajoute à la fin:<syntaxhighlight lang="bash">
if [ -n "$SSH_CONNECTION" ]; then
    echo "Welcome to SSH users"
else
    tput civis        # Hide carret
    ./router-dash.sh 
    tput cnorm        # Show carret
fi
</syntaxhighlight>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.
Il faut simplement éditer le fichier: <code>/etc/dnsmasq.d/lan.conf</code>
sudo vi /etc/dnsmasq.d/lan.conf
Et ajouter/modifier la ligne :
dhcp-host=b8:27:ee:cc:f9:ac,10.11.11.10,database
Le serveur "<code>database</code>" dont l'adresse MAC est <code>b8:27:ee:cc:f9:ac</code> se verra systématiquement affecté l'adresse <code>10.11.11.10</code>. Pour que le serveur prenne en compte le changement il faut relancer <code>dnsmasq</code>
sudo systemctl restart dnsmasq
Et c'est tout.

Version du 3 décembre 2025 à 23:55

Présentation

La première étape sera de créer ce qui sera la tête du réseau.

Datacenter-schema-front.png

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/

Datacenter-sd-1.png

On choisit le modèle (moi c'est un raspberry PI 2 y'a pas besoin de mieux). Puis "SUIVANT"

Datacenter-sd-2.png

On ne veut pas de "desktop" on choisit "Raspberry PI OS (other)

Datacenter-sd-3.png

On choisit la dernière version sans desktop puis "SUIVANT"

Datacenter-sd-4.png

Moi j'ai qu'un seul port SD il n'y a pas d'ambiguïté je le sélectionne puis "SUIVANT"

Datacenter-sd-5.png

On donne le nom à notre serveur puis "SUIVANT"

Datacenter-sd-6.png

On donne la localisation puis "SUIVANT"

Datacenter-sd-7.png

On définit le nom de l'utilisateur et son mot de passe puis "SUIVANT"

Datacenter-sd-8.png

On peut ignorer le wifi dans notre cas (un raspberry PI 2 n'est pas équité!) "SUIVANT"

Datacenter-sd-9.png

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"

Datacenter-sd-10.png

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"

Datacenter-sd-11.png

On a un dernier récapitulatif. "WRITE".

Datacenter-sd-12.png

Oui je comprends, on efface et on flashe la carte!

Datacenter-sd-13.png

Ca s'écrit... si une fenêtre proposant de formater la carte s'ouvre... fermez là.

Datacenter-sd-14.png

Apres avoir écrit la carte, on la vérifie (c'est indispensable pour être sûr de la qualité de la carte)

Datacenter-sd-15.png

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"

Raspi-config.png

Dans 1 "System options" choisir S6 "Autologin"

Raspi-config-autologin.png

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

L'écran Adafruit 2.8 pouces

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 statique 10.11.11.1/24 – passerelle du LAN.
  • Serveur DHCP via dnsmasq : plage 10.11.11.100–10.11.11.200, passerelle 10.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.

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.10,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.10. Pour que le serveur prenne en compte le changement il faut relancer dnsmasq

sudo systemctl restart dnsmasq

Et c'est tout.