César, parte di questo gruppo di lavoro, ci ha fatto il favore di scrivere questo articolo poiché conosce molto bene questo argomento.
Soluzione:
Il ifconfig
su sistemi operativi come FreeBSD e OpenBSD è stato aggiornato in linea con il resto del sistema operativo. Oggi è in grado di configurare tutti i tipi di impostazioni dell'interfaccia di rete su questi sistemi operativi e di gestire una serie di protocolli di rete. I BSD forniscono ioctl()
supporto per queste cose.
Questo non è accaduto nel mondo Linux. Oggi ci sono tre ifconfig
comandi:
ifconfig
da GNU inetutilsjdebp % inetutils-ifconfig -l enp14s0 enp15s0 lo jdebp % inetutils-ifconfig lo lo Link encap:Local Loopback inet addr:127.0.0.1 Bcast:0.0.0.0 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:9087 errors:0 dropped:0 overruns:0 frame:0 TX packets:9087 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:51214341 TX bytes:51214341 jdebp %
ifconfig
da NET-3 net-toolsjdebp % ifconfig -l ifconfig: option
-l' not recognised. ifconfig:
--help' gives usage information. jdebp % ifconfig lo lo: flags=73mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10 inet6 ::2 prefixlen 128 scopeid 0x80 inet6 fe80:: prefixlen 10 scopeid 0x20 loop txqueuelen 1000 (Local Loopback) RX packets 9087 bytes 51214341 (48.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 9087 bytes 51214341 (48.8 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 jdebp % ifconfig
dalla (versione 1.40 del) set di strumenti noshjdebp % ifconfig -l enp14s0 enp15s0 lo jdebp % ifconfig lo lo link up loopback running link address 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 address 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 address 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 address ::2 scope 0 prefixlen 128 inet6 address fe80:: scope 1 prefixlen 10 inet6 address ::1 scope 0 prefixlen 128 jdebp % sudo ifconfig lo inet4 127.1.0.2 alias jdebp % sudo ifconfig lo inet6 ::3/128 alias jdebp % ifconfig lo lo link up loopback running link address 00:00:00:00:00:00 bdaddr 00:00:00:00:00:00 inet4 address 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 inet4 address 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2 inet4 address 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 inet6 address ::3 scope 0 prefixlen 128 inet6 address ::2 scope 0 prefixlen 128 inet6 address fe80:: scope 1 prefixlen 10 inet6 address ::1 scope 0 prefixlen 128 jdebp %
Come si può vedere, GNU inetutils e NET-3 net-tools ifconfig
hanno alcune carenze marcate, rispetto a IPv6, rispetto alle interfacce con indirizzi multipli e rispetto a funzionalità quali -l
.
Il problema dell'IPv6 è in parte dovuto a codice mancante negli strumenti stessi. Ma principalmente è causato dal fatto che Linux non fornisce (come invece fanno altri sistemi operativi) la funzionalità IPv6 attraverso l'opzione ioctl()
interfaccia. Permette ai programmi di vedere e manipolare gli indirizzi IPv4 solo attraverso l'interfaccia di rete ioctl()
s.
Linux invece fornisce questa funzionalità attraverso un'interfaccia diversa, send()
e recv()
su una famiglia speciale e un po' strana di indirizzi di socket, AF_NETLINK
.
GNU e NET-3 ifconfig
s potrebbe essere adattato all'uso di questa nuova API. L'argomentazione contro di essa era che non era portabile ad altri sistemi operativi, ma questi programmi erano in pratica già non portabili comunque quindi non era una grande argomentazione.
Ma non vennero modificati, e rimangono così come sono stati mostrati fino ad oggi. (Alcune persone ci hanno lavorato in vari momenti nel corso degli anni, ma i miglioramenti, purtroppo, non sono mai stati inseriti nei programmi. Per esempio: Bernd Eckenfels non ha mai accettato una patch che aggiungeva alcune funzionalità dell'API netlink a NET-3 net-tools. ifconfig
4 anni dopo che la patch era stata scritta).
Invece, alcune persone hanno reinventato completamente il set di strumenti come un ip
che utilizzava le nuove API di Linux, aveva una sintassi diversa e combinava diverse altre funzioni dietro a un comando alla moda command subcommand
-stile interfaccia.
Avevo bisogno di un ifconfig
che avesse la sintassi della riga di comando e lo stile di output del sistema FreeBSD. ifconfig
(che né la GNU né la NET-3 ifconfig
e che ip
non ha certamente). Così ne ho scritto uno. Come prova che si può scrivere un ifconfig
che utilizza l'API netlink su Linux, lo fa.
Quindi la saggezza ricevuta riguardo a ifconfig
, come quella che lei cita, non è più vera. È ora falsa dire che "ifconfig
non usa netlink". La coperta che copriva due non copre tre.
E è sempre stato falso dire che "netlink è più efficiente". Per i compiti che si svolgono con ifconfig
non c'è molto in termini di efficienza tra le API di netlink e quelle di ioctl()
API. Il numero di chiamate all'API per ogni operazione è praticamente lo stesso.
Infatti, ogni chiamata API è due chiamate di sistema nel caso di netlink, al contrario di una nel caso di ioctl()
sistema. E probabilmente l'API netlink ha lo svantaggio che su un sistema molto utilizzato incorpora esplicitamente la possibilità che lo strumento non riceva mai un messaggio di conferma che lo informi del risultato della chiamata API.
È inoltre falso affermare che ip
è "più versatile" di GNU e NET-3. ifconfig
s perché utilizza netlink. È più versatile perché svolge più compiti, facendo cose in un unico grande programma che si farebbero con programmi separati. diversi daifconfig
. Non è più versatile semplicemente a causa dell'API che usa internamente per eseguire questi compiti extra. Non c'è nulla di inerente all'API. Si potrebbe scrivere uno strumento all-in-one che utilizzi l'API FreeBSD ioctl()
FreeBSD, per esempio, e affermare altrettanto bene che è "più versatile" rispetto alle singole API ifconfig
, route
, arp
e ndp
comandi.
Si può scrivere route
, arp
e ndp
per Linux che utilizzassero l'API netlink.
Ulteriori letture
- Jonathan de Boyne Pollard (2019).
ifconfig
. Guida al nosh. Software. - Eduardo Ferro (2009-04-16). ifconfig: segnala un indirizzo ip sbagliato / patch iniziale. Bug Debian #359676.
Lo standard ifconfig
presente in molte distribuzioni è deprecato per diverse ragioni. Parla in modo obsoleto e limitato con il kernel e, di fatto, non comprende più tutte le configurazioni di rete. Non sarà possibile manipolare alcune configurazioni di rete quali ifconfig
che si possono fare con ip
. Inoltre, la versione ifconfig
per gli spazi dei nomi di rete è limitato.
Come aneddoto, ho trovato alias IP di interfaccia che sono visibili solo in ip
e non in SuSE ifconfig
.
Per quanto riguarda le differenze sotto il cofano: Da ifconfig vs ip: Che differenza c'è e Confronto della configurazione di rete
Anche se
ip
potrebbe sembrare un po' complesso a prima vista, ma è molto più
più ampio di ifconfig. È organizzato funzionalmente
su due livelli dello stack di rete, ossia il livello 2 (livello di collegamento) e il livello 3 (livello IP).
(livello IP) e svolge il lavoro di tutti i comandi sopra citati del pacchetto net-tools.
pacchetto net-tools.Mentre
ifconfig
visualizza o modifica principalmente le interfacce di un sistema,
questo comando è in grado di eseguire i seguenti compiti:
Visualizzazione o modifica delle proprietà dell'interfaccia.
Aggiunta e rimozione di voci della cache ARP e creazione di una nuova voce ARP statica per un host.
per un host.Visualizzazione degli indirizzi MAC associati a tutte le interfacce.
Visualizzazione e modifica delle tabelle di routing del kernel.
Uno dei principali punti di forza che lo separa dalla sua vecchia
ifconfig è che quest'ultimo utilizza ioctl per la configurazione della rete.
per la configurazione della rete, che è un modo meno apprezzato di interagire con il
kernel, mentre il primo sfrutta il meccanismo del netlink socket per
che è un successore molto più flessibile di ioctl per l'intercomunicazione tra il kernel e il kernel.
intercomunicazione tra kernel e spazio utente utilizzando rtnetlink (che aggiunge la capacità di manipolazione dell'ambiente di rete).
(che aggiunge la capacità di manipolazione dell'ambiente di rete).
Sull'uso/vantaggi di netlink: Da LJ - Kernel Korner - Perché e come utilizzare Netlink Socket
Il socket Netlink è un IPC speciale utilizzato per trasferire informazioni
tra il kernel e i processi dello spazio utente. Fornisce un collegamento di comunicazione full-duplex
di comunicazione full-duplex tra i due tramite API socket standard per i processi in
per i processi in spazio utente e una speciale API del kernel per i moduli del kernel.
Il socket Netlink utilizza l'opzione famiglia di indirizzi AF_NETLINK......
Perché le funzioni di cui sopra utilizzano netlink invece delle chiamate di sistema, degli ioctls
o filesystem proc per la comunicazione tra il mondo utente e quello del kernel?
È un compito non banale aggiungere chiamate di sistema, ioctl o file proc per le nuove funzionalità.
nuove funzionalità; si rischia di inquinare il kernel e di danneggiare la stabilità del sistema.
del sistema. Il socket Netlink, invece, è semplice: solo una costante, il tipo di protocollo
tipo di protocollo, deve essere aggiunta a netlink.h. Poi, il modulo del kernel e l'applicazione possono dialogare
e l'applicazione possono dialogare immediatamente utilizzando API di tipo socket.....
Netlink socket è un'interfaccia flessibile per la comunicazione tra applicazioni
applicazioni dello spazio utente e moduli del kernel. Fornisce un'API socket facile da usare
API socket di facile utilizzo sia per le applicazioni che per il kernel. Fornisce funzioni di comunicazione
di comunicazione avanzate, come full-duplex, I/O bufferizzato, multicast e comunicazione asincrona, che sono assenti
e la comunicazione asincrona, che sono assenti in altri IP del
IPC del kernel e dello spazio utente.