随笔分类 -  eBPF

1 2 下一页

bpftrace查看网络丢包
摘要:apt install -y bpftrace icmpdrop.bt #!/usr/bin/env bpftrace #ifndef BPFTRACE_HAVE_BTF #include <linux/socket.h> #include <net/sock.h> #else #include < 阅读全文

posted @ 2025-04-26 20:30 王景迁 阅读(48) 评论(0) 推荐(0)

编译cilium agent
摘要:下载cilium代码 apt install -y make cd cilium NOOPT=1 DOCKER_IMAGE_TAG=v1.14.4 make docker-cilium-image 阅读全文

posted @ 2025-03-23 12:52 王景迁 阅读(17) 评论(0) 推荐(0)

cilium命令
摘要:cilium v1.15.1 进入DaemonSet cilium容器后,支持使用cilium命令。 查看cilium状态 cilium status 查看cilium所有端点信息 cilium endpoint list 查看cilium接管的service cilium service list 阅读全文

posted @ 2025-02-24 21:30 王景迁 阅读(88) 评论(0) 推荐(0)

cilium 采集网络事件
摘要: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 阅读全文

posted @ 2025-01-20 09:12 王景迁 阅读(22) 评论(0) 推荐(0)

cilium 基本流量转发
摘要:cilium v1.15.1 容器网络开销 容器网卡转发报文到容器进程,等价于主机网卡转发报文到主机进程。除此之外,主机网卡转发报文到容器网卡是多余的开销。 eBPF主机路由 eBPF主机路由基于网口之间直接跳转,可以绕过主机命名空间中所有的iptables和上层协议栈,穿过需要上下文切换来传输报文 阅读全文

posted @ 2025-01-20 08:55 王景迁 阅读(97) 评论(0) 推荐(0)

基于eBPF实现vxlan封装和解封装
摘要:不同于cilium基于Linux内核完成vxlan封装和解封装的逻辑,这里基于eBPF自己完成vxlan封装和解封装,不走Linux内核vxlan模块和ct模块。 eBPF功能1 响应arp请求2 网口报文跳转3 vxlan封装和解封装tc_ingress和tc_egress都加载到主机veth口和 阅读全文

posted @ 2024-11-09 11:18 王景迁 阅读(194) 评论(0) 推荐(0)

cilium pod访问cluster ip
摘要:cilium 1.15.1 cilium在主机网口上没有加载tc规则,因为tc filter show dev 主机网口 ingress和tc filter show dev 主机网口 egress没有结果。cilium有自己的ct表,独立于内核。 1. 区分报文类型走不同流程。bpf/bpf_lx 阅读全文

posted @ 2024-10-28 22:18 王景迁 阅读(62) 评论(0) 推荐(0)

eBPF 代答arp请求
摘要:eBPF代答veth口arp请求 在cilium中,eBPF tc ingress负责代答容器网卡的arp请求,回复的mac地址是容器网卡对端veth口mac地址,与当前逻辑类似,这里只是回复了假mac。在kube-ovn中,ovs br-int网桥上xxx_h负责响应容器网卡的arp请求,没有ge 阅读全文

posted @ 2024-08-13 06:59 王景迁 阅读(136) 评论(0) 推荐(0)

eBPF skb字段pkt_type
摘要: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 阅读全文

posted @ 2024-07-29 09:14 王景迁 阅读(95) 评论(0) 推荐(0)

eBPF bpf_redirect函数
摘要:函数定义 https://www.man7.org/linux/man-pages/man7/bpf-helpers.7.html bpf_redirect不指定flag时,默认走egress,veth egress(in)和虚拟机网口egress(out)方向不同。 网卡响应报文 网卡要响应报文, 阅读全文

posted @ 2024-07-16 09:26 王景迁 阅读(221) 评论(0) 推荐(0)

