La maggior parte delle attuali distribuzioni Linux utilizzare NetworkManager per creare e gestire le connessioni di rete. Ciò significa che devo capirlo come amministratore di sistema. In una serie di articoli, condividerò ciò che ho imparato fino ad oggi e perché penso che NetworkManager sia un miglioramento rispetto alle opzioni precedenti.
Red Hat ha introdotto NetworkManager nel 2004 per semplificare e automatizzare la configurazione e le connessioni di rete, in particolare le connessioni wireless. L'intento era quello di sollevare gli utenti dal compito di configurare manualmente ogni nuova rete wireless prima di utilizzarla. NetworkManager può gestire le connessioni di rete cablate senza file di configurazione dell'interfaccia, sebbene utilizzi i file di connessione di rete per le connessioni wireless.
In questo articolo esaminerò cos'è NetworkManager e come utilizzarlo per visualizzare le connessioni di rete e i dispositivi per gli host Linux. Risolverò anche un paio di problemi nel processo.
Cosa sostituisce NetworkManager
NetworkManager sostituisce i precedenti strumenti di gestione della rete. Il comando di configurazione dell'interfaccia originale, ifconfig
e i suoi file di configurazione dell'interfaccia sono obsoleti. Puoi vederlo in ifconfig
pagine man, che contengono una nota che afferma proprio questo.
Il ip
il comando sostituisce ifconfig
comando ed esegue essenzialmente le stesse attività. Entrambi i comandi coesistono da un po' di tempo, consentendo agli amministratori di sistema di utilizzarne uno qualsiasi, il che mantiene gli script dipendenti da ifconfig
funzionale. Sebbene le sue pagine man non lo indichino ancora, ifconfig
comando è obsoleto e NetworkManager lo ha reso in pratica tale.
È giunto il momento di riscrivere quegli script, perché l'uso dei comandi di NetworkManager ha più senso.
Come funziona NetworkManager
NetworkManager viene eseguito come servizio di sistema ed è abilitato per impostazione predefinita. NetworkManager funziona con D-Bus per rilevare e configurare le interfacce di rete quando sono collegate al computer Linux. Questa gestione plug-and-play delle interfacce di rete rende il collegamento a nuove reti, sia cablate che wireless, estremamente semplice per l'utente. Quando le interfacce di rete installate in precedenza vengono rilevate durante l'avvio di Linux, vengono trattate esattamente come un dispositivo collegato dopo che il sistema è già attivo e funzionante. Trattare tutti i dispositivi come plug-and-play in ogni caso semplifica la gestione di tali dispositivi per il sistema operativo, poiché esiste un solo codice base per gestire entrambi i gruppi di circostanze.
Il demone udev crea una voce per ogni scheda di interfaccia di rete (NIC) installata nel sistema nel file delle regole di rete. D-Bus segnala la presenza di un nuovo dispositivo di rete, cablato o wireless, a NetworkManager. NetworkManager ascolta quindi il traffico sul D-Bus e risponde creando una configurazione per questo nuovo dispositivo. Tale configurazione è, per impostazione predefinita, memorizzata solo nella RAM e non è permanente. Deve essere creato ad ogni avvio del computer.
NetworkManager utilizza le informazioni da D-Bus per inizializzare ciascuna scheda di rete. Per prima cosa cerca i file di configurazione che forniscono una configurazione statica più permanente. Quando viene notificato un nuovo dispositivo, NetworkManager verifica l'esistenza dei vecchi file di configurazione dell'interfaccia di rete (ifcfg-*
) in /etc/sysconfig/network-scripts
. Il plugin ifcfg-rh consente l'uso di questi file legacy per la compatibilità con le versioni precedenti.
Successivamente, NetworkManager cerca i propri file di connessione dell'interfaccia, che si trovano in /etc/NetworkManager/system-connections directory
directory. La maggior parte delle distribuzioni, inclusa Fedora, conserva i propri file di connessione di rete in /etc/NetworkManager/system-connections directory
directory, utilizzando il nome della rete come nome del file.
Ad esempio, il mio laptop System76 Oryx Pro originariamente utilizzava POP!_OS
. L'ho sostituito con Fedora, che è attualmente alla versione 35, e ogni connessione wireless che ho effettuato con esso ha un file in /etc/NetworkManager/system-connections directory
. Questi mantengono un record dell'identificatore del set di servizi (SSID) e delle password wireless per ciascuna rete. Il server DHCP (Dynamic Host Configuration Protocol) nel router wireless fornisce il resto dei dati di configurazione di rete per queste connessioni wireless. Per motivi di sicurezza, poiché questi file contengono password, vengono letti/scritti solo dall'utente root, proprio come i file dell'account di sistema /etc/passwd
e /etc/shadow
.
La directory /etc/NetworkManager/system-connections directory
su quel laptop conteneva file per la rete cablata e per ciascuna delle reti wireless con cui mi sono connesso. La struttura di questi file è diversa dal vecchio ifcfg
file, ma sono in formato di testo normale ASCII e sono leggibili e facilmente comprensibili.
Questo processo è sensibile alla sequenza. Viene utilizzato il primo set di file di configurazione trovato. Se non vengono trovati file di configurazione, NetworkManager genera una configurazione utilizzando i dati di un server DHCP. Se non esiste un file di configurazione dell'interfaccia, il collegamento di un nuovo dispositivo o la connessione a una nuova rete wireless fa sì che udev notifichi a NetworkManager il nuovo dispositivo o la connessione wireless. In Fedora fino alla release 28, NetworkManager crea il nuovo file di configurazione dell'interfaccia. A partire da Fedora 29 e versioni successive, NetworkManager crea solo la connessione e non crea un file di configurazione dell'interfaccia.
Se non vengono trovati file di configurazione o server DHCP, non è possibile alcuna connessione di rete.
Visualizzazione della configurazione dell'interfaccia
Il programma dell'interfaccia della riga di comando di NetworkManager, nmcli, fornisce diverse opzioni per determinare lo stato corrente di qualsiasi hardware dell'interfaccia di rete installato nell'host, nonché le connessioni attualmente attive. Il programma nmcli può gestire la rete su qualsiasi host, indipendentemente dal fatto che utilizzi un'interfaccia utente grafica (GUI) o meno, quindi può anche gestire host remoti su una connessione Secure Shell (SSH). Funziona sia con connessioni cablate che wireless.
Inizierò con alcune informazioni di base per l'utilizzo dello strumento nmcli. Sto usando un sistema Fedora che ho impostato come router, poiché un esempio con più interfacce di rete sarà più interessante di una semplice workstation host con una sola interfaccia.
Inizierò con il comando più semplice, nmcli
senza opzioni. Questo semplice comando mostra informazioni simili all'ormai obsoleto ifconfig
comando, inclusi il nome e il modello della NIC, l'indirizzo MAC (Media Access Control) e l'indirizzo IP (protocollo Internet) e quale NIC è configurata come gateway predefinito. Mostra anche la configurazione DNS per ciascuna interfaccia.
Il comando nmcli richiede privilegi di amministratore. La maggior parte delle distribuzioni consiglia di utilizzare sudo
ma passo semplicemente alla root
utente.
$ su -
# nmcli
enp4s0: connected to enp4s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:04:44:03, hw, mtu 1500
ip4 default, ip6 default
inet4 45.20.209.41/29
route4 0.0.0.0/0
route4 45.20.209.40/29
inet6 2600:1700:7c0:860:8616:f9ff:fe04:4403/64
inet6 fe80::8616:f9ff:fe04:4403/64
route6 2600:1700:7c0:860::/64
route6 ::/0
enp1s0: connected to enp1s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:03:E9:89, hw, mtu 1500
inet4 192.168.10.1/24
route4 192.168.10.0/24
inet6 fe80::8616:f9ff:fe03:e989/64
route6 fe80::/64
enp2s0: connected to enp2s0
"Realtek RTL8111/8168/8411"
ethernet (r8169), 84:16:F9:03:FD:85, hw, mtu 1500
inet4 192.168.0.254/24
route4 192.168.0.0/24
inet6 fe80::8616:f9ff:fe03:fd85/64
route6 fe80::/64
eno1: unavailable
"Intel I219-V"
ethernet (e1000e), 04:D9:F5:1C:D5:C5, hw, mtu 1500
lo: unmanaged
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
DNS configuration:
servers: 192.168.0.52 8.8.8.8 8.8.4.4
interface: enp4s0
servers: 192.168.0.52 8.8.8.8
interface: enp1s0
servers: 192.168.0.52 8.8.8.8
interface: enp2s0
Usa il comando nmcli device show
per ottenere informazioni complete sui dispositivi conosciuti e su nmcli connection show
per avere una panoramica dei profili di connessione attivi. Consulta le pagine di manuale di nmcli(1) e nmcli-examples(7) per i dettagli completi sull'utilizzo. Puoi anche emettere il comando di aiuto, nmcli -h
, come utente root per visualizzare il nmcli
di livello superiore di base comandi:
# nmcli -h
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }
OPTIONS
-a, --ask ask for missing parameters
-c, --colors auto|yes|no whether to use colors in output
-e, --escape yes|no escape columns separators in values
-f, --fields <field,...>|all|common specify fields to output
-g, --get-values <field,...>|all|common shortcut for -m tabular -t -f
-h, --help print this help
-m, --mode tabular|multiline output mode
-o, --overview overview mode
-p, --pretty pretty output
-s, --show-secrets allow displaying passwords
-t, --terse terse output
-v, --version show program version
-w, --wait <seconds> set timeout waiting for finishing operations
OBJECT
g[eneral] NetworkManager's general status and operations
n[etworking] overall networking control
r[adio] NetworkManager radio switches
c[onnection] NetworkManager's connections
d[evice] devices managed by NetworkManager
a[gent] NetworkManager secret agent or polkit agent
m[onitor] monitor NetworkManager changes
Nota che gli oggetti possono essere scritti o abbreviati fino al primo carattere. Questi oggetti sono tutti univoci, quindi è necessario solo il primo carattere per specificare un singolo oggetto.
Prova nmcli g
per visualizzare lo stato generale.
# nmcli g
STATE CONNECTIVITY WIFI-HW WIFI WWAN-HW WWAN
connected full enabled enabled enabled enabled
Quell'output non mostra molto. So anche che l'host, in questo caso, non ha hardware WiFi, quindi questo è un risultato fuorviante. Non dovresti usare nmcli g
comando per questo motivo. I migliori comandi per gli oggetti sono c
[connessione] e d
[evice], che sono quelli che uso più frequentemente.
# nmcli c
NAME UUID TYPE DEVICE
enp4s0 b325fd44-30b3-c744-3fc9-e154b78e8c82 ethernet enp4s0
enp1s0 c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f ethernet enp1s0
enp2s0 8c6fd7b1-ab62-a383-5b96-46e083e04bb1 ethernet enp2s0
enp0s20f0u7 0f5427bb-f8b1-5d51-8f74-ac246b0b00c5 ethernet --
enp1s0 abf4c85b-57cc-4484-4fa9-b4a71689c359 ethernet --
# nmcli d
DEVICE TYPE STATE CONNECTION
enp4s0 ethernet connected enp4s0
enp1s0 ethernet connected enp1s0
enp2s0 ethernet connected enp2s0
eno1 ethernet unavailable --
lo loopback unmanaged --
Ci sono molte informazioni davvero interessanti qui. Si noti che le ultime due voci utilizzano il c
Il comando oggetto non ha voci nella colonna del dispositivo. Questo risultato potrebbe significare che non sono attivi o non esistono o che sono presenti uno o più errori di configurazione.
Le informazioni aggiuntive che otteniamo utilizzando il d
Il comando oggetto non mostra nemmeno il dispositivo enp0s20f0u7. Mostra anche il dispositivo eno1 (un dispositivo della scheda madre), che non è stato visualizzato utilizzando il c
comando oggetto.
L'output dovrebbe essere più simile a questo, anche se il nome del dispositivo sarà diverso e dipenderà dalla posizione specifica sul bus PCI a cui è collegata la scheda di rete.
# nmcli c
NAME UUID TYPE DEVICE
Wired connection 1 6e6f63b9-6d9e-3d13-a3cd-d54b4ca2c3d2 ethernet enp0s3
# nmcli d
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet connected Wired connection 1
lo loopback unmanaged --
Sembra che io abbia un paio di anomalie da esplorare. Innanzitutto, voglio sapere quale dispositivo enp0s20f0u7 è nell'elenco delle connessioni. Poiché NetworkManager non riconosce questo dispositivo nell'elenco dei dispositivi, è probabilmente presente un file di configurazione di rete in /etc/sysconfig/network-scripts
anche se sull'host non esiste alcun dispositivo hardware di questo tipo. Ho controllato quella directory, trovato il file di configurazione dell'interfaccia e visualizzato il contenuto.
# ls -l
total 20
-rw-r--r-- 1 root root 352 Jan 2 2021 ifcfg-eno1
-rw-r--r-- 1 root root 419 Jan 5 2021 ifcfg-enp0s20f0u7
-rw-r--r-- 1 root root 381 Jan 11 2021 ifcfg-enp1s0
-rw-r--r-- 1 root root 507 Jul 27 2020 ifcfg-enp2s0
-rw-r--r-- 1 root root 453 Jul 27 2020 ifcfg-enp4s0
cat ifcfg-enp0s20f0u7
# Interface configuration file for ifcfg-enp0s20f0u7
# This is a USB Gb Ethernet dongle
# This interface is for the wireless routers
# Correct as of 20210105
TYPE="Ethernet"
BOOTPROTO="static"
NM_CONTROLLED="yes"
DEFROUTE="no"
NAME=enp0s20f0u7
UUID="fa2117dd-6c7a-44e0-9c9d-9c662716a352"
ONBOOT="yes"
HWADDR=8c:ae:4c:ff:8b:3a
IPADDR=192.168.10.1
PREFIX=24
DNS1=192.168.0.52
DNS2=8.8.8.8
Dopo aver esaminato questo file, mi sono ricordato che avevo usato un dongle USB Gigabit per un po' perché la scheda di rete della scheda madre installata su quell'host era apparentemente guasta. Questa è stata una soluzione rapida e in seguito ho installato una nuova NIC sul bus della scheda madre PCIe, in modo da poter rimuovere questo file di configurazione dell'interfaccia. Tuttavia non l'ho cancellato; L'ho spostato in /root
directory nel caso in cui ne avessi bisogno di nuovo.
Nota i commenti che ho usato per assicurarmi che il mio futuro io o un altro amministratore di sistema potessero comprendere il motivo per cui esiste questo file.
La seconda anomalia è il motivo per cui la voce per enp1s0 appare due volte. Ciò può verificarsi solo quando il nome NIC è specificato in più di un file di configurazione dell'interfaccia. Quindi ho provato i seguenti passaggi e, in effetti, enp1s0 appare erroneamente in ifcfg-eno1
file di configurazione e ifcfg-enp1s0
file.
# grep enp1s0 *
ifcfg-eno1:NAME=enp1s0
ifcfg-enp1s0:# Interface configuration file for enp1s0 / 192.168.10.1
ifcfg-enp1s0:NAME=enp1s0
# cat ifcfg-eno1
## Interface configuration file for eno1 / 192.168.10.1
## This interface is for the wireless routers
## Correct as of 20200727
TYPE="Ethernet"
BOOTPROTO="static"
NM_CONTROLLED="yes"
DEFROUTE="no"
NAME=enp1s0
ONBOOT="yes"
HWADDR=04:d9:f5:1c:d5:c5
IPADDR=192.168.10.1
PREFIX=24
DNS1=192.168.0.52
DNS2=8.8.8.8
Ho cambiato il NOME in NOME=eno1 e ho riavviato NetworkManager. Le modifiche ai file di configurazione dell'interfaccia non vengono attivate fino al riavvio di NetworkManager. Il dispositivo e i risultati della connessione ora hanno questo aspetto. Non sto ancora usando la scheda di rete integrata, il che probabilmente va bene ora che ho rimosso il nome sbagliato da ifcfg-eno1
file di configurazione dell'interfaccia. Ciò richiederà tempi di inattività per quel router.
# systemctl restart NetworkManager
# nmcli d
DEVICE TYPE STATE CONNECTION
enp4s0 ethernet connected enp4s0
enp1s0 ethernet connected enp1s0
enp2s0 ethernet connected enp2s0
eno1 ethernet unavailable --
lo loopback unmanaged --
# nmcli c
NAME UUID TYPE DEVICE
enp4s0 b325fd44-30b3-c744-3fc9-e154b78e8c82 ethernet enp4s0
enp1s0 c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f ethernet enp1s0
enp2s0 8c6fd7b1-ab62-a383-5b96-46e083e04bb1 ethernet enp2s0
eno1 abf4c85b-57cc-4484-4fa9-b4a71689c359 ethernet --
Un'altra opzione è mostrare solo le connessioni attive. Questa è una buona opzione con risultati puliti, ma può anche mascherare altri problemi se la usi esclusivamente.
# nmcli connection show --active
NAME UUID TYPE DEVICE
enp4s0 b325fd44-30b3-c744-3fc9-e154b78e8c82 ethernet enp4s0
enp1s0 c0ab6b8c-0eac-a1b4-1c47-efe4b2d1191f ethernet enp1s0
enp2s0 8c6fd7b1-ab62-a383-5b96-46e083e04bb1 ethernet enp2s0
Dopo aver cambiato il nome del dispositivo in ifcfg-eno1
file in quello corretto, sospetto che la scheda madre NIC, eno1, funzionerà di nuovo. Lo sperimenterò la prossima volta che avrò una sessione di manutenzione su quell'host.
Non è più interessante di un host con una singola NIC? E ho riscontrato alcuni problemi durante il processo.
L'utilizzo degli strumenti NetworkManager per gestire la rete è trattato nel documento Red Hat Enterprise Linux (RHEL) 8 "Configurazione e gestione della rete".
Pensieri finali
Sono un fan della filosofia "se non è rotto, non aggiustarlo". Tuttavia, anche il più semplice utilizzo di NetworkManager da riga di comando, visualizzando lo stato attuale dei dispositivi di rete e delle connessioni, mi ha mostrato due anomalie nelle mie precedenti configurazioni che mi erano sfuggite. Ora sono un fan di NetworkManager. Gli strumenti più vecchi erano buoni, ma NetworkManager è migliore; le informazioni aggiuntive che fornisce sono inestimabili.
Nella parte 2 di questa serie parlerò della gestione delle interfacce di rete.