摘要:apt install -y bpftrace icmpdrop.bt #!/usr/bin/env bpftrace #ifndef BPFTRACE_HAVE_BTF #include <linux/socket.h> #include <net/sock.h> #else #include <
阅读全文
摘要:下载cilium代码 apt install -y make cd cilium NOOPT=1 DOCKER_IMAGE_TAG=v1.14.4 make docker-cilium-image
阅读全文
摘要:cilium v1.15.1 进入DaemonSet cilium容器后,支持使用cilium命令。 查看cilium状态 cilium status 查看cilium所有端点信息 cilium endpoint list 查看cilium接管的service cilium service list
阅读全文
摘要:cilium v1.15.1 为了实时性,内核态eBPF写入BPF_MAP_TYPE_PERF_EVENT_ARRAY,用户态eBPF从中读取trace和drop事件。 bpf/lib/trace.hsend_trace_notify4函数 bpf/lib/events.hcilium EVENTS
阅读全文
摘要:cilium v1.15.1 容器网络开销 容器网卡转发报文到容器进程,等价于主机网卡转发报文到主机进程。除此之外,主机网卡转发报文到容器网卡是多余的开销。 eBPF主机路由 eBPF主机路由基于网口之间直接跳转,可以绕过主机命名空间中所有的iptables和上层协议栈,穿过需要上下文切换来传输报文
阅读全文
摘要:不同于cilium基于Linux内核完成vxlan封装和解封装的逻辑,这里基于eBPF自己完成vxlan封装和解封装,不走Linux内核vxlan模块和ct模块。 eBPF功能1 响应arp请求2 网口报文跳转3 vxlan封装和解封装tc_ingress和tc_egress都加载到主机veth口和
阅读全文
摘要:cilium 1.15.1 cilium在主机网口上没有加载tc规则,因为tc filter show dev 主机网口 ingress和tc filter show dev 主机网口 egress没有结果。cilium有自己的ct表,独立于内核。 1. 区分报文类型走不同流程。bpf/bpf_lx
阅读全文
摘要:eBPF代答veth口arp请求 在cilium中,eBPF tc ingress负责代答容器网卡的arp请求,回复的mac地址是容器网卡对端veth口mac地址,与当前逻辑类似,这里只是回复了假mac。在kube-ovn中,ovs br-int网桥上xxx_h负责响应容器网卡的arp请求,没有ge
阅读全文
摘要:pkt_type取值范围 https://elixir.bootlin.com/linux/v6.5/source/include/uapi/linux/if_packet.h#L33 skb中pkt_type值,由网卡驱动层函数eth_type_trans,在tc ingress之前,根据目的ma
阅读全文
摘要:函数定义 https://www.man7.org/linux/man-pages/man7/bpf-helpers.7.html bpf_redirect不指定flag时,默认走egress,veth egress(in)和虚拟机网口egress(out)方向不同。 网卡响应报文 网卡要响应报文,
阅读全文
摘要:问题现象 k8s上启动pod后,使用主机网络的容器,加载eBPF程序到网口上,持久化map只能保存在容器文件系统/sys/fs/bpf中。容器复位后,新容器与原来eBPF程序使用的不是同一个map。 问题分析 新容器使用新的文件系统,无法找回原来的/sys/fs/bpf挂载点,需要持久化到宿主机上。
阅读全文
摘要:相比于perf_event_array,ringbuf优势在于1. 读取数据是有序的,即提交顺序和消费顺序保持一致。2. 避免数据复制,即提交数据到map和传递到用户态都不需要拷贝。 内核态 ringbuf/ringbuf.c #include "../headers/vmlinux.h" #inc
阅读全文
摘要:bpftool是eBPF的命令行工具,prog和map是最常用的2种方式。 prog # 查看系统中所有的BPF Prog bpftool prog list # 查看tracelog bpftool prog tracelog map # 查看系统中所有的BPF Map bpftool map l
阅读全文
摘要:基于LLVM内置函数来操作内存 #ifndef memmove #define memmove(dest, src, n) __builtin_memmove((dest), (src), (n)) #endif #ifndef memset #define memset(dest, chr, n)
阅读全文
摘要:map种类 map类型 特点 Hash Map BPF_MAP_TYPE_HASH hash map。 支持value并发更新。 BPF_MAP_TYPE_PERCPU_HASH per core的hash map。 BPF_MAP_TYPE_LRU_HASH map塞满之后,继续插入,自动删除最近
阅读全文
摘要:内核态约束 1. 内核态eBPF无法使用C语言标准库。因为不支持malloc,所以无法扩展skb空间且无法直接从内核态拷贝整个报文到用户态。2. 内核态eBPF无法获取当前时间,bpf_ktime_get_ns函数返回系统启动后运行纳秒数,不包括系统暂停时间。 https://www.man7.or
阅读全文
摘要:基于eBPF lpm map,icmp只有匹配上路由才能通。 最终目录结构 效果展示 启动应用前,可以ping通192.168.0.1和192.168.0.105。 启动应用后,无法ping通192.168.0.1,可以ping通192.168.0.105。 停止应用后,可以ping通192.168
阅读全文
摘要:xdp tc 层次 网卡驱动层 数据链路层 位置 进入Linux网络协议栈之前 在Linux网络协议栈中,netfilter之前 方向 只有ingress 有ingress和egress 修改 支持修改报文 支持修改报文,有skb结构,修改更方便 网卡响应关系 网卡响应在xdp之后 网卡响应在tc之
阅读全文
摘要:虽然eBPF内核态部分使用C语言编写,但是无法gdb,只能通过打印来调试。调用类似于C语言中printf函数的bpf_printk函数,打印结果输出到/sys/kernel/debug/tracing/trace。 bpf_printk最多带3个参数,bpf_trace_printk也是如此。 查看
阅读全文
摘要:ubuntu 23.10 安装eBPF依赖 # 安装编译工具 apt install -y llvm clang # 确认内核具有BTF支持,路径存在,内核没有BTF支持,使用vmlinux.h无法通过编译 ls /sys/kernel/btf # 生成vmlinux.h # apt install
阅读全文