🖧 RĂ©seau moderne sous linux: 1.Quelques astuces avec networkd

| ~ 5 mins | 1022 mots

Dans cette nouvelle sĂ©rie d’articles, je vais parler de configuration rĂ©seau sous linux avec des outils modernes Gnu/Linux.

Dans ces premiers partis, je vais simplement prĂ©senter des astuces de configuration networkd, que j’ai dĂ©couvert en passant beaucoup de temps dans la documentation, et parfois Ă  l’aide de quelques articles de blog ou autre.

Personnellement, j’aime beaucoup networkd mĂȘme si je trouve la documentation un peu difficile d’accĂšs, l’internet ne contient pas assez d’exemple et d’article de blog Ă  mon goĂ»t permettant de facilement trouver la solution Ă  son problĂšme, il faut donc parfois passer un temps non nĂ©gligeable Ă  creuser la documentation.

1.Activer Mdns

Pour accĂ©der localement facilement aux machines via les adresse en nomdemachine.local, il est utile d’avoir mdns d’activĂ© , pour cela si vous utilisez systemd-networkd, vous aurez besoin d’installer systemd-resolved et de vĂ©rifier qu’il est actif.

sudo apt install systemd-resolved
resolvectl

Si vous constater que mdns est dĂ©sactivĂ© sur votre interface (avec un rĂ©sultat de commande contenant‑mDNS), il faut ajuster la configuration globale de resolved et/ou ajuster la configuration de l’interface:

Pour la configuration globale, vous devez créer un fichier :

# /etc/systemd/resolved.conf.d/99-enable-mdns.conf
[Resolve]
MulticastDNS=yes
# protocole similair Ă  MDNS mais qui semble de moins en moins en usage
LLMNR=no

Pour la configuration spĂ©cifique de l’interface, il vous faudra dans le fichier .network :

# /etc/systemd/network/moninterface.network
...
[Network]
# Activer mdns (les addresse en .local)
MulticastDNS=yes

Note: ce dernier Ă©lĂ©ment est un exemple, pas un vrai fichier .network fonctionnel, vous aurez besoin d’une directive [Match]

2.Renommer une interface

Dans un cas simple oĂč vous avez une interface ethernet non usb, il est aisĂ© de renommer son interface via un fichier .link :

# /etc/systemd/network/lan0.link
[Match]
MACAddress=00-00-5E-00-53-01

[Link]
# le nouveau nom
Name=lan0

comme vu prĂ©cĂ©demment le cas de pĂ©riphĂ©rique USB est plus compliquĂ©, certaines cartes change d’addresses mac Ă  chaque connection tandis que certain conservent leur addresses mac.

La configuration des distributions peut changer les choses aussi. Ainsi, sous Debian Trixie, il peut ĂȘtre nĂ©cessaire de surcharger 73-usb-net-by-mac.link , pour Ă©viter que le systĂšme renomme nos interfaces USB et ainsi nous permettre nous mĂȘme de les modifier.

3. Switch Virtuel et virtualisation des interfaces

Il peut se trouver que les interface physiques ne correspondent pas exactement au rĂ©seau que vous voudriez obtenir :

Ces ajustements sont possible via systemd-networkd.

PrĂ©nons un cas d’usage oĂč l’on veut vĂ©ritablement sĂ©parer les interfaces rĂ©seau utiliser des interfaces physiques rĂ©elles :

Switch Virtuel et Macvlan

Le switch virtuel

Il suffit de créer une interface pont :

# /etc/systemd/network/vslan.netdev
[NetDev]
Name=vslan
Kind=bridge

On attache un par un les ports lan Ă  ce pont, par exemple pour lan0 :

# /etc/systemd/network/lan0.network
[Match]
Name=lan0

[Network]
Bridge=vslan

Il faut rĂ©pĂ©ter cette Ă©tape pour les autres ou utiliser un pattern par exemple : Name=lan*.

À partir de cette Ă©tape, si vous redĂ©marrez networkd ou toute la machine, vous avez bel et bien un switch virtuel.

