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

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

eBPF功能
1 响应arp请求
2 网口报文跳转
3 vxlan封装和解封装
tc_ingress和tc_egress都加载到主机veth口和主机网口ens33上,在ens33上做vxlan封装和解封装。

eBPF封装vxlan:通过bpf_skb_adjust_room函数,增加ip头+udp头+vxlan头+以太网头,并填充字段值。
eBPF解封装vxlan:通过bpf_skb_adjust_room函数,删除ip头+udp头+vxlan头+以太网头,并更新原外层以太网头源mac和目的mac。

打通跨节点流量

# 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 link set veth1 mtu 1450
ip link set veth0 mtu 1450
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 link set veth1 mtu 1450
ip link set veth0 mtu 1450
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

确认没有走Linux内核ct模块

posted on 2024-11-09 11:18  王景迁  阅读(8)  评论(0编辑  收藏  举报

导航