Problématique des ponts réseau multiples
Dans les systèmes Linux, les outils de virtualisation et de conteneurisation tels que LXC, Waydroid ou libvirt génèrent souvent des ponts réseau indépendants, ce qui entraîne une fragmentation des configurations réseau. Cela complique la gestion centralisée des paramètres tels que les adresses IP, les passerelles et les services DHCP. L'utilisation d'un pont personnalisé partagé par tous ces outils permet une administration simplifiée et une cohérence accrue.
Connexion des logiciels courants à un pont personnalisé
LXC
Pour les nouveaux conteneurs, modifiez le fichier ~/.config/lxc/default.conf en ajoutant ou en éditant la ligne :
lxc.net.0.link = pont_prive
Pour les conteneurs existants, localisez leur répertoire via la commande lxc-config lxc.lxcpath, puis éditez le fichier config dans le sous-dossier correspondant pour remplacer la valeur de lxc.net.0.link par le nom de votre pont (par exemple, pont_prive).
Waydroid
À partir de la version incluant le commit 5f808b2, Waydroid supporte les ponts gérés en externe. Éditez le fichier /var/lib/waydroid/lxc/waydroid/config et changez lxc.net.0.link pour pointer vers votre pont, par exemple pont_prive. Waydroid désactviera alors la gestion automatique de son propre pont.
libvirt
Pour les machines virtuelles gérées via virt-manager, dans les paramètres de l'interface réseau, sélectionnez "Périphérique ponté" et spécifiez le nom de votre pont (ex. : pont_prive). Pour une configuration XML manuelle, utilisez :
<interface type='bridge'>
<source bridge='pont_prive'/>
</interface>
Création du pont avec systemd-networkd et nftables
Étape 1 : Défiintion du périphérique pont
Créez le fichier /etc/systemd/network/pont_prive.netdev avec le contenu suivant :
[NetDev]
Name=pont_prive
Kind=bridge
Cela crée un périphérique de niveau 2 (comme un commutateru réseau).
Étape 2 : Configuration réseau et serveur DHCP
Créez /etc/systemd/network/pont_prive.network pour définir les paramètres :
[Match]
Name=pont_prive
[Link]
ARP=yes
[Network]
Address=10.0.50.1/24
DHCPServer=yes
Address=fd12::1/64
IPv6SendRA=yes
DHCPPrefixDelegation=yes
MulticastDNS=yes
ConfigureWithoutCarrier=yes
[DHCPServer]
DNS=10.0.50.1
PoolOffset=10
PoolSize=80
[IPv6SendRA]
DNS=fd12::1
[IPv6Prefix]
Prefix=fd12::/64
PreferredLifetimeSec=7200
ValidLifetimeSec=14400
Ajoutez également dans /etc/systemd/resolved.conf :
DNSStubListenerExtra=10.0.50.1
Redémarrez les services pour appliquer les modifications :
sudo systemctl restart systemd-networkd systemd-resolved
Étape 3 : Mise en place du NAT avec nftables
Pour permettre l'accès à Internet aux appareils connectés au pont, configurez les règles de traduction d'adresses réseau. Éditez /etc/nftables.conf :
table inet nat {
chain forward {
type filter hook forward priority filter; policy drop;
ct state vmap { established : accept, related : accept, invalid : drop }
iifname "pont_prive" accept
}
chain postrouting {
type nat hook postrouting priority srcnat;
iifname "pont_prive" oifname != "pont_prive" masquerade
}
}
Activez et démarrez le service nftables :
sudo systemctl enable --now nftables.service
Assurez-vous que le transfert IP est activé dans le noyau :
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-forward.conf
sudo sysctl --system