Netzlink - Netlink

Netzlink
Stabile Version
5.14.7  Bearbeiten Sie dies auf Wikidata / 22. September 2021 ; vor 0 Tagen ( 22. September 2021 )
Vorschauversion
5.15-rc2  Bearbeiten Sie dies auf Wikidata / 19. September 2021 ; vor 3 Tagen ( 19. September 2021 )
Betriebssystem Linux
Plattform Linux Kernel
Typ Programmierschnittstelle
Lizenz GNU General Public License
Webseite wiki .linuxfoundation .org /networking /generic _netlink _howto

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_NETLINKSocket-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 ioctlKommunikationsmethode entwickelt, die zum Einstellen und Abrufen von externen Socket-Optionen verwendet wird. Der Linux-Kernel unterstützt weiterhin die ioctlAbwä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_DGRAMverwendet wurde, um ihn zu erstellen.

Der Datenteil enthält dann eine subsystemspezifische Nachricht, die weiter verschachtelt werden kann.

Netlink-Socket-Familien

Die AF_NETLINKFamilie 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_DGRAMund SOCK_RAWes 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_RAWimmer 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_ROUTEliefert 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_FIREWALLstellt eine Schnittstelle für eine User-Space-App bereit, um Pakete von der Firewall zu empfangen .

NETLINK_NFLOG

NETLINK_NFLOGstellt eine Schnittstelle bereit, die verwendet wird, um zwischen Netfilter und iptables zu kommunizieren .

NETLINK_ARPD

NETLINK_ARPDbietet 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_XFRMbietet 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_UEVENTstellt 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

Verweise

Externe Links