Network administration con nmcli
La gestione delle connessioni di rete è da sempre uno dei processi cardine dell’amministrazione dei sistemi operativi. Le distribuzioni GNU/Linux offrono da sempre strumenti potenti e flessibili per la configurazione di device, connessioni, tabelle di routing.
Tra questi NetworkManager è sicuramente uno di quelli più interessanti.
Progetto avviato da Red Hat nel 2004 e con lo scopo iniziale integrare la gestione delle connessioni ethernet e wireless soprattutto in ambito desktop, si è sviluppato negli anni fino a divenire uno strumento molto efficace anche per l’amministrazione di rete su sistemi missioni-critical ed enterprise. La versione stabile attuale è la 1.0, rilasciata a Dicembre 2014 e permette di gestire, oltre alle più connessioni ethernet e wifi, anche configurazioni avanzate come il Network Teaming, il Bridging (che in passato aveva un supporto limitato) ed è customizzabile in base alla distribuzione su cui gira.
NetworkManager è fondamentalmente composto da un servizio e da diversi front-end, grafici e non.
Il servizio NetworkManager viene gestito da systemd su RHEL7/CentOS7 ed è abilitato di default.
Come possiamo vedere, oltre a NetworkManager viene avviato come child process anche il client DHCP.
NetworkManager legge la sua configurazione all’avvio in /etc/NetworkManager/NetworkManager.conf e in /etc/NetworkManager/conf.d/*.conf.
Il file NetworkManager.conf è in formato “key file” (simile ad un file .ini) e appare così in una distro RHEL7/CentOS7 appena installata:
[main] plugins=ifcfg-rh |
La direttiva plugins=ifcfg-rh indica che NetworkManager dovrà leggere e scrivere i file delle connessioni nel path standard /etc/sysconfig/network-scripts/ifcfg-*.
La pagina man NetworkManger.conf(5) offre maggiori dettagli sulle numerose direttive applicabili.
Come accennato sopra esistono diversi front-end di gestione di NetworkManager, grafici (nm-applet e nm-connection-editor in GNOME) e da linea di comando. Nel nostro articolo andremo ad esplorare le potenzialità del tool di amministrazione da linea di comando nmcli.
Il comando prevede una serie di oggetti su cui operare: general, networking, radio, connection, device, agent. Quando invocati possono essere abbreviati per rendere le istruzioni più compatte.
In questo articolo ci concentreremo sull’uso di nmcli per la creazione e configurazione di connessioni ethernet con indirizzamento IPv4.
Per avere un elenco di comandi e opzioni generali eseguiamo
nmcli help |
Per avere informazioni specifiche su un oggetto gestito da nmcli:
nmcli help |
Oltre agli help vi invitiamo come consuetudine a consultare le pagine man nmcli(1), nmcli-examples(5) e NetworkManager(8).Iniziamo con una panoramica delle connessioni: per elencare tutte le connessioni presenti sul sistema lanciamo il comando
nmcli connection show |
Nella sua forma abbreviata e più compatta:
nmcli con show |
Il comando produrrà un output simile a questo:L’output mostra i campi NAME, ovvero il nome della connessione, UUID, TYPE, ovvero il tipo di connessione e il DEVICE a cui sono agganciate.
Per una formattazione più elegante dell’output possiamo aggiungere l’opzione “-p[retty]“, utile se dobbiamo stampare dei report più leggibili.
nmcli -p con show |
E’ importante stabilire che una connessione e il device associato non sono la stessa cosa, pur potendo avere lo stesso nome. Nel caso appena mostrato il device è eth0 mentre la connessione si chiama “System eth0“.Possiamo astrarre l’esempio e dire che una connessione è un set di configurazioni (IP address, subnet, DNS, DHCP, connection method, ecc) che vengono applicate ad un device da NetworkManager.
Questa premessa fondamentale per giungere ad una prima osservazione: potremo avere una sola connessione attiva alla volta su un device.Per elencare solo le connessioni attualmente attive aggiungiamo l’opzione –active al comando precedente:
nmcli con show --active |
Per elencare i device disponibili ed avere una panoramica sulla loro configurazinoe useremo il comando show sull’oggetto dev (device):
nmcli dev show |
Per analizzare lo status dei device e la connessione attiva che li sta utilizzando useremo il comando status:
nmcli dev status |
Per maggiori dettagli su un particolare device:
nmcli dev show |
Per connettere o disconnettere un device:
nmcli dev connect nmcli dev disconnect |
Vediamo ora come possiamo creare una nuova connessione ethernet con indirizzo IPv4 dinamico utilizzando il device eth0.
nmcli con add type ethernet con-name “lab eth0” ifname eth0 |
Nel caso si voglia utilizzare un nome con spazi per la connessione è necessario, come nell’esempio sopra, utilizzare apici singoli o doppi per far trattare il tutto ad nmcli come un’unica stringa. Se non diversamente specificato le nuove connessioni vengono create con indirizzo IP assegnato dinamicamente.Troveremo la nostra connessione appena creata nell’elenco delle connessioni:
NetworkMananger creerà automaticamente il relativo file di configurazione /etc/sysconfig/network-scritps/ifcfg-lab_eth0.Per vedere tutte le impostazioni della nostra nuova connessione:
nmcli con show “lab eth0” |
Oltre al nome della connessione possiamo utilizzare anche il suo UUID con gli stessi risultati:
nmcli con show acadc2a1-cccc-4e64-96a6-4206b67f5ccc |
Andiamo adesso a creare una nuova connessione con indirizzo IPv4 statico che non verrà attivata automaticamente al boot.
nmcli con add type ethernet con-name “lab static eth0” ifname eth0 autoconnect no ip4 192.168.127.55/24 gw4 192.168.127.1 |
Questo comando crea una connessione statica con indirizzo 192.168.127.55, subnet mask 255.255.255.0, e default gateway 192.168.127.1 Per abilitare e disabilitare la nuova connessione:
nmcli con up "lab static eth0" |
nmcli con down "lab static eth0" |
Come accennato sopra si può avere una sola connessione attiva su un device. Questo implica che, nel momento in cui se ne attiva una su un device in uso con il comando nmcli con up, la connessione che stava già usando il device verrà automaticamente disattivata.Per modificare le impostazioni di una connessione esistente useremo il comando “mod”.
nmcli con mod <CONN_NAME|UUID> [+|-]<setting.property> <value> |
Ad esempio, aggiungiamo due DNS server alla connessione statica appena creata.
nmcli con mod "lab static eth0" ipv4.dns 10.10.10.10nmcli con mod "lab static eth0" +ipv4.dns 10.10.10.11nmcli con mod "lab static eth0" +ipv4.dns 10.10.10.12 |
Il flag “+” permette di aggiungere una o più properties senza sovrascrivere le precedenti. Similmente si comporterà il “-” per la rimozione di elementi già definiti.
nmcli con mod "lab static eth0" -ipv4.dns 10.10.10.12 |
NetworkManager modifica dinamicamente il file /etc/resolv.conf con gli ip dei DNS server definiti in una connessione.Tramite nmcli possiamo anche impostare il dominio di ricerca:
nmcli con mod "lab static eth0" ipv4.dns-search example.com |
Come si sarà facilmente intuito, tutti i settings elencati tramite il comando nmcli con show <CONN_NAME|UUID> sono modificabili tramite nmcli con mod.Modifichiamo il parametro connection.autoconnect per attivare la connessione al boot:
nmcli con mod "lab static eth0" connection.autoconnect yes |
Torniamo alla connessione “lab static eth0” e proviamo ad aggiungere un ulteriore ip address:
nmcli con mod "lab static eth0" +ipv4.addresses "192.168.127.80/24" |
Le versioni precedenti alla 1.0 permettono di impostare in un’unica stringa sia ip address che gateway in questo modo:
nmcli con mod "lab static eth0" +ipv4.addresses "192.168.127.80/24 192.168.127.1" |
Dalla versione 1.0 è stata aggiunta la property ipv4.gateway e pertanto ip address e gateway vanno gestiti separatamente.Per rendere una connessione statica o dinamica dobbiamo agire sulla property ipv4.method:
nmcli con mod ipv4.method autonmcli con mod ipv4.method manual |
Se volessimo modificare la prima connessione creata applicando un indirizzamento statico:
nmcli con mod "lab eth0" ipv4.method manual |
Ovviamente dopo aver fatto ciò dovremo assegnare alla connessione un indirizzo IP statico libero ed eventualmente un default gateway e almeno un DNS server:
nmcli con mod "lab eth0" ipv4.addresses 192.168.127.167/24nmcli con mod "lab eth0" ipv4.gateway 192.168.127.1nmcli con mod "lab eth0" ipv4.dns 10.10.10.12 |
Come già accennato tutte le configurazioni create e/o modificate tramite NetworkManager vengono salvate nella directory /etc/sysconfig/network-scripts. Una connessione tipica avrà il nome ifcfg-*.
La connessione precedentemente creata corrisponderà al file /etc/sysconfig/network-scripts/ifcfg-lab_static_eth0. Andiamo ad osservarne il contenuto e analizzare alcune della variabili espresse:
TYPE=Ethernet BOOTPROTO=none IPADDR0=192.168.127.55 IPADDR1=192.168.127.80 PREFIX0=24 PREFIX1=24 GATEWAY0=192.168.127.1 GATEWAY1=192.168.127.1 DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME="lab static eth0" UUID=7d36e79e-1daf-4b00-b27c-234cdb9f810d DEVICE=eth0ONBOOT=yes DNS1=10.10.10.10 DNS2=10.10.10.11 |
Le variabili IPADDR[X[, PREFIX[X] e GATEWAY[X] permettono di esprimere molteplici indirizzi ip,subnet e gateway.
La variabile ONBOOT indica se la connessione verrà avviata al boot della macchina. Può assumere i valori “yes” o “no”.
La variabile BOOTPROTO indica se la connessione è statica o con indirizzo dinamico. Può assumere i valori “none” o “dhcp”.
La variabile DNS[X] indica l’indirizzo ip del DNS server.
NAME esprime il nome della connessione.
Possiamo modificare una connessione agendo direttamente su questi file di configurazione. Una volta modificati dobbiamo istruire NetworkManger sui cambiamenti effettuati poiché il servizio non monitora in tempo reale le modifiche ai file.
Per far rileggere a NetworkManager i file delle connessioni:
nmcli con reload |
E successivamente riavviamo la connessione che siamo andati precedentemente a modificare:
nmcli con down && nmcli con up |
Come esempio andiamo a modificare il primo indirizzo IPv4 statico della connessione precedentemente creata e aggiorniamo poi NetworkManager con le nuove impostazioni:
sed -i '/^IPADDR0=/ s/192.168.127.55/192.168.127.180/' /etc/sysconfig/network-scripts/ifcfg-lab_static_eth0 nmcli con reload nmcli con down "lab static eth0" && nmcli con up "lab static eth0" |
nmcli permette anche di editare le connessioni in modo interattivo. Per modificare una connessione è sufficiente lanciare il comando per entrare nella shell di nmcli.
nmcli con edit <CONN_NAME|UUID> |
Modifichiamo ad esempio la proprietà connection.autoconnect usando la shell interattiva.
[root@localhost ~]# nmcli con edit "lab static eth0" nmcli> set connection.autoconnect no nmcli> save persistent nmcli> quit |
Lo stesso approccio può essere applicato su tutte le altre impostazioni ma il comportamento è leggermente diverso. Ad esempio, per aggiungere un dns server:
[root@localhost ~]# nmcli con edit "lab static eth0" nmcli> set ipv4.dns 10.10.10.13 nmcli> save persistent nmcli> quit |
In questo caso non usiamo i prefisso “+|-” ma ci limitiamo ad aggiungere un indirizzo che verrà messo in append a quelli già definiti.In generale, shell interattiva è utile per operazioni semplici di modifica ma è consigliabile utilizzare i comandi diretti che offrono una flessibilità di gran lunga superiore.
Nel prossimo articolo continueremo ad esplorare altre feature avanzate di nmcli e tratteremo la gestione del networking IPv6, network teaming e bridging.