ip vs ifconfig commande le pour et le contre


28

À un moment donné, dans du matériel pédagogique (de Linux Foundation) sur Linux que j'ai rencontré, ce qui suit est mentionné:

ipLa commande est plus polyvalente et plus efficace que ifconfigparce qu'elle utilise des sockets netlink plutôt que des appels système ioctl .

Quelqu'un peut-il élaborer un peu à ce sujet parce que je ne comprends pas ce qui se passe sous le capot?

PS Je connais ce sujet sur ces outils mais il ne traite pas de cette différence spécifique sur la façon dont ils fonctionnent

Réponses:


39

La ifconfigcommande sur les systèmes d'exploitation tels que FreeBSD et OpenBSD a été mise à jour en ligne avec le reste du système d'exploitation. De nos jours, il peut configurer toutes sortes de paramètres d'interface réseau sur ces systèmes d'exploitation et gérer une gamme de protocoles réseau. Les BSD ioctl()prennent en charge ces éléments.

Cela ne s'est pas produit dans le monde Linux. Il existe, aujourd'hui, trois ifconfigcommandes:

  • ifconfigde GNU inetutils
    jdebp% inetutils-ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% inetutils-ifconfig lo
    lo Link encap: boucle locale
          inet addr: 127.0.0.1 Bcast: 0.0.0.0 Mask: 255.0.0.0
          UP LOOPBACK RUNNING MTU: 65536 Métrique: 1
          Paquets RX: 9087 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
          Paquets TX: 9087 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
          collisions: 0 txqueuelen: 1000
          Octets RX: 51214341 Octets TX: 51214341
    jdebp%
  • ifconfigde NET-3 net-tools
    jdebp% ifconfig -l
    ifconfig: l'option --help 'donne des informations d'utilisation.-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 <hôte>
        inet6 :: 2 prefixlen 128 scopeid 0x80 <compat, global>
        inet6 fe80 :: prefixlen 10 scopeid 0x20 <link>
        boucle txqueuelen 1000 (boucle locale)
        Paquets RX 9087 octets 51214341 (48,8 Mio)
        Erreurs RX 0 supprimées 0 dépassements 0 trame 0
        Paquets TX 9087 octets 51214341 (48,8 Mio)
        Erreurs TX 0 abandonné 0 dépassements 0 porteuse 0 collisions 0
    jdebp%
  • ifconfigà partir de (la version 1.40 de) l'ensemble d'outils nosh
    jdebp% ifconfig -l
    enp14s0 enp15s0 lo
    jdebp% ifconfig lo
    lo
        relier le bouclage en cours d'exécution
        adresse du lien 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        adresse inet4 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 
        adresse inet4 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
        adresse inet6 :: 2 portée 0 préfixe 128 
        adresse inet6 fe80 :: scope 1 prefixlen 10 
        adresse inet6 :: 1 portée 0 préfixe 128
    jdebp% sudo ifconfig lo inet4 127.1.0.2 alias
    jdebp% sudo ifconfig lo inet6 :: 3/128 alias
    jdebp% ifconfig lo
    lo
        relier le bouclage en cours d'exécution
        adresse du lien 00: 00: 00: 00: 00: 00 bdaddr 00: 00: 00: 00: 00: 00 
        adresse inet4 127.0.0.1 prefixlen 8 bdaddr 127.0.0.1 
        adresse inet4 127.1.0.2 prefixlen 32 bdaddr 127.1.0.2 
        adresse inet4 127.53.0.1 prefixlen 8 bdaddr 127.255.255.255 
        adresse inet6 :: 3 portée 0 préfixe 128 
        adresse inet6 :: 2 portée 0 préfixe 128 
        adresse inet6 fe80 :: scope 1 prefixlen 10 
        adresse inet6 :: 1 portée 0 préfixe 128 
    jdebp% 

