#bpf #ebpf #xdp-bpf
#bpf #ebpf #xdp-bpf
Вопрос:
Я пытаюсь разработать балансировщик нагрузки с использованием ebpf. Я хочу передать входящий пакет разным адресатам (устройствам, подключенным к одной сети). Хотя я использовал clone_bpf_redirect()
вспомогательную функцию для перенаправления пакета на реальные / виртуальные интерфейсы, и она работает нормально, теперь я хочу передать / передать пакет другим устройствам, подключенным к той же сети.
Насколько я знаю, XDP его не поддерживает. Поэтому, используя перехват tc bpf. Есть ли какая-либо вспомогательная функция или какое действие я должен использовать? Может кто-нибудь подсказать мне, как я могу это сделать?
**eBpf load divider**: 192.168.98.178 (load divider)
**Receiver 1**: 192.168.98.131
**Receiver 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 *)amp;iph->daddr) amp; 0xffff);
sum = ntohs(udp->check);
sum = (sum amp; 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, но я хочу получить тот же пакет на другие устройства, подключенные к сети. Как я могу перенаправить пакет с устройства, а не с интерфейсов?
Комментарии:
1. Я не понимаю, в чем проблема. Вы можете использовать
bpf_clone_redirect
программу tc-bpf и отправлять пакеты на другие устройства.2. bpf_clone_redirect(skb, skb-> ifindex, 0); или bpf_clone_redirect(skb, skb-> ifindex 1, 0); эта вспомогательная функция перенаправляет трафик на тот же интерфейс устройства, верно ?… я просто хочу переслать входной пакет на другое устройство, подключенное к той же сети.
3. давайте предположим, что в сценарии у нас есть 4 устройства, подключенных к сети, программа bpf запущена только на устройстве 1, а устройство 2 отправляет сообщение «привет» на устройство 1. В ответ устройство 1 отправляет сообщение «привет» на устройства 3 и 4. Я не знаю, как я могу перенаправить сообщение на другие устройства, а не на интерфейс устройства 1. просто хочу реализовать одноадресную / многоадресную рассылку.
4. Нет, этот помощник также может перенаправлять на другие устройства в соответствии с документацией: man7.org/linux/man-pages/man7/bpf-helpers.7.html .
5. Разве у вас уже нет фрагмента кода, с которым вы можете работать? (
Although I have used the clone_bpf_redirect helper function to redirect the packet to real/ virtual interfaces and its working fine.
) Вам необходимо изменить адрес в пакете, прежде чем перенаправлять его на устройство. Вы можете найти примеры в исходном коде Linux, в разделеsamples/bpf/
.