Contributed by Peter N. M. Hansteen on from the deeply logged packets dept.
tech@, David Gwynne (dlg@) introduced a new daemon to log packets from BPF.
The message reads
List: openbsd-tech Subject: bpflogd(8): capture packets via BPF to log files From: David Gwynne <david () gwynne ! id ! au> Date: 2025-04-24 5:44:53 this is basically pflogd(8), but different. the reason it exists is because i needed to continously log some packets from span ports coming from multiple switches to try and help debug a network issue that only seems to occur every couple of months. pflogd provides that for a single pflog interface, but i needed it on multiple ethernet interfaces.
im sending this out in case anyone else is interested in it.
the main differences are:
- it can log on any type of BPF interface and DLT, not just pflog(4)
- a single bpflogd can log packets from multiple BPF interfaces to the
one log file
- it uses libevent and non-blocking FDs instead of a blocking on
pcap_dispatch in a loop with crazy signal handling
- this also avoids restartable syscalls
- it uses unveil and drops privs instead of chroot+privsep
- this means the log file has to be writable by the user bpflogd
runs as so it can reopen it after rotation.
- it captures full packets by default, not just 160 bytes
- you can provide a pcap-filter expression in a file
- this makes the pexp handling in rc.subr a lot more robust
- the .c files are about half the number of lines
- but it uses libevent so maybe this doesnt matter
the network issue i was dealing with was dhcp related, so i was
running it like this:
xdlg@sundew etc$ cat rc.d/bpflog_dhcp
#!/bin/ksh
daemon="/opt/local/sbin/bpflogd"
daemon_flags="-f /var/log/dhcp.pcap -F /etc/bpflog_dhcp.bpfilter -i mcx1 -i mcx2"
. /etc/rc.d/rc.subr
rc_cmd $1
xdlg@sundew etc$ cat /etc/bpflog_dhcp.bpfilter
vlan and udp and ((ip and (port bootpc or port bootps)) or (ip6 and (port \
dhcpv6-client or port dhcpv6-server))) xdlg@sundew etc$ ls -l /var/log/dhcp.pcap
-rw-r----- 1 _pflogd sysadm 41027133 Apr 24 15:01 /var/log/dhcp.pcap
xdlg@sundew etc$ grep bpflog_dhcp /etc/newsyslog.conf
/var/log/dhcp.pcap 640 7 100000 * ZB "rcctl reload bpflog_dhcp > /dev/null"
rcctl reload sends HUP by default, which is what bpflogd (and pflogd)
use to trigger a reopen of their logfiles.
for fun i replaced pflogd with bpflogd by changing /etc/rc.d/pflogd on a
few boxes:
and goes on with the patches (against -current) that introduces the deamon to the source tree.
As always, testing and comments from people who could potentially need this functionality is welcome. The code may find its way into a future release post OpenBSD 7.7
(Comments are closed)
