Skip to content

Pro e contro dei comandi ip vs ifconfig

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 inetutils
    jdebp % 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-tools
    jdebp % ifconfig -l
    ifconfig: option -l' not recognised.
    ifconfig:--help' gives usage information.
    jdebp % ifconfig lo
    lo: flags=73  mtu 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 nosh
    jdebp % 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 ifconfighanno 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 ifconfigs 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. ifconfig4 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 ifconfignon 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. ifconfigs 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, arpe ndp comandi.

Si può scrivere route, arpe 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.

valutazioni e commenti



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.