ip vs ifconfig befiehlt Vor- und Nachteile

28

Irgendwann wird in einigen Lehrmaterialien (von Linux Foundation) zu Linux, auf die ich gestoßen bin, Folgendes erwähnt:

ipBefehl ist vielseitiger und effizienter als ifconfigweil er Netlink- Sockets anstelle von ioctl -Systemaufrufen verwendet.

Kann jemand etwas dazu sagen, weil ich nicht verstehe, was unter der Haube vor sich geht?

PS Ich kenne dieses Thema zu diesen Tools, aber es geht nicht auf diesen spezifischen Unterschied bei der Funktionsweise ein

Karamol
quelle

Antworten:

39

Der ifconfigBefehl auf Betriebssystemen wie FreeBSD und OpenBSD wurde entsprechend dem Rest des Betriebssystems aktualisiert. Es kann heutzutage alle Arten von Netzwerkschnittstelleneinstellungen auf diesen Betriebssystemen konfigurieren und eine Reihe von Netzwerkprotokollen verarbeiten. Die BSDs bieten ioctl()Unterstützung für diese Dinge.

Dies war in der Linux-Welt nicht der Fall. Heute gibt es drei ifconfigBefehle:

  • ifconfigvon GNU inetutils
    jdebp% inetutils-ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% inetutils-ifconfig lo
    lo Link encap: Lokales Loopback
          inet addr: 127.0.0.1 Bcast: 0.0.0.0 Mask: 255.0.0.0
          UP LOOPBACK RUNNING MTU: 65536 Metrisch: 1
          RX-Pakete: 9087 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
          TX-Pakete: 9087 Fehler: 0 verworfen: 0 Überschreitungen: 0 Träger: 0
          Kollisionen: 0 txqueuelen: 1000
          Empfangsbytes: 51214341 Sendebytes: 51214341
    jdebp%
  • ifconfigvon NET-3 net-tools
    jdebp% ifconfig -l
    ifconfig: Option --help 'gibt Informationen zur Verwendung.-l' not recognised.
    ifconfig:
    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-Pakete 9087 Bytes 51214341 (48,8 MiB)
        RX-Fehler 0 fallen gelassen 0 überschreitet 0 Frame 0
        TX-Pakete 9087 Bytes 51214341 (48,8 MiB)
        TX-Fehler 0 fallen gelassen 0 Überholungen 0 Träger 0 Kollisionen 0
    jdebp%
  • ifconfigaus dem nosh toolset (version 1.40)
    jdebp% ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% ifconfig lo
    lo
        Link up Loopback läuft
        Verbindungsadresse 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        inet4-Adresse 127.0.0.1 Präfix 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 adresse 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 läuft
        Verbindungsadresse 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        inet4-Adresse 127.0.0.1 Präfix 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 adresse fe80 :: scope 1 prefixlen 10 
        inet6 address :: 1 scope 0 prefixlen 128 
    jdebp% 

Wie Sie sehen können, weisen die GNU-Inetutils und NET-3-Net-Tools ifconfigeinige deutliche Mängel in Bezug auf IPv6, in Bezug auf Schnittstellen mit mehreren Adressen und in Bezug auf Funktionen wie -l.

Das IPv6-Problem besteht zum Teil darin, dass in den Tools selbst Code fehlt. Dies liegt hauptsächlich daran, dass Linux (wie andere Betriebssysteme auch) keine IPv6-Funktionalität über die ioctl()Schnittstelle bereitstellt. Hiermit können Programme nur IPv4-Adressen über das Netzwerk anzeigen und bearbeiten ioctl().

Linux bietet diese Funktionalität stattdessen über eine andere Oberfläche send()und recv()über eine spezielle, etwas merkwürdige Adressfamilie von Sockets AF_NETLINK.

Das GNU und NET-3 ifconfigs könnte angepasst wurde , um diese neue API zu verwenden. Das Argument gegen so tun war , dass es auf andere Betriebssysteme nicht tragbar war, aber diese Programme in der Praxis waren bereits nicht tragbar sowieso , so dass nicht viel von einem Argument war.

