Nmcli
| 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 :
- le routeur local annonce un préfixe sur son adresse link-local (
fe80::/64) ; - 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)