Comme vous pouvez le voir, les inetutils GNU et les net-tools NET-3 ifconfigont des lacunes marquées, par rapport à IPv6, par rapport aux interfaces qui ont plusieurs adresses, et par rapport aux fonctionnalités comme -l.

Le problème IPv6 est en partie du code manquant dans les outils eux-mêmes. Mais dans l'ensemble, cela est dû au fait que Linux ne fournit pas (comme les autres systèmes d'exploitation) la fonctionnalité IPv6 via l' ioctl()interface. Il permet uniquement aux programmes de voir et de manipuler les adresses IPv4 via les réseaux ioctl().

Linux fournit à la place cette fonctionnalité via une interface différente, send()et recv()sur une spéciale, et un peu étrange, famille d'adresses de sockets, AF_NETLINK.

GNU et NET-3 ifconfigs pourraient avoir été ajustés pour utiliser cette nouvelle API. L'argument contre cela était qu'il n'était pas portable sur d'autres systèmes d'exploitation, mais ces programmes n'étaient en fait déjà pas portables de toute façon, ce qui n'était pas vraiment un argument.

Mais ils n'ont pas été ajustés, et restent comme indiqué à ce jour. (Certaines personnes y ont travaillé à divers moments au fil des ans, mais les améliorations, malheureusement pour ne pas être entrées dans les programmes. Par exemple: Bernd Eckenfels n'a jamais accepté un correctif qui a ajouté une capacité d'API netlink aux net-tools NET-3. ifconfig, 4 ans après l'écriture du patch.)

Au lieu de cela, certaines personnes ont complètement réinventé le jeu d'outils en tant que ipcommande, qui utilisait la nouvelle API Linux, avait une syntaxe différente et combinait plusieurs autres fonctions derrière une interface de style à la mode .command subcommand

J'avais besoin d'un ifconfigqui avait la syntaxe de ligne de commande et le style de sortie de FreeBSD ifconfig(que ni GNU ni NET-3 n'ont ifconfig, et qui ipn'a certainement pas). J'en ai donc écrit un. Comme preuve que l'on pourrait écrire un ifconfigqui utilise l'API netlink sur Linux, il le fait.

Donc, la sagesse reçue ifconfig, comme ce que vous citez, n'est plus vraiment vraie. Il est désormais faux de dire que " ifconfign'utilise pas netlink". La couverture qui en couvrait deux ne couvre pas trois.

Il a toujours été faux de dire que "netlink est plus efficace". Pour les tâches que l'on fait ifconfig, il n'y a pas vraiment grand-chose en termes d'efficacité entre l'API netlink et l' ioctl()API. On fait à peu près le même nombre d'appels d'API pour une tâche donnée.

En effet, chaque appel d'API correspond à deux appels système dans le cas netlink, par opposition à un dans le ioctl()système. Et sans doute l'API netlink a l'inconvénient que sur un système très utilisé, elle intègre explicitement la possibilité que l'outil ne reçoive jamais de message d'accusé de réception l'informant du résultat de l'appel API.

Il est, en outre, faux de dire que ip« plus polyvalent » que GNU et NET-3 ifconfigs parce qu'il utilise NetLink . Il est plus polyvalent car il fait plus de tâches, en faisant des choses dans un grand programme que l'on ferait avec des programmes distincts autres que ifconfig . Il n'est pas plus polyvalent simplement grâce à l'API qu'il utilise en interne pour effectuer ces tâches supplémentaires. Il n'y a rien d'inhérent à l'API à ce sujet. On pourrait écrire un tout-en-un qui a utilisé le FreeBSD ioctl()API, par exemple, et aussi bien l' état qu'il est « plus souple » que l'individu ifconfig, route, arpet les ndpcommandes.

On pourrait aussi écrire route, arpet des ndpcommandes pour Linux qui utilisaient l'API netlink.

Lectures complémentaires