Sie wurden jedoch nicht angepasst und sind bis heute unverändert geblieben. (Einige Leute haben im Laufe der Jahre an verschiedenen Stellen daran gearbeitet, aber die Verbesserungen haben es leider nie in die Programme geschafft. Zum Beispiel: Bernd Eckenfels hat nie einen Patch akzeptiert , mit dem NET-3-Netzwerktools um einige Netlink-API-Funktionen erweitert wurden ifconfig, 4 Jahre nachdem der Patch geschrieben wurde.)

Stattdessen haben einige das Toolset als ipBefehl völlig neu erfunden , der die neue Linux-API verwendete, eine andere Syntax aufwies und mehrere andere Funktionen hinter einer modischen Oberfläche kombinierte .command subcommand

Ich brauchte eine ifconfig, die die Befehlszeilensyntax und den Ausgabestil von FreeBSD hatte ifconfig(die weder GNU noch NET-3 ifconfighaben und die es mit ipSicherheit nicht hat). Also habe ich einen geschrieben. Als Beweis dafür, dass man ein ifconfigProgramm schreiben kann , das die netlink-API unter Linux verwendet, ist dies der Fall.

Die erhaltene Weisheit darüber ifconfig, wie Sie es zitieren, ist also nicht mehr wirklich wahr. Es ist jetztifconfig falsch zu sagen, dass " Netlink nicht verwendet". Die Decke, die zwei bedeckt, bedeckt nicht drei.

Es war schon immer falsch zu sagen, dass "netlink effizienter ist". Für die Aufgaben, die man erledigt ifconfig, steckt nicht wirklich viel darin, wenn es um die Effizienz zwischen der Netlink-API und der ioctl()API geht. Man führt für jede Aufgabe so ziemlich die gleiche Anzahl von API-Aufrufen durch.

In der Tat besteht jeder API-Aufruf im Fall von Netlink aus zwei Systemaufrufen, im Gegensatz zu einem im ioctl()System. Und die Netlink-API hat wohl den Nachteil, dass sie auf einem stark genutzten System explizit die Möglichkeit beinhaltet, dass das Tool niemals eine Bestätigungsnachricht erhält, die es über das Ergebnis des API-Aufrufs informiert.

Es ist darüber hinaus unwahr zu sagen , dass ip„vielseitige“ als das GNU und NET-3 ifconfigs , weil es netlink verwendet . Es ist vielseitiger, weil es mehr Aufgaben erledigt, als mit anderen Programmen ifconfig. Einfach aufgrund der API, die es intern zur Ausführung dieser zusätzlichen Aufgaben verwendet, ist es nicht vielseitiger. Die API hat nichts damit zu tun. Man könnte ein All-in-one - Tool schreiben, die die FreeBSD verwendet ioctl()API, zum Beispiel, und gleichermaßen gut Zustand , dass es „vielseitigen“ als die einzelnen ifconfig, route, arp, und ndpBefehle.

Man könnte , und Befehle für Linux schreiben route, die auch die Netlink-API verwenden.arpndp

Weitere Lektüre

JdeBP
quelle
Ich denke, Sie lesen zu viel in der Behauptung "vielseitiger". IMHO heißt es nur, dass Netlink das ist, was ipvielseitiger macht , weil alle Arten von coolen Funktionen mit ioctls unter Linux einfach unmöglich sind (weil die ioctls nicht da sind und wahrscheinlich niemals da sein werden).
TooTea
1
"netlink macht ip vielseitiger" ist dasselbe wie "ip ist vielseitiger, weil es netlink verwendet", was genau dort in Frage kommt .
JdeBP
8

