Netzlink - Netlink
Die Netlink- Socket- Familie ist eine Linux-Kernel-Schnittstelle, die für die Interprozess-Kommunikation (IPC) zwischen Kernel- und Userspace- Prozessen sowie zwischen verschiedenen Userspace-Prozessen verwendet wird, ähnlich den Unix-Domain-Sockets . Ähnlich wie bei den Unix-Domain-Sockets und im Gegensatz zu INET-Sockets kann die Netlink-Kommunikation keine Hostgrenzen überschreiten. Während die Unix-Domain-Sockets jedoch den Dateisystem- Namespace verwenden, werden Netlink-Prozesse normalerweise durch Prozesskennungen (PIDs) adressiert.
Netlink wurde für die Übertragung verschiedener Netzwerkinformationen zwischen dem Kernel-Space und den Userspace-Prozessen entwickelt und verwendet . Netzwerk-Dienstprogramme, wie die iproute2- Familie und die Dienstprogramme, die zum Konfigurieren von mac80211- basierten drahtlosen Treibern verwendet werden, verwenden Netlink, um mit dem Linux-Kernel aus dem Userspace zu kommunizieren . Netlink bietet eine Standard- Socket- basierte Schnittstelle für Userspace-Prozesse und eine Kernel-seitige API für die interne Verwendung durch Kernel-Module . Ursprünglich verwendete Netlink die AF_NETLINK
Socket-Familie.
Netlink soll ein flexiblerer Nachfolger von ioctl sein ; RFC 3549 beschreibt das Protokoll im Detail.
Geschichte
Netlink wurde von Alexey Kuznetsov als flexiblere Alternative zu der ausgeklügelten, aber umständlichen ioctl
Kommunikationsmethode entwickelt, die zum Einstellen und Abrufen von externen Socket-Optionen verwendet wird. Der Linux-Kernel unterstützt weiterhin die ioctl
Abwärtskompatibilität.
Netlink wurde erstmals in der 2.0-Serie des Linux-Kernels bereitgestellt und als Zeichengerät implementiert . Bis 2013 ist diese Schnittstelle veraltet, bildet aber immer noch eine ioctl- Kommunikationsmethode; vergleichen Sie die Verwendung von rtnetlink
. Die Netlink-Socket-Schnittstelle erschien in der 2.2-Serie des Linux-Kernels.
Paketstruktur
Bit-Offset | 0–15 | 16–31 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Nachrichtenlänge | |||||||||||||||||||||||||||||||
32 | Typ | Flaggen | ||||||||||||||||||||||||||||||
64 | Sequenznummer | |||||||||||||||||||||||||||||||
96 | PID | |||||||||||||||||||||||||||||||
128+ | Daten |
Im Gegensatz zu BSD-Sockets, die Internetprotokolle wie TCP verwenden , bei denen die Nachrichtenheader automatisch generiert werden, muss der Netlink-Nachrichtenheader (verfügbar als struct nlmsghdr
) vom Aufrufer vorbereitet werden. Der Netlink-Socket arbeitet im Allgemeinen in einem SOCK_RAW
-ähnlichen Modus, auch wenn er SOCK_DGRAM
verwendet wurde, um ihn zu erstellen.
Der Datenteil enthält dann eine subsystemspezifische Nachricht, die weiter verschachtelt werden kann.
Netlink-Socket-Familien
Die AF_NETLINK
Familie bietet mehrere Protokolluntergruppen. Jede Schnittstelle ist mit einer anderen Kernelkomponente verbunden und hat eine andere Messaging-Untermenge. Die Untermenge wird durch das Protokollfeld im Socket-Aufruf referenziert:
int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)
Es fehlt ein Standard SOCK_DGRAM
und SOCK_RAW
es wird nicht garantiert, dass sie in einer bestimmten Linux-Version (oder einem anderen Betriebssystem) implementiert werden. Einige Quellen geben an, dass beide Optionen legitim sind, und die Referenz unten von Red Hat besagt, dass dies SOCK_RAW
immer der Parameter ist. iproute2 verwendet jedoch beide austauschbar.
Netlink-Protokolle
Es folgt eine nicht erschöpfende Liste der unterstützten Protokolleinträge :
- NETLINK_ROUTE
NETLINK_ROUTE
liefert Routing- und Link-Informationen. Diese Informationen werden hauptsächlich für Routing-Daemons im Benutzerbereich verwendet. Linux implementiert eine große Teilmenge von Nachrichten:
- Verbindungsschicht: RTM_NEWLINK , RTM_DELLINK , RTM_GETLINK , RTM_SETLINK
- Adresseinstellungen : RTM_NEWADDR , RTM_DELADDR , RTM_GETADDR
- Routing-Tabellen: RTM_NEWROUTE , RTM_DELROUTE , RTM_GETROUTE
- Nachbarcache : RTM_NEWNEIGH , RTM_DELNEIGH , RTM_GETNEIGH
- Routing-Regeln: RTM_NEWRULE , RTM_DELRULE , RTM_GETRULE
- Einstellungen für die Warteschlangendisziplin: RTM_NEWQDISC , RTM_DELQDISC , RTM_GETQDISC
- Mit Warteschlangen verwendete Verkehrsklassen: RTM_NEWTCLASS , RTM_DELTCLASS , RTM_GETTCLASS
- Traffic-Filter: RTM_NEWTFILTER , RTM_DELTFILTER , RTM_GETTFILTER
- Andere: RTM_NEWACTION , RTM_DELACTION , RTM_GETACTION , RTM_NEWPREFIX , RTM_GETPREFIX , RTM_GETMULTICAST , RTM_GETANYCAST , RTM_NEWNEIGHTBL , RTM_GETNEIGHTBL , RTM_SETNEIGHTBL
- NETLINK_FIREWALL
NETLINK_FIREWALL
stellt eine Schnittstelle für eine User-Space-App bereit, um Pakete von der Firewall zu empfangen .
- NETLINK_NFLOG
NETLINK_NFLOG
stellt eine Schnittstelle bereit, die verwendet wird, um zwischen Netfilter und iptables zu kommunizieren .
- NETLINK_ARPD
NETLINK_ARPD
bietet eine Schnittstelle zum Verwalten der ARP- Tabelle aus dem Benutzerbereich.
- NETLINK_AUDIT
NETLINK_AUDIT
stellt eine Schnittstelle zum Audit-Subsystem bereit, das in den Linux-Kernel-Versionen 2.6.6 und höher zu finden ist.
- NETLINK_IP6_FW
NETLINK_IP6_FW
bietet eine Schnittstelle zum Transportieren von Paketen von Netfilter zum User-Space.
- NETLINK_ROUTE6
- NETLINK_TAPBASE
- NETLINK_NETFILTER
- NETLINK_TCPDIAG
- NETLINK_XFRM
NETLINK_XFRM
bietet eine Schnittstelle zum Verwalten der IPsec- Sicherheitszuordnungs- und Sicherheitsrichtliniendatenbanken – die hauptsächlich von Schlüsselmanager-Daemons verwendet werden, die das Internet Key Exchange- Protokoll verwenden.
- NETLINK_KOBJECT_UEVENT
NETLINK_KOBJECT_UEVENT
stellt die Schnittstelle bereit, in der der Kernel uevents sendet, die normalerweise von udev konsumiert werden .
- NETLINK_GENERIC
Einer der Nachteile des Netlink-Protokolls besteht darin, dass die Anzahl der Protokollfamilien auf 32 begrenzt ist ( MAX_LINKS
). Dies ist einer der Hauptgründe für die Entwicklung der generischen Netlink-Familie – um das Hinzufügen einer höheren Anzahl von Familien zu unterstützen. Er fungiert als Netlink-Multiplexer und arbeitet mit einer einzigen Netlink-Familie NETLINK_GENERIC
. Das generische Netlink-Protokoll basiert auf dem Netlink-Protokoll und verwendet dessen API.
Benutzerdefiniertes Netlink-Protokoll
Benutzer können ihren eigenen Kernel-Routinen einen Netlink-Handler hinzufügen. Dies ermöglicht die Entwicklung zusätzlicher Netlink-Protokolle, um neue Kernel-Module zu adressieren.
Siehe auch
- Vergleich von Open-Source-Wireless-Treibern – mac80211- basierte Treiber basieren auf Netlink als API zum Benutzerbereich
- POSIX
Verweise
Externe Links
- Pablo Neira Ayuso, Rafael M. Gasca, Laurent Lefèvre. Kommunikation zwischen Kernel und Userspace unter Linux über Netlink-Sockets. Software: Praxis und Erfahrung, 40(9):797-810, August 2010
- Warum und wie man Netlink Sockets verwendet
- RFC 3549
- https://netfilter.org/projects/libmnl/ – Minimalist Library for Netlink – Userspace-Bibliothek zum Erstellen und Parsen von Netlink-Nachrichten
- https://www.infradead.org/~tgr/libnl – Netlink Protocol Library Suite – voll funktionsfähige Bibliothek, die fast alle Aspekte der Arbeit mit Netlink-Sockets abdeckt
- Manipulation der Netzwerkumgebung mit RTNETLINK
- Netlink Sockets – Ein Überblick
- Netlink Protocol Library Suite
- "Linux Kernel Networking" von Rami Rosen, Apress 2013: Kapitel 2, Netlink Sockets