Je pense que vous lisez trop dans la revendication "plus polyvalente". À mon humble avis, il dit seulement que netlink est ce qui rend ipplus polyvalent, car toutes sortes de fonctionnalités intéressantes sont tout simplement impossibles à faire en utilisant ioctls sur Linux (car les ioctls ne sont pas là et ne le seront probablement jamais).
TooTea

1
"netlink est ce qui rend ip plus polyvalent" est le même que "ip est plus polyvalent car il utilise netlink", ce qui est juste là dans la question .
JdeBP

8

La norme que ifconfignous avons dans de nombreuses distributions est déconseillée pour plusieurs raisons. Parle de manière dépassée et limitée avec le noyau, et en fait, ne comprend plus toutes les configurations réseau. Vous ne serez pas en mesure de manipuler certaines configurations réseau telles ifconfigque les versions que vous pouvez utiliser ip. De plus, la ifconfigprise en charge des espaces de noms réseau est limitée.

Comme histoire anecdotique, j'ai trouvé un alias IP d'interface qui n'est visible que dans ipet non dans SuSE ifconfig.

Quant aux différences sous le capot: de ifconfig vs ip: quelle différence et comparaison de la configuration réseau

Bien que cela ippuisse sembler un peu complexe au premier site, sa fonctionnalité est bien plus large que ifconfig. Il est fonctionnellement organisé sur deux couches de Networking Stack, c'est-à-dire la couche 2 (couche de liaison), la couche 3 (couche IP) et fait le travail de toutes les commandes mentionnées ci-dessus à partir du package net-tools.

Bien qu'elle ifconfigaffiche ou modifie principalement les interfaces d'un système, cette commande est capable d'effectuer les tâches suivantes:

  • Affichage ou modification des propriétés de l'interface.

  • Ajout, suppression d'entrées de cache ARP lors de la création d'une nouvelle entrée ARP statique pour un hôte.

  • Affichage des adresses MAC associées à toutes les interfaces.

  • Affichage et modification des tables de routage du noyau.

L'un des principaux points forts qui le sépare de son ancien homologue ifconfig est que ce dernier utilise ioctl pour la configuration du réseau, ce qui est un moyen d'interaction moins apprécié avec le noyau tandis que l'ancien profite du mécanisme de socket netlink pour le même qui est un successeur beaucoup plus flexible d'ioctl pour l'intercommunication entre le noyau et l'espace utilisateur à l'aide de rtnetlink (qui ajoute une capacité de manipulation de l'environnement réseau).

À propos de l'utilisation / des avantages de netlink: De LJ - Kernel Korner - Pourquoi et comment utiliser Netlink Socket

La socket Netlink est un IPC spécial utilisé pour transférer des informations entre le noyau et les processus de l'espace utilisateur. Il fournit une liaison de communication en duplex intégral entre les deux via des API de socket standard pour les processus de l'espace utilisateur et une API de noyau spéciale pour les modules du noyau. Le socket Netlink utilise la famille d'adresses AF_NETLINK.

.....

Pourquoi les fonctionnalités ci-dessus utilisent-elles netlink au lieu d'appels système, d'ioctls ou de systèmes de fichiers proc pour la communication entre les mondes utilisateur et noyau? C'est une tâche non triviale d'ajouter des appels système, des ioctls ou des fichiers proc pour de nouvelles fonctionnalités; nous risquons de polluer le noyau et de nuire à la stabilité du système. Le socket Netlink est simple, cependant: seule une constante, le type de protocole, doit être ajoutée à netlink.h. Ensuite, le module du noyau et l'application peuvent parler immédiatement en utilisant des API de style socket.

....

La socket Netlink est une interface flexible pour la communication entre les applications de l'espace utilisateur et les modules du noyau. Il fournit une API de socket facile à utiliser pour les applications et le noyau. Il fournit des fonctionnalités de communication avancées, telles que le duplex intégral, les E / S tamponnées, la multidiffusion et la communication asynchrone, qui sont absentes dans d'autres IPC noyau / espace utilisateur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.