Der Standard, den ifconfigwir in vielen Distributionen haben, ist aus mehreren Gründen veraltet. Spricht in veralteter und eingeschränkter Weise mit dem Kernel und versteht in der Tat nicht mehr alle Netzwerkkonfigurationen. Sie können einige Netzwerkkonfigurationen ifconfig, mit denen Sie arbeiten können, nicht manipulieren ip. Darüber hinaus ist die ifconfigUnterstützung für Netzwerknamespaces begrenzt.

Als Anekdote habe ich einen IP-Alias ​​für die Benutzeroberfläche gefunden, der nur in ipund nicht in SuSE sichtbar ist ifconfig.

Zu den Unterschieden unter der Haube: Von ifconfig zu ip: Was ist der Unterschied und der Vergleich der Netzwerkkonfiguration?

Obwohl ipvielleicht ein wenig kompliziert auf den ersten Seiten erscheinen , aber es ist viel breiter in der Funktionalität als ifconfig. Es ist funktional in zwei Schichten des Netzwerkstapels organisiert, nämlich Schicht 2 (Verbindungsschicht), Schicht 3 (IP-Schicht), und erledigt die Arbeit aller oben erwähnten Befehle aus dem Paket net-tools.

Während ifconfigmeistens die Schnittstellen eines Systems angezeigt oder geändert werden, kann dieser Befehl folgende Aufgaben ausführen:

  • Anzeigen oder Ändern von Schnittstelleneigenschaften.

  • Hinzufügen, Entfernen von ARP-Cache-Einträgen beim Erstellen eines neuen statischen ARP-Eintrags für einen Host.

  • Anzeigen der allen Schnittstellen zugeordneten MAC-Adressen.

  • Anzeigen und Ändern von Kernel-Routing-Tabellen.

Eines der Hauptmerkmale, das es von seinem alten Gegenstück ifconfig unterscheidet, ist, dass letzteres ioctl für die Netzwerkkonfiguration verwendet, eine weniger geschätzte Art der Interaktion mit dem Kernel, während erstere den Netlink-Socket-Mechanismus für denselben nutzt, der ein viel flexiblerer Nachfolger ist von ioctl für die Kommunikation zwischen Kernel und User Space mit rtnetlink (das die Manipulationsmöglichkeiten für die Netzwerkumgebung erweitert).

Über den Gebrauch / die Vorteile von Netlink: Von LJ - Kernel Korner - Warum und wie man Netlink Socket benutzt

Netlink Socket ist ein spezieller IPC, der zur Übertragung von Informationen zwischen Kernel- und User-Space-Prozessen verwendet wird. Es bietet eine Vollduplex-Kommunikationsverbindung zwischen den beiden über Standard-Socket-APIs für User-Space-Prozesse und eine spezielle Kernel-API für Kernel-Module. Netlink-Socket verwendet die Adressfamilie AF_NETLINK.

.....

Warum verwenden die oben genannten Features Netlink anstelle von Systemaufrufen, Ioctls oder Proc-Dateisystemen für die Kommunikation zwischen Benutzer- und Kernel-Welten? Es ist keine einfache Aufgabe, Systemaufrufe, ioctls oder proc-Dateien für neue Funktionen hinzuzufügen. Wir riskieren, den Kernel zu verschmutzen und die Stabilität des Systems zu beschädigen. Netlink-Socket ist jedoch einfach: Nur eine Konstante, der Protokolltyp, muss zu netlink.h hinzugefügt werden. Das Kernelmodul und die Anwendung können dann sofort mit Socket-ähnlichen APIs kommunizieren.

....

Netlink Socket ist eine flexible Schnittstelle für die Kommunikation zwischen User-Space-Anwendungen und Kernel-Modulen. Es bietet eine benutzerfreundliche Socket-API für Anwendungen und den Kernel. Es bietet erweiterte Kommunikationsfunktionen wie Vollduplex-, gepufferte E / A-, Multicast- und asynchrone Kommunikation, die in anderen Kernel- / User-Space-IPCs nicht vorhanden sind.

Rui F Ribeiro
quelle