0

我想将 UDP/TCP 数据包转发到连接到同一路由器的其他设备。我只是通过检查数据包类型及其有效负载来编写将数据包转发到其他接口的代码。这工作正常,但是当我尝试将相同的数据包转发到其他设备时,我没有在其他设备上收到数据包。我使用辅助函数更新了校验和,但重定向到其他设备对我不起作用。TC_ACT_REDIRECT类似于XDP_TX? _

这是一段代码(如果值为c1,则更新目标地址并将数据包转发到目标):

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

使用上面的代码块,我可以将数据包重定向到虚拟接口,但不能重定向到更新的目的地。

4

1 回答 1

1

如果我没记错的话,你错过了目标设备的 MAC 地址。您还需要更新 MAC 地址。您正在虚拟机上接收数据包,因为它没有 MAC 地址。请检查mac地址,您的问题将得到解决。

于 2020-12-16T14:49:13.203 回答