我使用以下命令在虚拟机上设置了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
的流量,但我没有看到它的远程对应方上的流量。。。
- 在这种情况下,是否有必要定义设备的地址(ala
ip addr <> dev tap0
( - 定义此类隧道的正确方式是什么
- 如果我在
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