El ifconfig
El comando en sistemas operativos como FreeBSD y OpenBSD se actualizó en línea con el resto del sistema operativo. Hoy en día puede configurar todo tipo de configuraciones de interfaz de red en esos sistemas operativos y manejar una variedad de protocolos de red. Los BSD proporcionan ioctl()
apoyo para estas cosas.
Esto no sucedió en el mundo de Linux. Hay, hoy, tres ifconfig
comandos:
ifconfig
de 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
de NET-3 herramientas de redjdebp % 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
de (versión 1.40 de) el conjunto de herramientas 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 %
Como puede ver, GNU inetutils y NET-3 net-tools ifconfig
Los s tienen algunas deficiencias marcadas, con respecto a IPv6, con respecto a las interfaces que tienen varias direcciones y con respecto a la funcionalidad como -l
.
El problema de IPv6 es, en parte, algún código faltante en las propias herramientas. Pero, en general, se debe al hecho de que Linux no proporciona (como lo hacen otros sistemas operativos) la funcionalidad de IPv6 a través del ioctl()
interfaz. Solo permite que los programas vean y manipulen direcciones IPv4 a través de la red ioctl()
s.
En cambio, Linux proporciona esta funcionalidad a través de una interfaz diferente, send()
y recv()
en una familia de sockets de dirección especial, y algo extraña, AF_NETLINK
.
El GNU y NET-3 ifconfig
s podría se han ajustado para usar esta nueva API. El argumento en contra de hacerlo era que no era portable a otros sistemas operativos, pero estos programas en la práctica ya no es portátil de todos modos así que eso no fue un gran argumento.
Pero no fueron ajustados, y permanecen como se ha dicho hasta el día de hoy. (Algunas personas trabajaron en ellos en varios puntos a lo largo de los años, pero las mejoras, lamentablemente, nunca llegaron a los programas. Por ejemplo:Bernd Eckenfels nunca aceptó un parche que agregara alguna capacidad de API de enlace de red a NET-3 net-tools ifconfig
, 4 años después de que se escribiera el parche).
En cambio, algunas personas reinventaron por completo el conjunto de herramientas como un ip
comando, que usaba la nueva API de Linux, tenía una sintaxis diferente y combinaba varias otras funciones detrás de un moderno command subcommand
interfaz de estilo.
Necesitaba un ifconfig
que tenía la sintaxis de línea de comandos y el estilo de salida de FreeBSD ifconfig
(que ni el GNU ni el NET-3 ifconfig
tiene, y que ip
ciertamente no tiene). Así que escribí uno. Como prueba de que uno podría escribir un ifconfig
que usa la API netlink en Linux, lo hace.
Así que la sabiduría recibida sobre ifconfig
, como lo que cita, ya no es realmente cierto. Es ahora falso decir que "ifconfig
no usa netlink". La manta que cubría a dos no cubre a tres.
siempre ha sido falso decir que "netlink es más eficiente". Para las tareas que uno hace con ifconfig
, realmente no hay mucho en lo que respecta a la eficiencia entre la API de netlink y el ioctl()
API. Uno hace prácticamente la misma cantidad de llamadas a la API para cualquier tarea determinada.
De hecho, cada llamada a la API es dos llamadas al sistema en el caso de enlace de red, a diferencia de una en el ioctl()
sistema. Y podría decirse que la API de netlink tiene la desventaja de que, en un sistema muy utilizado, incorpora explícitamente la posibilidad de que la herramienta nunca reciba un mensaje de reconocimiento que le informe del resultado de la llamada a la API.
Además, es falso decir que ip
es "más versátil" que GNU y NET-3 ifconfig
s porque usa netlink . Es más versátil porque hace más tareas, haciendo cosas en un gran programa que uno haría con programas separados diferentes a ifconfig
. No es más versátil simplemente a fuerza de la API que utiliza internamente para realizar esas tareas adicionales. No hay nada inherente a la API sobre esto. Se podría escribir una herramienta todo en uno que usara FreeBSD ioctl()
API, por ejemplo, e igualmente afirman que es "más versátil" que el ifconfig
individual , route
, arp
y ndp
comandos.
Se podría escribir route
, arp
y ndp
comandos para Linux que también usaban la API de netlink.
Lecturas adicionales
- Jonathan de Boyne Pollard (2019).
ifconfig
. Guía de comida . Software. - Eduardo Ferro (2009-04-16). ifconfig:informa dirección IP incorrecta/parche inicial . Error de Debian n.° 359676.
El estándar ifconfig
que tenemos en muchas distribuciones está en desuso por varias razones. Habla de forma obsoleta y limitada con el kernel y, de hecho, ya no entiende todas las configuraciones de red. No podrá manipular algunas configuraciones de red como ifconfig
versiones que puedes hacer con ip
. Además, el ifconfig
la compatibilidad con espacios de nombres de red es limitada.
Como anécdota, encontré alias de IP de interfaz que solo son visibles en ip
y no en SuSE ifconfig
.
En cuanto a las diferencias debajo del capó:de ifconfig vs ip:¿Cuál es la diferencia y comparación de la configuración de red?
Aunque ip
puede parecer un poco complejo al principio, pero tiene una funcionalidad mucho más amplia que ifconfig. Está funcionalmente organizado en dos capas de Networking Stack, es decir, la capa 2 (capa de enlace), la capa 3 (capa IP) y realiza el trabajo de todos los comandos mencionados anteriormente del paquete de herramientas de red.
Mientras que ifconfig
principalmente muestra o modifica las interfaces de un sistema, este comando es capaz de realizar las siguientes tareas:
-
Mostrar o modificar las propiedades de la interfaz.
-
Adición, eliminación de entradas de caché ARP junto con la creación de una nueva entrada ARP estática para un host.
-
Visualización de direcciones MAC asociadas a todas las interfaces.
-
Visualización y modificación de tablas de enrutamiento del núcleo.
Uno de los aspectos más destacados que lo separa de su antiguo homólogo ifconfig es que este último utiliza ioctl para la configuración de la red, que es una forma menos apreciada de interacción con el kernel, mientras que el primero aprovecha el mecanismo de conexión de red para el mismo, que es un sucesor mucho más flexible de ioctl para la interconexión. comunicación entre el kernel y el espacio del usuario usando rtnetlink (que agrega la capacidad de manipulación del entorno de red).
Acerca del uso/ventajas de netlink:De LJ - Kernel Korner - Por qué y cómo usar Netlink Socket
El socket Netlink es un IPC especial que se utiliza para transferir información entre el núcleo y los procesos del espacio del usuario. Proporciona un vínculo de comunicación de dúplex completo entre los dos mediante API de socket estándar para procesos de espacio de usuario y una API de kernel especial para módulos de kernel. El socket de Netlink utiliza la familia de direcciones AF_NETLINK.
.....
¿Por qué las funciones anteriores usan netlink en lugar de llamadas al sistema, ioctls o sistemas de archivos proc para la comunicación entre el mundo del usuario y el kernel? No es una tarea trivial agregar llamadas al sistema, ioctls o archivos proc para nuevas funciones; corremos el riesgo de contaminar el núcleo y dañar la estabilidad del sistema. Sin embargo, el socket de Netlink es simple:solo se debe agregar una constante, el tipo de protocolo, a netlink.h. Entonces, el módulo del kernel y la aplicación pueden hablar usando API de estilo socket inmediatamente.
....
El socket Netlink es una interfaz flexible para la comunicación entre aplicaciones de espacio de usuario y módulos del kernel. Proporciona una API de socket fácil de usar tanto para las aplicaciones como para el kernel. Proporciona funciones de comunicación avanzadas, como full-duplex, E/S en búfer, multidifusión y comunicación asincrónica, que están ausentes en otros IPC de kernel/espacio de usuario.