Hin und wieder erreicht eine coole Technologie einen Wendepunkt, an dem sich echte Geschäftsanforderungen mit den Stärken dieser Technologie überschneiden. Dies macht die Technologie nicht nur plausibel, sondern auch praktisch. Berkeley Packet Filter (BPF) hat bei Linux-Entwicklern vor Kurzem diesen Punkt erreicht. BPF ist ein äußerst effizienter Abfang- und Verarbeitungspunkt auf einem Linux-Host, der in naher Zukunft auf Windows -Server ausgeweitet werden soll. Die Bandbreite der verfügbaren Daten ist enorm und trägt direkt zur vollständigen Stapeltransparenz für Betriebsaufgaben des Site Reliability Engineering (SRE) bei. Darüber hinaus ist es auf die Lösung von Herausforderungen im Bereich Sicherheit und Verkehrsmanagement ausgerichtet. Die Palette der Hooks ist ebenso umfangreich und bietet eine attraktive Palette nützlicher Auslösepunkte für BPF-Anwendungen, die für Spezialisten in den Bereichen Beobachtung, Sicherheit und Netzwerk interessant sind. BPF ist die richtige Technologie, um Beobachtung zu ermöglichen, ohne die Bank zu sprengen. Und alles beginnt mit der Beobachtbarkeit.
Das grundlegende Design von BPF macht es zu einer der effizientesten Rechenleistungsmethoden überhaupt (Dollar pro Watt). Und noch besser: Die Toolchains erstellen den Bytecode für Sie, sodass Sie sich auf das gewünschte Ergebnis konzentrieren können und nicht auf die Programmierung in Assemblersprache auf niedriger Ebene. Wie? Diese beiden Designmerkmale zeichnen BPF aus:
Das Softwaredesign von BPF wurde bewusst dem der aufkommenden modernen CPU-Architekturen nachempfunden. Tatsächlich wird Prozessorterminologie verwendet, da diese die Elemente und die Verwendung von BPF genau beschreibt. BPF verfügt über Register und Anweisungen. Sie sind für die direkte Nutzung durch CPUs konzipiert. BPF basiert auf dem BSD-Paketfilterdesign (1992) und ist eine neu gestaltete Filtermaschine zur Paketerfassung, die besser für die aktuellen registerbasierten CPU-Architekturen geeignet ist. Dieses Design erhielt 2014 einen natürlichen Schub, als „Enhanced Berkeley Packet Filter“ oder eBPF in v3.18 des Linux- Kernels veröffentlicht wurde. eBPF war in den ersten Tagen nach seiner Veröffentlichung ein wichtiger Unterschied zum Classic Berkeley Packet Filter (cBPF). Heute ist dieser Unterschied weniger wichtig, da alle unterstützten Versionen des Kernels die Verbesserungen von 2014 enthalten. Sie sind bemerkenswert: Breitere Register (von 32 Bit auf 64 Bit bedeutet, dass pro Cache-Zeile/Taktzyklus mehr Arbeit erledigt wird), mehr Register (von 2 auf 10 bedeutet mehr 1:1-Zuordnung zwischen modernen CPU-Registern und Kernel-ABIs) und eine Handvoll zusätzlicher Befehlssatzerweiterungen, die BPF-Programme sicherer und nützlicher machen.
BPF besteht aus einem Netzwerk-Tap und einem Paketfilter. Der Abgriff wird auf der Datenverbindungsebene ausgeführt, wenn Pakete vom Kabel zu einer bestimmten Netzwerkschnittstelle gelangen. Es kopiert Pakete, damit der Filter sie abfragen kann. Dieser Einfügepunkt ermöglicht vollständige Transparenz im Netzwerkpfad des Linux-Hosts. Bei eingehendem Datenverkehr bedeutet dies, bevor der Hostprozessor mit der Verarbeitung beginnt, und bei ausgehendem Datenverkehr bedeutet es, unmittelbar bevor der Datenverkehr über die Leitung den Host verlässt. Dieses Diagramm zeigt, wie BPF den eingehenden Paketpfad auf der Datenverbindungsschicht kreuzt.
Die Bandbreite der verfügbaren Daten ist enorm und trägt direkt zur Full-Stack-Transparenz für SRE-Betriebsaufgaben bei. In diesem Beispiel konzentrieren wir uns auf einige der am häufigsten verwendeten Felder aus dem IPv4-Header .
Mithilfe dieser Daten können Richtlinien zur individuellen Paketfilterung definiert werden. Die folgende Richtlinie filtert nach TCP-Paketen, die für eine bestimmte Ziel-IP-Adresse bestimmt sind.
Die Nutzung von eBPF zur Beobachtung bietet einen BOGO-Vorteil (Buy One, Get One): Die beobachteten Daten können über die Beobachtung hinaus auch für andere Zwecke verwendet werden. Beispielsweise Verkehrsführung oder Sicherheit.
Wenn wir auf den Datensatz zurückkommen, den wir zuvor freigegeben haben, sind Teile dieses Datensatzes, die zur Beobachtung des Verkehrseingangspfads eines Linux-Hosts verwendet werden, auch für andere Dinge nützlich. Beispielsweise sind Quell-IP, Ziel-IP, Zielhost und Port sowohl für die Weiterleitung des eingehenden Datenverkehrs als auch für die Zugriffsbeschränkung nützlich.
Unabhängig von der Verwendung beginnt alles mit der Paketkopie durch den BPF-Tap. Sobald die Kopie erstellt wurde, können die Daten in den Speicher abgelegt (weitere Informationen finden Sie unter BPF Maps ) und dann als Telemetriedatenstrom exportiert und gleichzeitig von anderen BPF-Programmen genutzt werden, die Richtlinien- und Filteraktionen festlegen. Hier erfolgt die Verzweigung von der Beobachtung zum Verkehrsmanagement und zur Sicherheit. Um die extreme Effizienz von BPF optimal zu nutzen, ist ein klares Bild davon, welche Daten benötigt werden und wie diese Daten genutzt werden, der Ausgangspunkt. Im nächsten Beitrag dieser Reihe wird mein Kollege Muhammad Waseem Sarwar Optionen für die BPF-Programmierung an verschiedenen Stellen im Linux-Netzwerkstapel untersuchen.