记录关于EBPF的随笔,以Linux-5.10版本的内核为基准。
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_ingress、sch_handle_egress |
|
| BPF_PROG_TYPE_SCHED_ACT | 动作:tc action,将BPF程序作为actions加载到ingress/egress Hook点 :sch_handle_ingress、sch_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_INGRESS、BPF_CGROUP_INET_EGRESS;Hook位置:__sk_receive_skb、tcp_v4_rcv->tcp_filter、udp_queue_rcv_one_skb ==> sk_filter_trim_cap;出方向:ip[6]_finish_output |
|
| BPF_PROG_TYPE_CGROUP_SOCK | 在inet_create中执行,可允许/拒绝网络访问,BPF_CGROUP_INET_SOCK_CREATE、BPF_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程序Attach到CGroup的文件描述符上。 |
Socket |
| BPF_PROG_TYPE_SK_SKB | 通过修改skb/socket信息,可用作socket重定向,Hook位置smap_parse_func_strparser、smap_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 |
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 |