使用GRE隧道(或任何使用eBPF的vNIC)通过流量的正确方式是什么



我使用以下命令在虚拟机上设置了GRE链接:ip tunnel add tap0 mode gre local <foo> remote <bar>和不同虚拟机(在同一子网中(上的对等设备完全相同,除了foo<->bar

我创建了一个eBPFtc程序,它调用bpf_clone_redirect将数据包复制到其中一台主机上的隧道设备(即复制到tap0链路的流量(:

SEC("tc")
SEC("tc")
int tc_ingress(struct __sk_buff *skb) {
__u32 key = 0;
struct destination *dest = bpf_map_lookup_elem(&destinations, &key);
if (dest != NULL) {
struct bpf_tunnel_key key = {};
int ret;
key.remote_ipv4 = dest->destination_ip;
key.tunnel_id = dest->iface_idx;
key.tunnel_tos = 0;
key.tunnel_ttl = 64;
ret = bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0);
if (ret < 0) {
// error setting the tunnel key, do not redirect simply continue.
return TC_ACT_OK;
}
// zero flag means that the socket buffer is 
// cloned to the iface egress path.
bpf_clone_redirect(skb, dest->iface_idx, 0);
}
return TC_ACT_OK;
}
}

我看到了通过运行tcpdump -i tap0传递到GRE链接tap0的流量,但我没有看到它的远程对应方上的流量。。。

  1. 在这种情况下,是否有必要定义设备的地址(alaip addr <> dev tap0(
  2. 定义此类隧道的正确方式是什么
  3. 如果我在eth0上设置了iptable规则,它会阻止发送到GRE链接的流量吗?如果";是";有办法绕过这些吗

对于任何试图路由到GRE隧道的人,请使用提供的bpf_skb_set_tunnel_key结构。请参阅中的示例https://github.com/torvalds/linux/blob/5bfc75d92efd494db37f5c4c173d3639d4772966/samples/bpf/tc_l2_redirect_kern.c)。

根据我的用例-

对于任何试图在Azure虚拟机上创建GRE隧道的人,请注意,目前这是不可能的https://learn.microsoft.com/en-us/answers/questions/496591/does-azure-virtual-network-support-gre.html

相关内容

  • 没有找到相关文章

最新更新