Пакет Tc bpf пересылается на другое устройство путем обновления контрольной суммы

Я хочу перенаправить пакет UDP/TCP на другие устройства, подключенные к тому же маршрутизатору. Я просто пишу код, который пересылает пакет на другие интерфейсы, проверяя тип пакета и его полезную нагрузку. Это работает нормально, но когда я пытаюсь переслать тот же пакет на другие устройства, я не получаю пакет на других устройствах. Я обновил контрольную сумму с помощью вспомогательных функций, и перенаправление на другие устройства у меня не работает. TC_ACT_REDIRECT похож на XDP_TX?

Вот фрагмент кода (если значение c равно 1, он обновляет адрес назначения и пересылает пакет в место назначения):

if (c == 1) {
    int ipaddr = htonl(3232260738);  // Dest: 192.168.98.130

    sum = bpf_csum_diff((void *)&old1_daddr, 4, (void *)&ipaddr, 4, 0);

    bpf_skb_store_bytes(skb, ETH_HLEN + offsetof(struct iphdr, daddr),
                        (void *)&ipaddr, 4, 0);
    bpf_l3_csum_replace(skb, IP_CSUM_OFFSET, 0, sum, 0);
    bpf_l4_csum_replace(skb, IP_CSUM_OFFSET1, 0, sum, BPF_F_PSEUDO_HDR);

    bpf_clone_redirect(skb, skb->ifindex, 0 );

    return TC_ACT_REDIRECT;
}

Вот команда входа tc

sudo tc filter add dev ens33 ingress bpf da obj tcbpf1_kern.o sec classifier

с приведенным выше фрагментом кода я могу перенаправить пакет на виртуальный интерфейс, но не на обновленный пункт назначения.


person Linux baby    schedule 06.10.2020    source источник
comment
может ли действие TC_ACT_REDIRECT перенаправить пакет в обновленное место назначения ????   -  person Linux baby    schedule 06.10.2020
comment
Вы видите, что пакеты покидают систему? Вы видите отбрасывание пакетов на другой стороне из-за неправильной контрольной суммы (ethtool -S)?   -  person pchaigno    schedule 06.10.2020
comment
У меня есть две виртуальные машины на моем ноутбуке, и если я использовал ethtool -S ens33, он показывает мне одни и те же данные на обеих виртуальных машинах...   -  person Linux baby    schedule 06.10.2020
comment
нет отбрасывания пакетов с обеих сторон. Я просто тестирую с помощью sudo netstat -i   -  person Linux baby    schedule 06.10.2020


Ответы (1)


если я не ошибаюсь, вам не хватает MAC-адреса вашего целевого устройства. Вам также необходимо обновить MAC-адрес. Вы получаете пакет на виртуальной машине, потому что у него нет mac-адреса. Пожалуйста, проверьте MAC-адрес, и ваша проблема будет решена.

person Ahsan Dilawar    schedule 16.12.2020
comment
да ты прав. - person Linux baby; 16.12.2020