我尝试使用 ebpf 设计负载均衡器。我想将传入的数据包传输到不同的目的地(连接在同一网络中的设备)。尽管我使用了 clone_bpf_redirect 辅助函数将数据包重定向到真实/虚拟接口并且它工作正常。现在我想将数据包广播/单播到连接在同一网络中的其他设备。据我所知,XDP 不支持它。因此,使用 tc bpf 挂钩。是否有任何辅助功能或我应该使用哪个操作?谁能指导我如何做到这一点?
eBpf 负载分配器:192.168.98.178(负载分配器) 接收器1:192.168.98.131 接收器2:192.168.98.138
iph->daddr = htonl(3232260739); //Dest: 192.168.98.131
iph->check = 0;
iph->check = checksum((unsigned short *)iph, sizeof(struct iphdr));
// Update upd packet checksum of
sum = old_daddr + (~ntohs(*(unsigned short *)&iph->daddr) & 0xffff);
sum += ntohs(udp->check);
sum = (sum & 0xffff) + (sum>>16);
udp->check = htons(sum + (sum>>16) - 1);
// clone the packet and redirect to infdex
bpf_clone_redirect(skb, skb->ifindex, 0);
//clone the packet and redirect to infdex (virtual interface 2)
bpf_clone_redirect(skb, skb->ifindex + 2, 0);
//clone the packet and redirect to infdex (virtual interface 4)
bpf_clone_redirect(skb, skb->ifindex + 4, 0);
return TC_ACT_OK;
// Or
// return TC_ACT_REDIRECT;
sudo tc filter add dev ens33 ingress bpf da obj bpf_loadbalancer.o sec ingress
在此之后,我将 1 个数据包发送到 3 个不同的 ifindex,但我想将相同的数据包发送到连接到网络的其他设备。任何人都可以帮助我如何将数据包重定向到设备之外,而不是接口?谢谢