MacVlan : plusieurs interfaces virtuelles réseau de niveau 2

Pour avoir plusieurs addresses sur la machine, au niveau 2, c’est-Ă -dire que chaque machine aura une interface avec une adresse mac dĂ©diĂ© et sera donc virtuellement totalement sĂ©parĂ©es, on utilise une fonctionnalitĂ© appelĂ©e MACVLAN.

Une limitation de ce mĂ©canisme sous 🐧 Linux est que l’interface parente ne peut pas communiquer avec l’interface enfant, ainsi si j’avais une interface eth0 que je sĂ©parerais par MACVLAN en virt10@eth0 et virt2@eth0 et que j’attribuerais des addresses Ă  ces 3 interfaces, eth0 ne pourrait communiquer avec virt10@eth0 et virt10@eth1 et inversement.

L’astuce pour contourner le problĂšme dans notre cas, est simplement :

On configure ce pont pour fournir des macvlan pour nos adresses virtuelles :

# /etc/systemd/network/vslan.network
[Match]
Name=vslan

[Network]
MACVLAN=vslan1
MACVLAN=vslan2
ConfigureWithoutCarrier=yes

# désactiver la récupÚration/génération d'addresse en ipv6 et ipv4
IPv6AcceptRA=no
LinkLocalAddressing=no
DHCP=no

Il nous manque plus que les interfaces virtuelles MACLAN, ça se fait Ă  l’aide de 2 fichiers. Par exemple pour vslan1, on dĂ©finit notre macvlan :

# /etc/systemd/network/vslan1.netdev
[NetDev]
Name=vslan1
Kind=macvlan

[MACVLAN]
Mode=bridge

On peut ensuite configurer l’interface vslan1:

# /etc/systemd/network/vslan1.network
[Match]
Name=vslan1

[Network]
# Activer mdns (les addresse en .local)
MulticastDNS=yes

# Activer la récupÚration d'ip via le dhcp utile pour ipv4
DHCP=yes

# La rĂ©cupĂšration d'addresse ipv6 est ici implicite (valeur par dĂ©faut), mais il est possible d'ĂȘtre explicite:
# IPv6AcceptRA=yes
# LinkLocalAddressing=yes

# il est possible d'assigner si besoin manuellement une addresse ULA (locale) en plus de l'addresse globale obtenu
# via le routeur.
# un des avantages et que l'addressage ne changera pas mĂȘme en cas de coupure de l'internet/changement du prefixe globale
# assigné. Il faut néanmoins ajuster le réseau et les autres machine pour que la connectivité suivent. Par défault, sur
# mon réseau, mon routeur ne "route" pas ces addresse. il faut donc que les différence machine soit assigné avec des
# ipv6 ULA du mĂȘme sous rĂ©seau /64 ou ajuster le routeur en consĂ©quence.
# Address=fd70::b/64

[IPv6AcceptRA]
# Optionel: cela force le suffixe de l'ip globale généré. C'est pertinent amha pour des machine dont l'ipv6 devra
# ĂȘtre indiquĂ© dans des enregistrement dns AAAA.
Token=::b

Il vous suffira ensuite de donner l’autre interface vslan2 Ă  votre conteneur/machine virtuel avec les outils dĂ©diĂ©s.

Interface avec systemd-nspawn

Note : Si vous utilisez systemd-nspawn, vous pouvez aussi utiliser la directive MACVLAN qui vous permet de dĂ©lĂ©guer la crĂ©ation de l’interface.

# /etc/systemd/nspawn/container.nspawn
[Network]
Private=yes

# Solution basique : délégation de l'interface créer exprÚs pour le conteneur
Interface=vslan2

# Solution alternative, laissez nspawn gérer la création d'une interface MACVLAN à partir de vslan 
# l'interface s'appelera "lan" à l'intérieur.
# MACVLAN=vslan:lan

Allez plus loin

L’article suivant de cette sĂ©rie est Ă  propos de rĂ©aliser un Routeur avec networkd.