Il ifconfig
comando su sistemi operativi come FreeBSD e OpenBSD è stato aggiornato in linea con il resto del sistema operativo. Al giorno d'oggi può configurare tutti i tipi di impostazioni dell'interfaccia di rete su quei sistemi operativi e gestire una gamma di protocolli di rete. I BSD forniscono ioctl()
supporto per queste cose.
Questo non è accaduto nel mondo Linux. Ci sono, oggi, 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=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> inet6 ::2 prefixlen 128 scopeid 0x80<compat,global> inet6 fe80:: prefixlen 10 scopeid 0x20<link> 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
da (versione 1.40 di) il 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 puoi vedere, GNU inetutils e NET-3 net-tools ifconfig
s hanno alcune carenze marcate, rispetto a IPv6, rispetto alle interfacce che hanno più indirizzi e rispetto a funzionalità come -l
.
Il problema IPv6 è in parte un codice mancante negli strumenti stessi. Ma principalmente è causato dal fatto che Linux non (come fanno altri sistemi operativi) fornisce funzionalità IPv6 attraverso ioctl()
interfaccia. Permette solo ai programmi di vedere e manipolare gli indirizzi IPv4 attraverso il ioctl()
di rete p.s.
Linux fornisce invece questa funzionalità attraverso un'interfaccia diversa, send()
e recv()
su una famiglia di indirizzi socket speciale e alquanto strana, AF_NETLINK
.
GNU e NET-3 ifconfig
s potrebbe sono stati adattati per utilizzare questa nuova API. L'argomento contrario era che non era portabile su altri sistemi operativi, ma questi programmi erano in pratica già non comunque portatile quindi non era una gran discussione.
Ma non sono stati adattati e rimangono come sopra indicato fino ad oggi. (Alcune persone ci hanno lavorato in vari momenti nel corso degli anni, ma i miglioramenti, triste a dirsi, non sono mai entrati nei programmi. Ad esempio:Bernd Eckenfels non ha mai accettato una patch che aggiungesse alcune funzionalità API netlink a NET-3 net-tools ifconfig
, 4 anni dopo che la patch era stata scritta.)
Invece, alcune persone hanno completamente reinventato il set di strumenti come ip
comando, che utilizzava la nuova API di Linux, aveva una sintassi diversa e combinava diverse altre funzioni dietro un elegante command subcommand
interfaccia in stile.
Avevo bisogno di un ifconfig
che aveva la sintassi della riga di comando e lo stile di output del ifconfig
di FreeBSD (che né GNU né NET-3 ifconfig
ha, e quale ip
sicuramente non ha). Così ne ho scritto uno. Come prova che si potrebbe scrivere un ifconfig
che usa l'API netlink su Linux, lo fa.
Quindi la saggezza ricevuta su ifconfig
, come quello che citi, non è più vero. ora non è vero per dire che "ifconfig
non usa netlink.". La coperta che copriva due non copre tre.
lo è sempre stato falso dire che "netlink è più efficiente". Per le attività che si fanno con ifconfig
, non c'è molto da fare quando si tratta di efficienza tra l'API netlink e il ioctl()
API. Uno effettua più o meno lo stesso numero di chiamate API per una determinata attività.
Infatti, ogni chiamata API è due chiamate di sistema nel caso netlink, al contrario di una nel 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 informa 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 da ifconfig
. Non è più versatile semplicemente grazie all'API che utilizza internamente per eseguire quelle attività extra. Non c'è nulla di inerente all'API su questo. Si potrebbe scrivere uno strumento all-in-one che utilizza il ioctl()
di FreeBSD API, ad esempio, e afferma altrettanto bene che è "più versatile" del singolo ifconfig
, route
, arp
e ndp
comandi.
Si potrebbe scrivere route
, arp
e ndp
comandi per Linux che utilizzavano anche l'API netlink.
Ulteriori letture
- Jonathan de Boyne Pollard (2019).
ifconfig
. Guida nosh . Software. - Eduardo Ferro (2009-04-16). ifconfig:riporta indirizzo IP/patch iniziale errati . Errore Debian n. 359676.
Lo standard ifconfig
che abbiamo in molte distribuzioni è deprecato per diversi motivi. Dialoga in modo obsoleto e limitato con il kernel, e di fatto non comprende più tutte le configurazioni di rete. Non sarai in grado di manipolare alcune configurazioni di rete come ifconfig
versioni che puoi fare con ip
. Inoltre, il ifconfig
il supporto per gli spazi dei nomi di rete è limitato.
Come racconto aneddotico, ho trovato alias IP dell'interfaccia che sono visibili solo in ip
e non in SuSE ifconfig
.
Per quanto riguarda le differenze sotto il cofano:da ifconfig vs ip:qual è la differenza e confronto della configurazione di rete
Sebbene
ip
potrebbe sembrare un po' complesso a prima vista, ma ha funzionalità molto più ampie rispetto a ifconfig. È funzionalmente organizzato su due livelli di Networking Stack, ovvero Layer 2 (Link Layer), Layer 3 (IP Layer) e fa il lavoro di tutti i comandi sopra menzionati dal pacchetto net-tools.Mentre
ifconfig
principalmente visualizza o modifica le interfacce di un sistema, questo comando è in grado di svolgere le seguenti attività:
Visualizzazione o modifica delle proprietà dell'interfaccia.
Aggiunta, rimozione di voci della cache ARP insieme alla creazione di una nuova voce ARP statica per un host.
Visualizzazione degli indirizzi MAC associati a tutte le interfacce.
Visualizzazione e modifica delle tabelle di routing del kernel.
Uno dei punti salienti principali che lo separa dalla sua antica controparte ifconfig è che quest'ultimo utilizza ioctl per la configurazione di rete, che è un modo meno apprezzato di interazione con il kernel mentre il primo sfrutta il meccanismo del socket netlink per lo stesso che è un successore molto più flessibile di ioctl per inter- comunicazione tra il kernel e lo spazio utente usando rtnetlink (che aggiunge capacità di manipolazione dell'ambiente di rete).
Informazioni sull'uso/vantaggi di netlink:Da LJ - Kernel Korner - Perché e come usare 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 tra i due tramite API socket standard per i processi in spazio utente e un'API kernel speciale per i moduli kernel. Il socket Netlink utilizza la famiglia di indirizzi AF_NETLINK.
......
Perché le funzionalità di cui sopra usano netlink invece di chiamate di sistema, ioctl o filesystem proc per la comunicazione tra utenti e mondi del kernel? È un compito non banale aggiungere chiamate di sistema, ioctls o file proc per nuove funzionalità; rischiamo di inquinare il kernel e danneggiare la stabilità del sistema. Il socket netlink è semplice, però:solo una costante, il tipo di protocollo, deve essere aggiunta a netlink.h. Quindi, il modulo del kernel e l'applicazione possono comunicare utilizzando API in stile socket immediatamente.
....
Il socket Netlink è un'interfaccia flessibile per la comunicazione tra applicazioni in spazio utente e moduli del kernel. Fornisce un'API socket facile da usare sia per le applicazioni che per il kernel. Fornisce funzionalità di comunicazione avanzate, come full-duplex, I/O con buffer, comunicazione multicast e asincrona, che sono assenti in altri IPC kernel/spazio utente.