Netlink es una familia de sockets que se utiliza para la comunicación entre procesos (IPC) tanto entre los procesos del núcleo como del espacio de usuario , y entre diferentes procesos del espacio de usuario, de forma similar a los sockets de dominio Unix disponibles en ciertos sistemas operativos similares a Unix , incluida su encarnación original como una interfaz del núcleo de Linux , así como en la forma de una implementación posterior en FreeBSD . [2] De manera similar a los sockets de dominio Unix , y a diferencia de los sockets INET , la comunicación Netlink no puede atravesar los límites del host. Sin embargo, mientras que los sockets de dominio Unix utilizan el espacio de nombres del sistema de archivos , los sockets Netlink suelen direccionarse mediante identificadores de proceso (PID). [3]
Netlink está diseñado y se utiliza para transferir información de red diversa entre los procesos del espacio del núcleo y del espacio del usuario. Las utilidades de red, como la familia iproute2 y las utilidades utilizadas para configurar controladores inalámbricos basados en mac80211 , utilizan Netlink para comunicarse con el núcleo de Linux desde el espacio del usuario. Netlink proporciona una interfaz estándar basada en socket para los procesos del espacio del usuario y una API del lado del núcleo para uso interno de los módulos del núcleo . Originalmente, Netlink utilizaba la AF_NETLINKfamilia socket.
Netlink está diseñado para ser un sucesor más flexible de ioctl ; RFC 3549 describe el protocolo en detalle.
Historia
Netlink fue creado por Alexey Kuznetsov [4] como una alternativa más flexible al sofisticado pero complicado ioctlmétodo de comunicación utilizado para configurar y obtener opciones de sockets externos. El núcleo de Linux sigue siendo compatible ioctlcon versiones anteriores.
Netlink se proporcionó por primera vez en la serie 2.0 del kernel de Linux, implementado como un dispositivo de caracteres . Para 2013, esta interfaz quedó obsoleta, pero aún forma un método de comunicación ioctl ; compare el uso de rtnetlink. [5] La interfaz de socket Netlink apareció en la serie 2.2 del kernel de Linux.
En 2022, se agregó soporte experimental para el protocolo Netlink a FreeBSD. Inicialmente, solo se admitía un subconjunto de la familia NETLINK_ROUTE y NETLINK_GENERIC. [2]
Estructura del paquete
A diferencia de los sockets BSD que utilizan protocolos de Internet como TCP , donde los encabezados de los mensajes se generan automáticamente, el encabezado del mensaje Netlink (disponible como struct nlmsghdr) debe ser preparado por el autor de la llamada. El socket Netlink generalmente funciona en un SOCK_RAWmodo similar a , incluso si SOCK_DGRAMse utilizó para crearlo.
La parte de datos contiene entonces un mensaje específico del subsistema que puede estar aún más anidado.
Familias de conectores Netlink
La AF_NETLINKfamilia ofrece múltiples subconjuntos de protocolos. Cada uno interactúa con un componente de kernel diferente y tiene un subconjunto de mensajería diferente. El subconjunto se referencia mediante el campo de protocolo en la llamada de socket:
int socket(AF_NETLINK, SOCK_DGRAM o SOCK_RAW, protocolo )
No existe un estándar SOCK_DGRAMy SOCK_RAWno se garantiza su implementación en una versión determinada de Linux (u otro sistema operativo). Algunas fuentes afirman que ambas opciones son legítimas y la referencia a continuación de Red Hat indica que SOCK_RAWsiempre es el parámetro. Sin embargo, iproute2 usa ambos indistintamente.
Protocolos Netlink
A continuación se muestra una lista no exhaustiva de las entradas de protocolo admitidas :
- RUTA DE ENLACE DE RED
NETLINK_ROUTEProporciona información de enrutamiento y enlaces. Esta información se utiliza principalmente para los daemons de enrutamiento del espacio de usuario. Linux implementa un gran subconjunto de mensajes:
- Capa de enlace: RTM_NEWLINK , RTM_DELLINK , RTM_GETLINK , RTM_SETLINK
- Configuración de dirección: RTM_NEWADDR , RTM_DELADDR , RTM_GETADDR
- Tablas de enrutamiento: RTM_NEWROUTE , RTM_DELROUTE , RTM_GETROUTE
- Caché vecina: RTM_NEWNEIGH , RTM_DELNEIGH , RTM_GETNEIGH
- Reglas de enrutamiento: RTM_NEWRULE , RTM_DELRULE , RTM_GETRULE
- Configuración de disciplina de cola: RTM_NEWQDISC , RTM_DELQDISC , RTM_GETQDISC
- Clases de tráfico utilizadas con colas: RTM_NEWTCLASS , RTM_DELTCLASS , RTM_GETTCLASS
- Filtros de tráfico: RTM_NEWTFILTER , RTM_DELTFILTER , RTM_GETTFILTER
- Otros: RTM_NEWACTION , RTM_DELACTION , RTM_GETACTION , RTM_NEWPREFIX , RTM_GETPREFIX , RTM_GETMULTICAST , RTM_GETANYCAST , RTM_NEWNEIGHTBL , RTM_GETNEIGHTBL , RTM_SETNEIGHTBL
- CORTAFUEGOS DE ENLACE DE RED
NETLINK_FIREWALLproporciona una interfaz para que una aplicación de espacio de usuario reciba paquetes del firewall .
- Enlace de red_NFLOG
NETLINK_NFLOGProporciona una interfaz utilizada para comunicarse entre Netfilter e iptables .
- Enlace de red ARPD
NETLINK_ARPDProporciona una interfaz para administrar la tabla ARP desde el espacio de usuario.
- AUDITORÍA DE ENLACE DE RED
NETLINK_AUDITProporciona una interfaz al subsistema de auditoría que se encuentra en las versiones del kernel de Linux 2.6.6 y posteriores.
- Enlace de red IP6
NETLINK_IP6_FWProporciona una interfaz para transportar paquetes desde netfilter al espacio del usuario.
- RUTA DE ENLACE DE RED6
- BASE DE ENLACE DE RED
- FILTRO DE RED DE ENLACE DE RED
- Enlace de red TCPDIAG
- Enlace de red XFRM
NETLINK_XFRMProporciona una interfaz para administrar la asociación de seguridad IPsec y las bases de datos de políticas de seguridad, utilizadas principalmente por daemons administradores de claves que utilizan el protocolo de intercambio de claves de Internet .
- ENLACE DE RED_OBJETO_UEVENT
NETLINK_KOBJECT_UEVENTproporciona la interfaz en la que el núcleo transmite uevents, normalmente consumidos por udev .
- NETLINK_GENÉRICO
Una de las desventajas del protocolo Netlink es que el número de familias de protocolos está limitado a 32 ( MAX_LINKS). Esta es una de las principales razones por las que se creó la familia Netlink genérica: para brindar soporte para agregar una mayor cantidad de familias. Actúa como un multiplexor Netlink y funciona con una sola familia Netlink NETLINK_GENERIC. El protocolo Netlink genérico se basa en el protocolo Netlink y utiliza su API.
Protocolo Netlink definido por el usuario
Los usuarios pueden agregar un controlador Netlink en sus propias rutinas del núcleo. Esto permite el desarrollo de protocolos Netlink adicionales para abordar nuevos módulos del núcleo. [6]
Véase también
- Comparación de controladores inalámbricos de código abierto : los controladores basados en mac80211 se basan en Netlink como API para el espacio de usuario
- Sistema de archivos POSIX
Referencias
- ^ Greg Kroah-Hartman (22 de octubre de 2024). «Linux 6.11.5» . Consultado el 22 de octubre de 2024 .
- ^ ab "netlink: agregar soporte para netlink".
- ^ "netlink(7) - Página del manual de Linux". man7.org .
- ^ "kernel/git/torvalds/linux.git: root/net/core/rtnetlink.c". Árbol de código fuente del kernel de Linux . kernel.org . Consultado el 27 de mayo de 2014 .
- ^ Crowcroft, Jon ; Phillips, Iain, eds. (2002). Implementación del protocolo TCP/IP y Linux: código de sistemas para Internet Linux. Serie del Consejo de Redes de Wiley. Wiley . p. 624. ISBN 9780471408826. Recuperado el 21 de mayo de 2013.
Todos los mensajes rtnetlink constan de un encabezado de mensaje netlink y atributos adjuntos.
- ^ "Kernel Korner - Por qué y cómo utilizar Netlink Socket | Linux Journal". www.linuxjournal.com .
Enlaces externos
- Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefèvre. Comunicación entre el núcleo y el espacio de usuario en Linux mediante sockets Netlink. Software: Practice and Experience, 40(9):797-810, agosto de 2010
- Por qué y cómo utilizar los sockets Netlink
- RFC 3549
- Página de inicio del proyecto netfilter/iptables - El proyecto "libmnl" de netfilter.org – Biblioteca minimalista para Netlink – biblioteca de espacio de usuario para la construcción y análisis de mensajes Netlink
- libnl - Netlink Protocol Library Suite – Netlink Protocol Library Suite: biblioteca funcional completa que cubre casi todos los aspectos del trabajo con sockets Netlink
- Manipulación del entorno de red mediante RTNETLINK
- Sockets Netlink: descripción general
- Conjunto de bibliotecas de protocolos Netlink
- "Redes del kernel de Linux" por Rami Rosen, Apress 2013: Capítulo 2, Sockets Netlink