具有多个隧道ID的OvS VXLAN隧道仅适用于一个隧道ID

时间:2019-01-02 16:25:47

标签: vagrant sdn tunnel openflow openvswitch

我想在不同VM上的Linux网络接口之间建立VXLAN隧道。更精确地,拓扑如下。我有两个安装了OvS 2.5.5的Ubuntu 16.04 Vagrant盒。在每个VM上,我创建了一个名为kos的OvS网桥,并使用以下命令向每个网桥添加了vxlan端口/接口:

ovs-vsctl add-port kos vtep -- set interface vtep type=vxlan option:remote_ip=flow option:key=flow

然后,我在每台计算机上创建了两个Linux网络接口。同一台计算机上的接口具有相同的IP地址,但具有不同的MAC地址。我希望将四个接口分为两个单独的VXLAN(分别为ID 1和2),并使用OvS VXLAN隧道来启用不同VM上但在同一VXLAN中的接口之间的通信。用于创建接口并将其连接到OvS的命令为:

VM1:

ovs-vsctl add-port kos kos11 -- set interface kos11 type=internal mac="02\:00\:00\:00\:00\:11" && ip addr add 10.0.0.1/8 scope link dev kos11 && ip link set kos11 up
ovs-vsctl add-port kos kos21 -- set interface kos21 type=internal mac="02\:00\:00\:00\:00\:21" && ip addr add 10.0.0.1/8 scope link dev kos21 && ip link set kos21 up

VM2:

ovs-vsctl add-port kos kos12 -- set interface kos12 type=internal mac="02\:00\:00\:00\:00\:12" && ip addr add 10.0.0.2/8 scope link dev kos12 && ip link set kos12 up
ovs-vsctl add-port kos kos22 -- set interface kos22 type=internal mac="02\:00\:00\:00\:00\:22" && ip addr add 10.0.0.2/8 scope link dev kos22 && ip link set kos22 up

每个接口名称都是由“ kos”后接两位数字组成的,第一个数字是接口的VNI,第二个数字是接口所属的VM的编号。

最后,我检索了每个接口的开放流端口(两个VM上的vtep,kos11,kos21,kos12,kos22),并添加了以下OpenFlow流:

VM1:

table=0,in_port=2,actions=set_field:1->tun_id,resubmit(,1)
table=0,in_port=3,actions=set_field:2->tun_id,resubmit(,1)
table=0,actions=resubmit(,1)

table=1,tun_id=1,arp,arp_tpa=10.0.0.1,actions=output:2
table=1,tun_id=1,dl_dst=02:00:00:00:00:11,actions=output:2

table=1,tun_id=2,arp,arp_tpa=10.0.0.1,actions=output:3
table=1,tun_id=2,dl_dst=02:00:00:00:00:21,actions=output:3

table=1,tun_id=1,arp,arp_tpa=10.0.0.2,actions=set_field:172.28.128.5->tun_dst,output:1
table=1,tun_id=1,dl_dst=02:00:00:00:00:12,actions=set_field:172.28.128.5->tun_dst,output:1

table=1,tun_id=2,arp,arp_tpa=10.0.0.2,actions=set_field:172.28.128.5->tun_dst,output:1
table=1,tun_id=2,dl_dst=02:00:00:00:00:22,actions=set_field:172.28.128.5->tun_dst,output:1

table=1,actions=drop

VM2:

table=0,in_port=2,actions=set_field:1->tun_id,resubmit(,1)
table=0,in_port=3,actions=set_field:2->tun_id,resubmit(,1)
table=0,actions=resubmit(,1)

table=1,tun_id=1,arp,arp_tpa=10.0.0.2,actions=output:2
table=1,tun_id=1,dl_dst=02:00:00:00:00:12,actions=output:2

table=1,tun_id=2,arp,arp_tpa=10.0.0.2,actions=output:3
table=1,tun_id=2,dl_dst=02:00:00:00:00:22,actions=output:3

table=1,tun_id=1,arp,arp_tpa=10.0.0.1,actions=set_field:172.28.128.4->tun_dst,output:1
table=1,tun_id=1,dl_dst=02:00:00:00:00:11,actions=set_field:172.28.128.4->tun_dst,output:1

table=1,tun_id=2,arp,arp_tpa=10.0.0.1,actions=set_field:172.28.128.4->tun_dst,output:1
table=1,tun_id=2,dl_dst=02:00:00:00:00:21,actions=set_field:172.28.128.4->tun_dst,output:1

table=1,actions=drop

1是与两个VM上的接口vtep关联的开放流端口。

在VM1 2和3上分别是与接口kos11和kos21关联的开放流端口。

在VM2 2和3上分别是与接口kos12和kos22关联的开放流端口。

1是VXLAN kos11和kos12的VNI,2是VXLAN kos21和kos22的VNI。

172.28.128.4和172.28.128.5是两个VM可以彼此ping通的网络接口的IP地址(也就是隧道端点的IP)。

执行上述步骤后,kos11可以对kos12进行ping操作,反之亦然(又称使用VNI 1的VXLAN的隧道传输),而从kos21进行ping的kos22或相反的操作会导致无法到达目标主机。我在从kos21 ping到kos22时在tcpdump上运行,这就是我得到的:

ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28
ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28
ARP, Request who-has 10.0.0.2 tell 10.0.0.1, length 28

我在做什么错?我该如何解决?

1 个答案:

答案 0 :(得分:0)

不起作用的原因是,同一子网中不能有多个接口。我发现的解决方法是将每个接口放在单独的Linux网络名称空间中。