eBPF 容器持久化map到宿主机上
摘要:问题现象 k8s上启动pod后,使用主机网络的容器,加载eBPF程序到网口上,持久化map只能保存在容器文件系统/sys/fs/bpf中。容器复位后,新容器与原来eBPF程序使用的不是同一个map。 问题分析 新容器使用新的文件系统,无法找回原来的/sys/fs/bpf挂载点,需要持久化到宿主机上。 阅读全文

posted @ 2024-07-11 09:28 王景迁 阅读(85) 评论(0) 推荐(0)

eBPF 用户态和内核态基于ringbuf交互
摘要:相比于perf_event_array,ringbuf优势在于1. 读取数据是有序的,即提交顺序和消费顺序保持一致。2. 避免数据复制,即提交数据到map和传递到用户态都不需要拷贝。 内核态 ringbuf/ringbuf.c #include "../headers/vmlinux.h" #inc 阅读全文

posted @ 2024-07-11 08:59 王景迁 阅读(231) 评论(0) 推荐(0)

eBPF bpftool
摘要:bpftool是eBPF的命令行工具,prog和map是最常用的2种方式。 prog # 查看系统中所有的BPF Prog bpftool prog list # 查看tracelog bpftool prog tracelog map # 查看系统中所有的BPF Map bpftool map l 阅读全文

posted @ 2024-07-04 08:37 王景迁 阅读(184) 评论(0) 推荐(0)

eBPF内存操作
摘要:基于LLVM内置函数来操作内存 #ifndef memmove #define memmove(dest, src, n) __builtin_memmove((dest), (src), (n)) #endif #ifndef memset #define memset(dest, chr, n) 阅读全文

posted @ 2024-06-11 08:46 王景迁 阅读(39) 评论(0) 推荐(0)

eBPF常用map类型和操作
摘要: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塞满之后,继续插入,自动删除最近 阅读全文

posted @ 2024-05-19 16:58 王景迁 阅读(200) 评论(0) 推荐(0)

eBPF约束
摘要:内核态约束 1. 内核态eBPF无法使用C语言标准库。因为不支持malloc,所以无法扩展skb空间且无法直接从内核态拷贝整个报文到用户态。2. 内核态eBPF无法获取当前时间,bpf_ktime_get_ns函数返回系统启动后运行纳秒数,不包括系统暂停时间。 https://www.man7.or 阅读全文

posted @ 2024-05-05 08:18 王景迁 阅读(147) 评论(0) 推荐(0)

eBPF基于LPM实现路由匹配
摘要:基于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 阅读全文

posted @ 2024-05-04 11:26 王景迁 阅读(180) 评论(0) 推荐(0)

eBPF xdp和tc区别
摘要:xdp tc 层次 网卡驱动层 数据链路层 位置 进入Linux网络协议栈之前 在Linux网络协议栈中,netfilter之前 方向 只有ingress 有ingress和egress 修改 支持修改报文 支持修改报文,有skb结构,修改更方便 网卡响应关系 网卡响应在xdp之后 网卡响应在tc之 阅读全文

posted @ 2024-04-14 14:35 王景迁 阅读(191) 评论(0) 推荐(0)

调试eBPF程序
摘要:虽然eBPF内核态部分使用C语言编写,但是无法gdb,只能通过打印来调试。调用类似于C语言中printf函数的bpf_printk函数,打印结果输出到/sys/kernel/debug/tracing/trace。 bpf_printk最多带3个参数,bpf_trace_printk也是如此。 查看 阅读全文

posted @ 2024-04-14 13:54 王景迁 阅读(209) 评论(0) 推荐(0)

eBPF指定网口丢弃icmp报文
摘要:ubuntu 23.10 安装eBPF依赖 # 安装编译工具 apt install -y llvm clang # 确认内核具有BTF支持,路径存在,内核没有BTF支持,使用vmlinux.h无法通过编译 ls /sys/kernel/btf # 生成vmlinux.h # apt install 阅读全文

posted @ 2024-04-14 12:35 王景迁 阅读(86) 评论(0) 推荐(0)

1 2 下一页

导航