Der "Berkeley Packet Filter" (BPF) ist eine im Linux-Kernel eingebaute Engine für die Ausführung spezieller Nutzerprogramme, die zunächst für FreeBSD entwickelt worden sind. Die ursprüngliche Fassung des BPF für Linux ist bereits Anfang der 1990er-Jahre in den Kernel 2.5 aufgenommen worden und diente hauptsächlich dazu, Netzwerktools wie tcpdump zu unterstützen. Dieser klassische BPF (classical BPF oder cBPF) kennt nur einen sehr eingeschränkten Befehlssatz speziell für die Auswertung beziehungsweise das Filtern von Netzwerkpaketen. Werkzeuge im Userspace können dafür jederzeit passenden Assembler-Code generieren und einfach in die BPF-Engine im laufenden Kernel zur Ausführung schieben. Das injizierte Programm wird dann dort immer wieder über jedes eintreffende Paket ausgeführt.
Ein so im Kernel angesetzter Paketfilter kann somit direkt im Inneren des Systems arbeiten und Pakete aussortieren, ohne dass diese zunächst aufwendig in den Userspace gebracht werden, dort selektiert und dann auch wieder zurückgeführt werden müssen. Das bringt für den Bearbeitungs- beziehungsweise Filterdurchsatz einen deutlichen Geschwindigkeitsvorsprung mit sich. Seit 2014 (Kernel 3.15) ist der BPF im Linux-Kernel schrittweise weiter ausgebaut worden, und die moderne Fassung wird gegenüber der originalen Spezifikation mittlerweile als "extended" BPF (eBPF) bezeichnet oder gegenüber dem cBPF auch einfach nur "BPF" genannt. Klassischer BPF-Code, wie derjenige von tcpdump (den Sie mit "-d" ausgeben), ist aber weiterhin lauffähig und wird im Kernel automatisch in modernere eBPF-Instruktionen übersetzt.
Der moderne Berkeley Packet Filter bietet einen wesentlich erweiterten und universellen Befehlssatz und kann auch anderen Zwecken dienen als nur dem Filtern von Paketen. Der bereits für den cBPF im Kernel eingebaute
...Der komplette Artikel ist nur für Abonnenten des ADMIN Archiv-Abos verfügbar.