首页 > 其他分享 >基于eBPF实现vxlan封装和解封装

基于eBPF实现vxlan封装和解封装

时间:2024-11-09 11:08:04浏览次数:1  
标签:封装 eBPF ip dev add test handle tc vxlan

不同于cilium基于Linux内核完成vxlan封装和解封装的逻辑,这里基于eBPF自己完成vxlan封装和解封装,不走Linux内核vxlan模块。

tc_ingress和tc_egress加载到主机veth口和主机网口ens33上。

eBPF封装vxlan:通过bpf_skb_adjust_room函数,增加ip头+udp头+vxlan头+以太网头。

打通跨节点流量

# add_veth.sh
# node1
ip netns add ns
ip link add veth0 type veth peer name veth1
ip link set veth1 netns ns
ip netns exec ns ip addr add 100.1.1.1/24 dev veth1
ip netns exec ns ip link set dev veth1 up
ip netns exec ns ip route add default dev veth1
ip link set dev veth0 up
# node2
ip netns add ns
ip link add veth0 type veth peer name veth1
ip link set veth1 netns ns
ip netns exec ns ip addr add 101.1.1.1/24 dev veth1
ip netns exec ns ip link set dev veth1 up
ip netns exec ns ip route add default dev veth1
ip link set dev veth0 up

# add_tc.sh
clang -c ./ebpf-test/handle/tc_bond_egress.c -o ./ebpf-test/handle/tc_bond_egress.o -target bpf -O2 -g
clang -c ./ebpf-test/handle/tc_bond_ingress.c -o ./ebpf-test/handle/tc_bond_ingress.o -target bpf -O2 -g
clang -c ./ebpf-test/handle/tc_veth_egress.c -o ./ebpf-test/handle/tc_veth_egress.o -target bpf -O2 -g
clang -c ./ebpf-test/handle/tc_veth_ingress.c -o ./ebpf-test/handle/tc_veth_ingress.o -target bpf -O2 -g

tc qdisc del dev ens33 clsact
tc qdisc add dev ens33 clsact
tc qdisc del dev veth0 clsact
tc qdisc add dev veth0 clsact

tc filter add dev ens33 egress bpf da obj ./ebpf-test/handle/tc_bond_egress.o sec tc
tc filter add dev ens33 ingress bpf da obj ./ebpf-test/handle/tc_bond_ingress.o sec tc
tc filter add dev veth0 ingress bpf da obj ./ebpf-test/handle/tc_veth_egress.o sec tc
tc filter add dev veth0 egress bpf da obj ./ebpf-test/handle/tc_veth_ingress.o sec tc

 

标签:封装,eBPF,ip,dev,add,test,handle,tc,vxlan
From: https://www.cnblogs.com/WJQ2017/p/18536469

相关文章

  • 20241107数据封装
    20241107数据封装数据包利用网络在不同设备之间传输时,为了可靠和准确地发送到目的地,并且高效地利用传输资源(传输设备和传输线路),事先要对数据包进行拆分和打包,在所发送的数据包上附加上目标地址,本地地址,以及一些用于纠错的字节,安全性和可靠性较高时,还要进行加密处理等等。这些操......
  • 【C++】封装红黑树实现mymap和myset
     无论你觉得自己多么的了不起,也永远有人比你更强。......
  • CUDA开始的GPU编程 - 第四章:C++封装GPU上的数组
    第四章:C++封装GPU上的数组std::vector的秘密:第二模板参数**你知道吗?**std::vector作为模板类,其实有两个模板参数:std::vector<T,AllocatorT>那为什么我们平时只用了std::vector呢?因为第二个参数默认是std::allocator。也就是std::vector等价于std::vector<T,s......
  • Avalonia封装实现指定组件允许拖动的工具类
    创建Avalonia的MVVM项目,命名DragDemo,然后将项目的Nuget包更新到预览版 12345678<ItemGroup>        <PackageReferenceInclude="Avalonia"Version="11.0.0-preview5"/>        <PackageReferenceInclude="Avalonia.Desktop&qu......
  • 类的三大特性(封装、继承、多态)
    1.封装:封装是指将数据(属性)和行为(方法)捆绑在一起,形成一个对象,并通过公共接口来访问这个对象。封装的目的是保护对象的内部状态,防止外部直接访问和修改对象的数据,确保数据的完整性和程序的安全性。封装的意义:1.将属性和行为作为一个整体,表现在生活中的事物2.将属性和行为加以......
  • Python 继承、多态、封装、抽象
    面向对象编程(OOP)是Python中的一种重要编程范式,它通过类和对象来组织代码。OOP的四个核心概念是继承(Inheritance)、多态(Polymorphism)、封装(Encapsulation)和数据抽象(DataAbstraction)。下面将详细介绍这四个概念。继承(Inheritance)继承是面向对象编程(OOP)的一个基本概念,它允......
  • C语言字符数组 java封装
    1.intmain(void){   inta[5]={1,3,5,7,9};   charstrl[5]={'A','B','C','D','E'};   charstr2[5]="ABCD";//不能是ABCDE,最后还有\0   inti=0;   //for(i=0;i<5;i++)   //{ ......
  • 0基础学Python装饰器封装、类成员与静态方法、魔术方法
    0基础学Python装饰器封装、类成员与静态方法、魔术方法装饰器封装类成员和静态方法实例属性和方法类属性和类方法静态方法使用场景魔术方法定义初始化与表示方法比较运算方法算术运算方法代码演示装饰器封装装饰器(decorators)是一种高阶函数,用于在不修改原有函数或......
  • 使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理
    在开发桌面界面的时候,往往都需要对一些通用的窗体进行一些抽象封装处理,以便统一界面效果,以及继承一些通用的处理过程,减少重复编码。本篇随笔介绍使用wxpython开发跨平台桌面应用,基类对话框窗体的封装处理,介绍基于wx.lib.sized_controls.SizedDialog对话框类的基类封装,以便简化子......
  • 封装红黑树实现mymap和myset
    前面我们已经了解过红黑树如何实现,和map与set的基本用法;要继续深入了解map,set中的库函数的用法,与细节那么我们就可以试着简单用语言封装模拟实现一下map与set; 这里就分享一下我的思路;若没了解过红黑树如何实现,和map与set的基本用法建议先去了解一下哦;我之前的文章中就有。......