You can use socket filters, TC (Traffic Control), or XDP (eXpress Data Path) to capture TCP, UDP, and ICMP payloads without resorting to kprobe, uprobe, or tracepoint.
Here are some example implementations you can explore:
Socket Filter: main.bpf.c
TC: main.bpf.c
XDP: main.bpf.c