Nmcli

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Configuration réseau (NetworkManager)
Commande nmcli
Contexte RHEL/CentOS/Fedora 7+ — remplace la configuration manuelle par fichiers ifcfg-*
Voir aussi Systemctl (service NetworkManager)

nmcli est l'interface en ligne de commande de NetworkManager, introduite avec systemd sur RHEL7 et versions suivantes. Elle permet de configurer et d'interroger la couche réseau (interfaces, adresses IPv4/IPv6, teaming, bridges…) de manière unifiée, sans éditer directement les fichiers /etc/sysconfig/network-scripts/ifcfg-*.

Notions de base

nmcli distingue deux objets :

  • un device : l'interface physique ou logique elle-même (eth0, eno1…) ;
  • une connection : un profil de configuration (nom, IP, DNS…) qui peut être appliqué à un device.

Un device n'a pas toujours de connection active, et une connection peut exister sans être appliquée. C'est cette distinction qui explique la différence entre nmcli device et nmcli connection (raccourcis : dev/con).

La nomenclature moderne des interfaces (biosdevname / systemd) facilite l'identification des cartes multiports :

enp2s0   # carte physique (bus PCI, slot)
eno1     # carte embarquée (on-board), numérotée par le firmware

Consultation

nmcli device status              # état de toutes les interfaces
nmcli device show eth0           # détails d'une interface (IP, DNS, MAC, état…)

nmcli connection show            # profils de connexion configurés
nmcli connection show --active   # profils actuellement actifs
nmcli connection show "static"   # détails d'un profil précis

Configuration IPv4

Modifier une connexion existante (repérée via nmcli device) :

nmcli connection modify enp1s0 ipv4.addresses 10.0.0.30/24
nmcli connection modify enp1s0 ipv4.gateway 10.0.0.1
nmcli connection modify enp1s0 ipv4.dns 10.0.0.10
nmcli connection modify enp1s0 ipv4.dns-search example.com
nmcli connection modify enp1s0 ipv4.method manual   # sinon la config reste ignorée si le profil est en DHCP

nmcli connection down enp1s0; nmcli connection up enp1s0   # appliquer les changements
nmcli device show enp1s0

Créer une nouvelle connexion :

# DHCP
nmcli con add con-name "default" type ethernet ifname eth0

# statique, sans connexion automatique au boot
nmcli con add con-name "static" ifname eth0 autoconnect no type ethernet \
  ip4 172.25.0.10/24 gw4 172.25.0.254

nmcli con up "static"
nmcli con show "static"

Modifier une connexion après coup :

nmcli con mod "static" connection.autoconnect no
nmcli con mod "static" ipv4.dns 172.25.0.254
nmcli con mod "static" +ipv4.dns 8.8.8.8       # ajouter un DNS supplémentaire (le "+" préserve l'existant)
nmcli con mod "static" ipv4.addresses 172.25.0.10/24

⚠️ Toute modification via connection modify/con mod n'est appliquée qu'après un nmcli con up (ou down+up) sur la connexion concernée — elle est écrite dans le profil mais pas poussée à chaud sur l'interface.

Correspondance avec les anciens fichiers ifcfg

Table de correspondance entre les clés de /etc/sysconfig/network-scripts/ifcfg-* (RHEL6 et antérieur) et les propriétés nmcli équivalentes :

Clé ifcfg Propriété nmcli
BOOTPROTO=none ipv4.method manual
BOOTPROTO=dhcp ipv4.method auto
IPADDR/PREFIX/GATEWAY ipv4.addresses / ipv4.gateway
DNS1, DNS2 ipv4.dns
DOMAIN ipv4.dns-search
PEERDNS=no ipv4.ignore-auto-dns yes
ONBOOT=yes connection.autoconnect yes
NAME connection.id
DEVICE connection.interface-name
HWADDR 802-3-ethernet.mac-address

IPv6

Notations équivalentes

2001:0db8:0000:0010:0000:0000:0000:0001   # forme complète
2001:db8:0:10::1                          # compressée (zéros de tête omis, un seul "::")

Avec un port, l'adresse doit être entre crochets : [2001:db8:0:10::1]:80.

Plages notables :

