Berkeley Packet Filter
Das Berkeley Packet Filter (BPF), auch Berkeley-Filter, bietet auf unixähnlichen Betriebssystemen eine Schnittstelle zur Sicherungsschicht an, die es erlaubt, Datenpakete der Sicherungsschicht zu senden und zu empfangen. Falls der Treiber der Netzwerkschnittstelle den Promiscuous Mode unterstützt, kann die Schnittstelle in diesen Modus geschaltet werden, damit alle Pakete des Netzwerkes, auch jene, die für andere Netzwerkadapter bestimmt sind, empfangen werden können.
Das BPF unterstützt außerdem das Filtern von Datenpaketen, damit nur interessante Pakete verarbeitet werden und somit Rechenleistung gespart wird.
Die Berkeley-Filter-Funktionalität ist als Interpreter in Maschinensprache für die BPF-VM implementiert. Computerprogramme können somit Daten aus dem Paket lesen, arithmetische Operationen darauf ausführen, das Resultat gegen die Filterdefinition vergleichen und anschließend das Paket akzeptieren oder verwerfen. Auf manchen Systemen, einschließlich FreeBSD und WinPcap, wird Just-in-time-Kompilierung (Konvertierung von Instruktionen der virtuellen Maschine in Maschinensprache) unterstützt, um die Leistung des Systems zu verbessern. Seitdem auch unter Linux die Just-in-time-Kompilierung unterstützt wird, entwickelt sich der BPF dort zu einer universalen virtuellen Maschine im Kernel.[1] BPF ist ein offizielles Back-End für LLVM (ab Version 3.7).[2]
Der Interpreter kann im Kernel-Modus oder Benutzer-Modus laufen. Kernel-Modus-Interpreter werden z. B. für Socket-Filter unter Linux oder WinPcap-Mechanismen benutzt. Einen Benutzer-Modus-Interpreter bietet die libpcap-/WinPcap-Implementierung des Pcap-API. Auf Systemen ohne Kernel-Modus-Unterstützung für den Filtermechanismus können damit Pakete im Benutzermodus gefiltert werden.
2007 wurden von Robert Watson und Christian Peron die Zero-copy buffer extensions zur BPF-Implementierung hinzugefügt. Damit können vom Gerätetreiber erfasste Pakete direkt in den Speicher von Programmen im Benutzermodus geschrieben werden und es entfällt ein zusätzliches Kopieren der Daten.
Einzelnachweise
- Michael Larabel: Understanding The Linux Kernel's BPF In-Kernel Virtual Machine. Phoronix, 3. März 2015, abgerufen am 4. März 2015.
- Michael Larabel: BPF Goes Through With Becoming An Official LLVM Back-End. Phoronix, 10. Juni 2015, abgerufen am 11. Juni 2015.
Weblinks
- 1993 USENIX-Artikel zu BPF (englisch, PDF, 133 kB)
- FreeBSD-Entwicklergipfel-Präsentation zu Zero-copy buffer extensions für BPF (englisch, PDF, 80 kB)
- BPF-Hilfeseiten (englisch)
- Filterdefinitionssyntax (englisch, PDF, 77 kB)
- bpfc, BPF compiler für Linux (Teil des netsniff-ng toolkit)
- Dokumentation im Linux-Kernel: Linux Socket Filtering aka Berkeley Packet Filter (BPF)
- eBPF.io - Introduction, Tutorials & Community Resources