OpenStack vlan模式下网络流量走向

使用openvswitch+vlan的组网

以生产网vlan为101和102为例在openstack上创建个私有网络,
创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。
创建了一对 patch port,连接 br-int 和 br-eth0。
设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。
设置 br-eth0 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。

br-int上的local_id和vlan_id的转换是实现多租户的主要技术。

以下介绍在云平台三中情况数据流量的走向

相同物理机上的虚拟机

vm1和vm2在同一个宿主机上同一个项目下同一个子网时,两个虚机之间的流量是不需要经过交换机的,直接通过ovs的br-int桥就可以做转发了,不同项目是不通的因为br-int上有local_id用于多租户隔离。

不同物理机上的虚拟机

vm1和vm2在同一个宿主机上同一个项目下同一个子网时,两个虚拟机之间的流量是需要通过物理交换机进行转发的

vm的流量首先经过tap网卡到qbr桥上,qbr桥是linux-bridge桥,曾经的ovs不支持安全组的实现所以openstack只能加一个qbr桥在上面通过iptables来实现安全组,(mitaka版本中已经没有了因为ovs已经可以通过openflow来实现了),通过veth口将br-int和qbr桥连接起来,流量到br-int上,br-int上有对应的ovs规则转发到br-eth0上,,r-eth0 中的 flow rules。从 patch port 进入的数据帧,将内部 ocal_id 修改为vlan_id,再从 eth0 端口发出。通过交换机到达另外一个计算机节点。

不同租户的不同子网的通信或虚机根外部通信

需要经过网络节点,由网络节点的qroute做三层转发,也可以直接使用物理交换机。不同子网的通信,虚机会将流量丢给默认网关然后到达网络节点的qrouter通过qrouter的三层转发通讯。

使用内部vlan号是为了实现多租户网络隔离,也就是说计算节点上将数据包隔离通过br-int的loca_id,假设没有这个local_id的话,租户a的192.168.1.0/24和租户b的192.168.1.0/24在同一个计算节点的同一个br-int的网桥上,如果没有local_id隔离,网络就串了。这种是openvswitch的实现方式,

linuxbridge的实现方式

比如租户a的私有网络是vlan100,租户b的私户网络是vlan200,然后linuxbridge会将在这个计算节点上创建两个网桥。然后用vconfig将对应的网卡创建出子接口,挂到刚刚创的桥上,在将对应的虚机tap网卡挂载到对应的桥上。