Skip to content

Gestion réseau Linux

Le document Util-Linux présente la gestion des flux utilisé par des processus et la découverte des machines sur le réseau.

Configuration de base

Sans Network Manager

Vérifier le nom et l'état de l'interface :

ip a

Activer l'interface (la passer en "UP") :

sudo ip link set en1ps0 up

Obtenir une adresse IP : Le simple fait d'activer l'interface ne vous connecte pas ; il faut une configuration IP. * Via DHCP (automatique, le plus courant) :

sudo dhclient en1ps0
(Note : Si dhclient n'est pas installé, essayez dhcpcd en1ps0).

*   **Configuration statique (si pas de DHCP) :**
    ```bash
    sudo ip addr add 192.168.1.XX/24 dev en1ps0
    sudo ip route add default via 192.168.1.1
    ```

Avec Network Manager

Voire le status des connexion

nmcli device status

Activer une connexion :

nmcli connection up id "NomConnexion"

Ajouter une connexion DHCP :

nmcli connection add type ethernet con-name "MaConnexion" ifname en1ps0

Configuration statique :

nmcli connection modify "MaConnexion" ipv4.addresses 192.168.1.XX/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8" ipv4.method manual
nmcli connection up "MaConnexion"

Résolution de nom

resolvconf

sudo apt install resolvconf
sudo nano /etc/resolvconf/resolv.conf.d/head

Les fichiers dans /etc/resolvconf/resolv.conf.d/ sont assemblés pour générer le fichier /etc/resolv.conf final : 1. head : Le contenu est placé tout en haut (priorité maximale). 2. (Données dynamiques) : Les DNS fournis par votre routeur/DHCP arrivent ensuite. 3. tail : Le contenu est ajouté à la fin (serveurs de secours).

En ajoutant votre ligne nameserver X.X.X.X à la suite du texte existant dans head, ce serveur sera toujours le premier interrogé, quel que soit le réseau auquel vous vous connectez.

On peut en rajouter plusieurs dans le head.

sudo cat /etc/resolvconf/resolv.conf.d/head
nameserver 1.1.1.1
nameserver 1.0.0.1

Pour voir la configuration actuelle :

sudo resolvconf -u

systemd-resolved

systemd-resolved est un service système qui fournit la résolution de noms de réseau aux applications locales.

Vérifier l'état et la configuration actuelle :

resolvectl status

Tester la résolution d'un nom :

resolvectl query google.com

Lien symbolique recommandé pour /etc/resolv.conf : Pour que les applications utilisent le stub local de systemd-resolved :

sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

Vider le cache DNS :

sudo resolvectl flush-caches

Configurer des DNS statiques : Éditer le fichier /etc/systemd/resolved.conf :

[Resolve]
DNS=1.1.1.1 8.8.8.8
FallbackDNS=1.0.0.1 8.8.4.4
Puis redémarrer le service :
sudo systemctl restart systemd-resolved

Tailscale

Installation Debian

sudo apt install curl
curl -fsSL https://pkgs.tailscale.com/stable/debian/bullseye.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null
curl -fsSL https://pkgs.tailscale.com/stable/debian/bullseye.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list
sudo apt update
sudo apt install tailscale
sudo tailscale up --accept-routes --accept-dns=false --stateful-filtering=false

Vous êtes connecté

tailscale ip -4

Configuration avancé

Si le périphérique qu'on à ajouté est un serveur ou un périphérique accessible à distance, on doit de désactiver l’expiration de la clé pour éviter d’avoir à vous authentifier périodiquement.

Ajouter une route :

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo tailscale up --advertise-routes=10.3.1.0/24 --snat-subnet-routes=true --stateful-filtering=false --accept-routes --accept-dns=false

Pour que le client Linux accepte la route :

sudo tailscale up --accept-routes

Pour le refuser :

sudo tailscale up --accept-routes=false --stateful-filtering=false

Pour utiliser tailscale dans un conteneur lxc :

sudo nano /etc/pve/lxc/xxx.conf
lxc.mount.entry: /dev/net dev/net none bind,create=dir

accepter le noeud en "exit node" :

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
sudo tailscale up --advertise-exit-node --accept-routes --stateful-filtering=false

zerotier

Installation Debian

sudo apt install curl gnupg1 -y
curl -s https://install.zerotier.com | sudo bash
sudo zerotier-cli join 28e7a7697309d93a

Configuration avancé

Si installation dans un conteneur aller dans le ficher de config du conteneur (/etc/pve/lxc/num.conf) :

lxc.mount.entry: /dev/net dev/net none bind,create=dir

Pour désinstaller ZeroTier :

sudo apt remove zerotier-one -y && \
sudo rm -rf /etc/apt/sources.list.d/zerotier.list && \
sudo rm -rf /var/lib/zerotier-one

Executer dans un conteneur Zerotier :

sudo docker run -d --name zerotierclient --restart unless-stopped --cap-add NET_ADMIN --device /dev/net/tun zerotier/zerotier:latest xxx

IPv6

Diagnostiquer la connectivité IPv6

# Vérifier l'adresse IPv6 publique assignée
ip -6 addr show dev eno1

# Vérifier la table de routage IPv6 (chercher "default")
ip -6 route show
ip -6 route show default

# Identifier la gateway IPv6 (routeur annoncé par RA)
ip -6 neigh show dev eno1

# Tester la sortie IPv6 vers Internet
curl -6 --max-time 5 https://ipv6.icanhazip.com

# Vérifier qu'un service écoute bien en IPv6
ss -tlnp | grep 443
# Doit montrer [::]:443, pas uniquement 0.0.0.0:443

Problème fréquent : route par défaut IPv6 manquante

Le routeur peut annoncer un préfixe IPv6 via SLAAC (Router Advertisement) sans pour autant inclure une route par défaut. L'adresse est alors bien assignée à l'interface, mais les paquets de réponse ne savent pas par où sortir → les clients semblent ne jamais obtenir de réponse.

Symptômes :

  • ip -6 route show default → vide
  • curl -6 https://ipv6.icanhazip.comCould not connect
  • Les clients externes (4G/5G) ne parviennent pas à se connecter

Trouver la gateway (adresse link-local du routeur) :

ip -6 neigh show dev eno1
# Chercher l'entrée avec le flag "router"
# Exemple : fe80::e65d:51ff:fe35:980 lladdr e4:5d:51:35:09:80 router STALE

Ajouter la route manuellement (temporaire) :

sudo ip -6 route add default via fe80::e65d:51ff:fe35:980 dev eno1

Configuration IPv6 persistante avec ifupdown

Sur Debian/Ubuntu sans NetworkManager ni netplan, la configuration réseau passe par /etc/network/interfaces.

La commande inet6 auto active SLAAC (adresse dérivée du MAC via EUI-64, donc stable). Le post-up ajoute la route par défaut manquante à chaque activation de l'interface :

# /etc/network/interfaces
allow-hotplug eno1
auto eno1
iface eno1 inet static
    address 192.168.1.250/24
    gateway 192.168.1.1

# IPv6 via SLAAC + route par défaut forcée
iface eno1 inet6 auto
    post-up ip -6 route replace default via fe80::e65d:51ff:fe35:980 dev $IFACE || true

Note : replace au lieu de add évite l'erreur si la route existe déjà (ex : après un ifup sans ifdown). Le || true empêche l'échec du script au boot.

Appliquer sans redémarrer :

sudo ifdown eno1 && sudo ifup eno1
# Ou simplement ajouter la route manuellement pour tester
sudo ip -6 route replace default via fe80::GATEWAY_LL dev eno1

Forcer la découverte IPv6 (SLAAC) et gérer le forwarding (Docker)

Lorsqu'un routeur (comme une box internet) envoie ses annonces réseau (Router Advertisements) peu fréquemment, une machine Linux configurée en auto (SLAAC) peut mettre plusieurs minutes après un redémarrage avant d'obtenir son adresse IPv6. De plus, l'activation de l'IP forwarding (souvent par Docker) désactive par défaut l'acceptation de ces annonces par le noyau.

1. Forcer l'acceptation des annonces avec le forwarding activé : Il faut configurer sysctl pour forcer l'acceptation des RA (valeur 2) même si la machine agit comme un routeur :

# /etc/sysctl.d/99-ipv6-accept-ra.conf
net.ipv6.conf.all.accept_ra=2
net.ipv6.conf.default.accept_ra=2
net.ipv6.conf.eno1.accept_ra=2
Appliquer avec : sudo sysctl -p /etc/sysctl.d/99-ipv6-accept-ra.conf

2. Solliciter activement le routeur avec ndisc6 : Pour ne pas attendre l'annonce passive du routeur (notamment au boot), installez l'outil ndisc6 :

sudo apt install ndisc6
Vous pouvez forcer la découverte manuellement sur une interface avec la commande :
sudo rdisc6 eno1
(Note : Sous Debian/Ubuntu, le gestionnaire de réseau utilisera automatiquement cet utilitaire, s'il est installé, pour solliciter une adresse IPv6 dès l'activation de l'interface).

Docker et IPv6

Par défaut, les réseaux bridge Docker n'ont pas l'IPv6 activé. Les containers n'obtiennent pas d'adresse IPv6 et Traefik ne peut pas router le trafic IPv6 vers eux, même si l'OS hôte a une IP IPv6.

Activer IPv6 sur un réseau dans docker-compose.yaml :

networks:
    frontend:
        name: frontend        # Évite le préfixe du projet (ex: "infrastructure_frontend")
        driver: bridge
        enable_ipv6: true
        ipam:
            config:
                - subnet: 172.19.0.0/16   # Subnet IPv4 existant
                - subnet: fd01::/80        # Subnet IPv6 ULA (plage privée fd00::/8)