::1/128     # localhost (équivalent 127.0.0.1/8)
::          # adresse non spécifiée (équivalent 0.0.0.0)
::/0        # route par défaut (équivalent 0.0.0.0/0)
2000::/3    # unicast global — l'essentiel des adresses routées publiquement
fd00::/8    # unique local address — routage privé, non public (équivalent RFC1918)
fe80::/64   # link-local — auto-assignée sur chaque interface, jamais routée
ff00::/8    # multicast (équivalent 224.0.0.0/4 en IPv4)

Une adresse link-local nécessite de préciser l'interface (portée locale au lien) :

ping -6 fe80::211:22ff:feaa:bbcc%eth0
ping -6 ff02::1%eth0

Configuration via nmcli

nmcli con add con-name eno2 type ethernet ifname eno2 \
  ip6 2001:db8:0:1::c000:207/64 gw6 2001:db8:0:1::1 \
  ip4 192.0.2.7/24 gw4 192.0.2.1

nmcli con show static-eth0 | grep ipv6
nmcli con mod static-eth0 +ipv6.dns 2001:4860:4860::8888

Les propriétés IPv4 ont leur équivalent direct en ipv6.* (mêmes noms, même logique de + pour ajouter sans écraser).

Pour vérifier les routes et connexions actives :

ip -6 route show
ss -A inet6 -n

SLAAC (autoconfiguration sans état)

En complément du DHCPv6 et de l'adressage statique, SLAAC (Stateless Address Autoconfiguration) permet à un hôte de se configurer seul à partir des annonces du routeur :

  1. le routeur local annonce un préfixe sur son adresse link-local (fe80::/64) ;
  2. l'hôte combine ce préfixe avec un identifiant d'interface pour former sa propre adresse globale.

Le service radvd (paquet dédié aux annonces de routeur IPv6) est la référence côté serveur pour ce mécanisme.

Désactiver IPv6 (si vraiment nécessaire)

grubby --update-kernel ALL --args ipv6.disable=1
grubby --info DEFAULT                              # vérifier
grubby --update-kernel ALL --remove-args ipv6.disable   # réactiver

⚠️ Désactiver IPv6 au niveau noyau est une mesure radicale et de moins en moins justifiable : préférer, si le besoin est de ne pas router IPv6, de simplement ne pas configurer d'adresse globale plutôt que de couper la pile entière (certains services internes — y compris NetworkManager et systemd — supposent IPv6 disponible en local).

Teaming

Le teaming (successeur du bonding pour RHEL7+) agrège plusieurs interfaces physiques derrière une interface logique. Modes de répartition ("runners") disponibles : broadcast, roundrobin, activebackup, loadbalance, lacp.

# créer l'interface de team
nmcli con add type team con-name team0 ifname team0 config '{"runner":{"name":"loadbalance"}}'
nmcli con mod team0 ipv4.addresses 1.2.3.4/24
nmcli con mod team0 ipv4.method manual

# rattacher des esclaves
nmcli con add type team-slave con-name team0-eth1 ifname eth1 master team0
nmcli con add type team-slave con-name team0-eth2 ifname eth2 master team0

nmcli con up team0-eth2
teamdctl team0 state

Configuration avancée via un fichier JSON (référencé par team.config) :

nmcli con mod team0 team.config /etc/sysconfig/team-team0.conf
{
    "device": "team0",
    "mcast_rejoin": { "count": 1 },
    "notify_peers": { "count": 1 },
    "ports": {
        "eth1": {
            "prio": -10,
            "sticky": true,
            "link_watch": { "name": "ethtool" }
        },
        "eth2": {
            "prio": 100,
            "link_watch": { "name": "ethtool" }
        }
    },
    "runner": { "name": "activebackup" }
}

Watchers de lien disponibles pour link_watch :

{ "name": "ethtool" }

{
    "name": "arp_ping",
    "interval": 100,
    "missed_max": 30,
    "source_host": "192.168.23.2",
    "target_host": "192.168.23.1"
}

Diagnostic :

teamdctl team0 ports
teamdctl team0 state
teamdctl team0 config dump
teamdctl team0 port config get eth1

# forcer manuellement le port actif
teamdctl team0 state item set team0.runner.active_port eth2

Bridges

nmcli con add type bridge con-name br0 ifname br0
nmcli con add type bridge-slave con-name br0-port1 ifname eth1 master br0
nmcli con add type bridge-slave con-name br0-port2 ifname eth2 master br0

brctl show   # nécessite le paquet bridge-utils ; sinon "ip link show type bridge"

Voir aussi

  • Systemctl — gérer le service NetworkManager (systemctl status NetworkManager)