EBPF 随笔

发表于 2023-07-24

记录关于EBPF的随笔,以Linux-5.10版本的内核为基准。

基础

支持的EBPF程序类型

Kernel 支持的EBPF程序类型源代码 :

程序类型 描述 备注
BPF_PROG_TYPE_SOCKET_FILTER 对流量进行复制、过滤、统计等操作,Hook 位置sock_queue_rcv_skb Socket
BPF_PROG_TYPE_KPROBE 通过 kprobe/kretprobe 观测内核函数。 k[ret]probe_perf_func() 会执行加载到 probe 点的 BPF 程序。
BPF_PROG_TYPE_SCHED_CLS 分类器:tc classifier,将BPF程序作为classifiers加载到ingress/egress Hook点:sch_handle_ingresssch_handle_egress
BPF_PROG_TYPE_SCHED_ACT 动作:tc action,将BPF程序作为actions加载到ingress/egress Hook点 :sch_handle_ingresssch_handle_egress
BPF_PROG_TYPE_TRACEPOINT perf_trace_<event_class>() 源代码
BPF_PROG_TYPE_XDP XDP位于设备驱动层,有网卡/驱动及对应内核版本支持;BCC-XDP ,主要用于防火墙、负载均衡等场景;对于没有实现XDP的驱动,内核也实现了Generic XDP的实现,见net/core/dev.c
BPF_PROG_TYPE_PERF_EVENT
BPF_PROG_TYPE_CGROUP_SKB CGroup级别IP Ingress/Egress放行/丢弃数据包,Attach类型:BPF_CGROUP_INET_INGRESSBPF_CGROUP_INET_EGRESS;Hook位置:__sk_receive_skbtcp_v4_rcv->tcp_filterudp_queue_rcv_one_skb ==> sk_filter_trim_cap;出方向:ip[6]_finish_output
BPF_PROG_TYPE_CGROUP_SOCK inet_create中执行,可允许/拒绝网络访问,BPF_CGROUP_INET_SOCK_CREATEBPF_CGROUP_SOCK_OPS;整个连接的生命周期只调用一次?源代码 Socket
BPF_PROG_TYPE_LWT_IN
BPF_PROG_TYPE_LWT_OUT
BPF_PROG_TYPE_LWT_XMIT
BPF_PROG_TYPE_SOCK_OPS 依赖CGroup/v2,可以指定 BPF_CGROUP_SOCK_OPS类型,将BPF程序AttachCGroup的文件描述符上。 Socket
BPF_PROG_TYPE_SK_SKB 通过修改skb/socket信息,可用作socket重定向,Hook位置smap_parse_func_strparsersmap_verdict_func Socket
BPF_PROG_TYPE_CGROUP_DEVICE
BPF_PROG_TYPE_SK_MSG Socket
BPF_PROG_TYPE_RAW_TRACEPOINT
BPF_PROG_TYPE_CGROUP_SOCK_ADDR 可以操作指定CGroup控制的用户程序的IP地址及端口号,cgroup/connect[46]等函数;源代码 Socket
BPF_PROG_TYPE_LWT_SEG6LOCAL
BPF_PROG_TYPE_LIRC_MODE2
BPF_PROG_TYPE_SK_REUSEPORT 可以使用多个socket侦听在相同的端口地址,有助于新老系统的业务切换;需Hook CGroup级别的socket事件 Socket
BPF_PROG_TYPE_FLOW_DISSECTOR
BPF_PROG_TYPE_CGROUP_SYSCTL
BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
BPF_PROG_TYPE_CGROUP_SOCKOPT
BPF_PROG_TYPE_TRACING
BPF_PROG_TYPE_STRUCT_OPS
BPF_PROG_TYPE_EXT
BPF_PROG_TYPE_LSM
BPF_PROG_TYPE_SK_LOOKUP Socket

支持的EBPF-Attach类型

Kernel 支持的EBPF Attach类型源代码 :

Attach 类型 描述 备注
BPF_CGROUP_INET_INGRESS BPF_PROG_TYPE_CGROUP_SKB CGroup 源代码
BPF_CGROUP_INET_EGRESS BPF_PROG_TYPE_CGROUP_SKB CGroup
BPF_CGROUP_INET_SOCK_CREATE BPF_PROG_TYPE_CGROUP_SOCK CGroup
BPF_CGROUP_SOCK_OPS BPF_PROG_TYPE_SOCK_OPS CGroup
BPF_SK_SKB_STREAM_PARSER BPF_PROG_TYPE_SK_SKB
BPF_SK_SKB_STREAM_VERDICT BPF_PROG_TYPE_SK_SKB
BPF_CGROUP_DEVICE BPF_PROG_TYPE_CGROUP_DEVICE CGroup
BPF_SK_MSG_VERDICT BPF_PROG_TYPE_SK_MSG
BPF_CGROUP_INET4_BIND BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET6_BIND BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET4_CONNECT BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET6_CONNECT BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET4_POST_BIND BPF_PROG_TYPE_CGROUP_SOCK CGroup
BPF_CGROUP_INET6_POST_BIND BPF_PROG_TYPE_CGROUP_SOCK CGroup
BPF_CGROUP_UDP4_SENDMSG BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_UDP6_SENDMSG BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_LIRC_MODE2 BPF_PROG_TYPE_LIRC_MODE2
BPF_FLOW_DISSECTOR BPF_PROG_TYPE_FLOW_DISSECTOR
BPF_CGROUP_SYSCTL BPF_PROG_TYPE_CGROUP_SYSCTL CGroup
BPF_CGROUP_UDP4_RECVMSG BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_UDP6_RECVMSG BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_GETSOCKOPT BPF_PROG_TYPE_CGROUP_SOCKOPT CGroup
BPF_CGROUP_SETSOCKOPT BPF_PROG_TYPE_CGROUP_SOCKOPT CGroup
BPF_TRACE_RAW_TP
BPF_TRACE_FENTRY
BPF_TRACE_FEXIT
BPF_MODIFY_RETURN
BPF_LSM_MAC
BPF_TRACE_ITER BPF_PROG_TYPE_TRACING
BPF_CGROUP_INET4_GETPEERNAME BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET6_GETPEERNAME BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET4_GETSOCKNAME BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_CGROUP_INET6_GETSOCKNAME BPF_PROG_TYPE_CGROUP_SOCK_ADDR CGroup
BPF_XDP_DEVMAP
BPF_CGROUP_INET_SOCK_RELEASE BPF_PROG_TYPE_CGROUP_SOCK CGroup
BPF_XDP_CPUMAP
BPF_SK_LOOKUP BPF_PROG_TYPE_SK_LOOKUP
BPF_XDP BPF_PROG_TYPE_XDP
上一篇 在WSL2上支持EBPF环境 下一篇 EBPF原子操作避坑指南