La familia de sockets Netlink es una interfaz del kernel de Linux que se utiliza para la comunicación entre procesos (IPC) entre los procesos del kernel y del espacio de usuario , y entre diferentes procesos del espacio de usuario, de manera similar a los sockets de dominio de Unix . 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 de Unix usan el espacio de nombres del sistema de archivos , los procesos de Netlink generalmente se dirigen mediante identificadores de proceso (PID). [3]
Lanzamiento estable | 5.12.9 [1] (3 de junio de 2021 ) [±] |
---|---|
Versión de vista previa | 5.13-rc5 [2] (6 de junio de 2021 ) [±] |
Sistema operativo | Linux |
Plataforma | Kernel de Linux |
Tipo | Interfaz de programación de aplicaciones |
Licencia | Licencia pública general GNU |
Sitio web | wiki |
Netlink está diseñado y utilizado para transferir información de red diversa entre el espacio del kernel y los procesos del espacio de usuario. Las utilidades de red, como la familia iproute2 y las utilidades que se utilizan para configurar los controladores inalámbricos basados en mac80211 , utilizan Netlink para comunicarse con el kernel de Linux desde el espacio de usuario. Netlink proporciona una interfaz estándar basada en sockets para los procesos del espacio de usuario y una API del lado del kernel para uso interno de los módulos del kernel . Originalmente, Netlink usaba la AF_NETLINK
familia de sockets.
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 incómodo ioctl
método de comunicación utilizado para configurar y obtener opciones de conectores externos. El kernel de Linux sigue ioctl
admitiendo la compatibilidad con 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 está obsoleta, pero todavía constituye 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.
Estructura del paquete
Desplazamiento de bits | 0-15 | 16–31 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Longitud del mensaje | |||||||||||||||||||||||||||||||
32 | Tipo | Banderas | ||||||||||||||||||||||||||||||
64 | Secuencia de números | |||||||||||||||||||||||||||||||
96 | PID | |||||||||||||||||||||||||||||||
128+ | Datos |
A diferencia de los sockets BSD que utilizan protocolos de Internet como TCP , donde los encabezados de los mensajes se generan automáticamente, struct nlmsghdr
la persona que llama debe preparar el encabezado del mensaje Netlink (disponible como ). El zócalo Netlink generalmente funciona en un SOCK_RAW
modo similar, incluso si SOCK_DGRAM
se usó para crearlo.
La porción de datos contiene entonces un mensaje específico del subsistema que puede anidarse más.
Familias de sockets Netlink
La AF_NETLINK
familia ofrece múltiples subconjuntos de protocolos. Cada uno se conecta a un componente del kernel diferente y tiene un subconjunto de mensajería diferente. El campo de protocolo hace referencia al subconjunto en la llamada de socket:
int socket (AF_NETLINK, SOCK_DGRAM o SOCK_RAW, protocolo )
Carecen de un estándar SOCK_DGRAM
y SOCK_RAW
no se garantiza que se implementen en una versión determinada de Linux (u otro sistema operativo). Algunas fuentes afirman que ambas opciones son legítimas, y la siguiente referencia de Red Hat indica que SOCK_RAW
siempre es el parámetro. Sin embargo, iproute2 usa ambos indistintamente.
Protocolos de netlink
A continuación, se incluye una lista no exhaustiva de las entradas de protocolo admitidas :
- NETLINK_ROUTE
NETLINK_ROUTE
proporciona información de enrutamiento y enlace. Esta información se utiliza principalmente para demonios de enrutamiento de 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
- Las tablas de enrutamiento: RTM_NEWROUTE , RTM_DELROUTE , RTM_GETROUTE
- Caché vecino: 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
- NETLINK_FIREWALL
NETLINK_FIREWALL
proporciona una interfaz para que una aplicación de espacio de usuario reciba paquetes del firewall .
- NETLINK_NFLOG
NETLINK_NFLOG
proporciona una interfaz utilizada para comunicarse entre Netfilter e iptables .
- NETLINK_ARPD
NETLINK_ARPD
proporciona una interfaz para administrar la tabla ARP desde el espacio de usuario.
- NETLINK_AUDIT
NETLINK_AUDIT
proporciona una interfaz para el subsistema de auditoría que se encuentra en las versiones 2.6.6 y posteriores del kernel de Linux.
- NETLINK_IP6_FW
NETLINK_IP6_FW
proporciona una interfaz para transportar paquetes desde netfilter al espacio de usuario.
- NETLINK_ROUTE6
- NETLINK_TAPBASE
- NETLINK_NETFILTER
- NETLINK_TCPDIAG
- NETLINK_XFRM
NETLINK_XFRM
proporciona una interfaz para administrar la asociación de seguridad IPsec y las bases de datos de políticas de seguridad, que la utilizan principalmente los demonios administradores de claves que utilizan el protocolo de intercambio de claves de Internet .
- NETLINK_KOBJECT_UEVENT
NETLINK_KOBJECT_UEVENT
proporciona la interfaz en la que el kernel transmite uevents, normalmente consumidos por udev .
- NETLINK_GENERIC
Uno de los inconvenientes del protocolo Netlink es que el número de familias de protocolos está limitado a 32 ( MAX_LINKS
). Ésta es una de las principales razones por las que se creó la familia Netlink genérica: para brindar soporte para agregar un mayor número de familias. Actúa como un multiplexor Netlink y trabaja 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 kernel. Esto permite el desarrollo de protocolos Netlink adicionales para abordar nuevos módulos del kernel. [6]
Ver también
- Comparación de controladores inalámbricos de código abierto : los controladores basados en mac80211 confían en Netlink como API para el espacio del usuario
- POSIX
Referencias
- ^ Kroah-Hartman, Greg (3 de junio de 2021). "Linux 5.12.9" . LKML (lista de correo) . Consultado el 3 de junio de 2021 .
- ^ Torvalds, Linus (6 de junio de 2021). "Linux 5.13-rc5" . LKML (lista de correo) . Consultado el 7 de junio de 2021 .
- ^ "NETLINK (7) - Manual del programador de Linux" .
- ^ "kernel / git / torvalds / linux.git: root / net / core / rtnetlink.c" . Árbol de fuentes 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 Wiley Networking Council. Wiley . pag. 624. ISBN 9780471408826. Consultado el 21 de mayo de 2013 .
Todos los mensajes rtnetlink constan de un encabezado de mensaje netlink y atributos adjuntos.
- ^ Por qué y cómo utilizar Netlink Sockets
enlaces externos
- Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefèvre. Comunicación entre el kernel y el espacio de usuario en Linux usando sockets Netlink. Software: Practice and Experience, 40 (9): 797-810, agosto de 2010
- Por qué y cómo utilizar Netlink Sockets
- RFC 3549
- https://netfilter.org/projects/libmnl/ - Biblioteca minimalista para Netlink - biblioteca de espacio de usuario para la construcción y análisis de mensajes Netlink
- https://www.infradead.org/~tgr/libnl - 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
- Enchufes Netlink: descripción general
- Conjunto de bibliotecas de protocolos Netlink
- "Linux Kernel Networking" por Rami Rosen, Apress 2013: Capítulo 2, Netlink Sockets