openstack vlan模式下的隔离和数据流向

栏目: 编程工具 · 发布时间: 7年前

内容简介:计算机网络,是分层实现的,不同协议工作在不同层,按着OSI的分层模型,共有七个层,我们一般所说的隔离,通常指的是第2层,也叫“数据链路层”;数据链路层的网络包,也叫“帧”,我们常说的网卡的MAC地址,就是帧的地址,MAC,其实是“媒体访问控制”(media access control)的简称,这是数据链路层的一个子层。为什么要在这个二层上做隔离呢?因为二层的帧,其中一些帧的地址是广播地址,在同一个二层的设备都可以、也必须接收这些帧,交换机一般认为工作在二层,对这些广播包,也都要转发,所以二层通常被称为一个

一、隔离

计算机网络,是分层实现的,不同协议工作在不同层,按着OSI的分层模型,共有七个层,我们一般所说的隔离,通常指的是第2层,也叫“数据链路层”;数据链路层的网络包,也叫“帧”,我们常说的网卡的MAC地址,就是帧的地址,MAC,其实是“媒体访问控制”(media access control)的简称,这是数据链路层的一个子层。

为什么要在这个二层上做隔离呢?因为二层的帧,其中一些帧的地址是广播地址,在同一个二层的设备都可以、也必须接收这些帧,交换机一般认为工作在二层,对这些广播包,也都要转发,所以二层通常被称为一个“广播域”。

二、VLAN

Openstack Neutorn的实现核心是二层物理网络的抽象与管理,支持多种不同的网络隔离技术,以保障租户tenant之间的网络隔离,而VLAN就是主要使用的隔离方案,它本身就是交换机广泛使用的二层隔离技术;但这种方案也有一定的局限性,首先管理相对麻烦,需要配合设置物理交换机,另外VLAN的可用数量也有限制,VLAN的ID号仅有四千多个,我们假设每个租户分配1个VLAN,那最多也就能支持四千多个租户。

三、虚拟网络设备

openstack vlan模式下的隔离和数据流向

图1:vlan模式下计算节点的虚拟网络拓扑结构图

3.1 在vlan网络模式下,计算节点上虚拟网络设备如下:

(1)tapxxx设备

简单的理解为为虚拟机提供的虚拟网卡,就是VM对应的网口的vNIC。虚拟机的网络功能由vNIC提供,Hypervisor可以为每个虚拟机创建一个或多个vNIC。

(2) qbrxxx设备

Linux网桥,简单理解就是为安全组服务,负责安全;因为不能在tap设备上配置network ACL rules,增加该linux bridge来实现iptable的安全组策略。

(3) qvmxxx设备

qvm主要是给从VM出来的包打上vlan tag。

(4) plyxxx设备

Ovs bridge,主要功能是实现过滤非本机MAC的单播报文。

(5) pvixxx和pvoxxx设备

ply是策略网桥,ply与br-int之间由一对path port连接,连接ply的一端为pvi端口,连接br-int的一端为pvo端口。

(6) br-int设备

br-int集成网桥,主要是帧的转发功能。

(7) int-brcps和phy-brcps设备

主要负责将br-int转发的帧中的vlanid转换。

(8) brcps和trunk0设备

br-cps是Ovs bridge ,Trunk0由eth0和eth1组成的bond(active-backup模式),packets要想进入physical network,还得通过真正的物理网卡trunk0(eth2和eth4),所以将trunk0桥接到br-1上来打通整个链路。

(9) tapuuu设备

DHCP服务监听端口。

3.2 计算节点上的网络设备信息

3.2.1 Linux bridage信息

Compute153:~ # virsh list 
Id   Name                          State 
---------------------------------------------------- 
 1    instance-00000583             running 
 2    instance-000005df             running 
 3    instance-00000603             running 
 4    instance-00000654             running 
 5    instance-0000068f             running 
 6    instance-000006d7             running 
 7    instance-0000070d             running 
 9    instance-00000769             running 
 10   instance-0000090d             running 
 11   instance-00000a37             running 

计算节点Compute153上启动了10个虚拟机。

Compute153 
:~  
# brctl show 
bridge name     bridge id               STP enabled     interfaces 
qbr7fc1e7d0-0c          8000.bee6e69f9457       no              qvm7fc1e7d0-0c 
                                                       tap7fc1e7d0-0c 
qbr931641ad-4b          8000.eaa1a27fffcb       no              qvm931641ad-4b 
                                                       tap931641ad-4b 
qbr963c4b38-70          8000.7635674ec1fc       no              qvm963c4b38-70 
                                                       tap963c4b38-70 
qbr9df6f9f9-42          8000.2e1eba67aca5       no              qvm9df6f9f9-42 
                                                       tap9df6f9f9-42 
qbrb9dd9478-0f          8000.2e954943421c       no              qvmb9dd9478-0f 
                                                       tapb9dd9478-0f 
qbrc24f2999-b9          8000.427df7c7a333       no              qvmc24f2999-b9 
                                                       tapc24f2999-b9 
qbrc3833757-af          8000.7e6eb025950b       no              qvmc3833757-af 
                                                       tapc3833757-af 
qbrc78917be-9c          8000.1a67a8814d03       no              qvmc78917be-9c 
                                                       tapc78917b0-9c 
qbrd5cbf3b0-ef          8000.f6de8391f526       no              qvmd5cbf3b0-ef 
                                                       tapd5cbf3b0-ef 
qbrfe79631b-85          8000.c2d425903a69       no              qvmfe79631b-85 
                                                       tapfe79631b-85 

可以看到有10个qbr,每一个虚拟机的每一张网卡都有对应的qbr。每一个qbr都有对应的 tap和qvm,对应图上的qbr北向与南向接口。

3.2.2 ovs bridage信息

通过ovs-vsctl可以查询主机上已有的 OVS bridge及其中的 port。

Bridge "plyc24f2999-b9" 
        Port "qvmc24f2999-b9" 
            Interface"qvmc24f2999-b9" 
                type: internal 
        Port "plyc24f2999-b9" 
            Interface"plyc24f2999-b9" 
                type: internal 
        Port "pvic24f2999-b9" 
            Interface"pvic24f2999-b9" 
                type: patch 
                options: {peer="pvoc24f2999-b9"} 

可以看到ply网桥信息,上面对接qvm,下面对接br-int,ply与br-int之间是一对port接口, pvi与pvo接口。

Bridge br-int 
        fail_mode: secure 
        Port "pvoc78917be-9c" 
            tag: 5 
            Interface"pvoc78917be-9c" 
                type: patch 
                options:{peer="pvic78917be-9c"} 
        Port "pvob9dd9478-0f" 
            tag: 9 
            Interface"pvob9dd9478-0f" 
                type: patch 
                options:{peer="pvib9dd9478-0f"} 

注意pov端口是有tag的,这是一个内部的tag,主要是为了区分同一虚拟机的不同虚拟网 卡 设备,会将多张网卡依次编号。

Bridge br-int 
        fail_mode: secure 
        Port "pvoc78917be-9c" 
            tag: 5 
            Interface"pvoc78917be-9c" 
                type: patch 
                options:{peer="pvic78917be-9c"} 
        Port "pvob9dd9478-0f" 
            tag: 9 
            Interface"pvob9dd9478-0f" 
                type: patch 
                options:{peer="pvib9dd9478-0f"} 
        Port br-int 
            tag: 4095 
            Interface br-int 
                type: internal 
        Port int-brcps 
            Interface int-brcps 
                type: patch 
                options: {peer=phy-brcps} 
        Port "pvo9df6f9f9-42" 
            tag: 5 
            Interface"pvo9df6f9f9-42" 
                type: patch 
                options:{peer="pvi9df6f9f9-42"} 

可以看到br-int网桥上的所有端口信息,向上是pvo口,向下是int-brcps口,是用来连接 brcps网桥。

Bridge br-int 
        fail_mode: secure 
        Port "pvoc78917be-9c" 
            tag: 5 
            Interface"pvoc78917be-9c" 
                type: patch 
                options:{peer="pvic78917be-9c"} 
        Port int-brcps 
            Interface int-brcps 
                type: patch 
                options: {peer=phy-brcps} 

int-brcps和phy-brcps接口是br-int与brcps网桥相连的接口,查询br-int是可以找到与之相连的int-brcps,查询brcps网桥可以找到与之相连的phy-brcps接口。

Bridge brcps 
        Port external_om 
            tag:1405 
           Interface external_om 
               type: internal 
        Port "trunk0" 
           Interface "trunk0" 
        Port phy-brcps 
           Interface phy-brcps 
               type: patch 
               options: {peer=int-brcps} 
        Port external_api 
            tag:1400 
           Interface external_api 
               type: internal 
        Port brcps 
            tag:0 
           Interface brcps 
               type: internal 
        Port "om-physnet1" 
            tag:1089 
           Interface "om-physnet1" 
               type: internal 

管理面网桥brcps上有多个端口,用于与外部通信打通的external_om与external_api端口,带tag;向上的phy-brcps接口;本地接口brcps,以及端口om-physnet1,还有最重要的trunk0,实际的数据物理通信接口。

以上就是vlan模式虚拟机通信需要经过的所有端口,数据流向如下:

1)数据帧从VM出来,经过TAP提供的虚拟网口vNIC,再经过 Linux 网桥qrb安全验证,走到qvm,会打上一个内部的VLANtag,成为主机节点内部的local id。这个id的作用是区分同一个主机内部的不同VM;

2)继续南下到ply,资料显示作用是过滤掉非本机的MAC,主要作用是为了方便访问同一个主机的其他VM,如果目的源是同一台主机则直接访问,不用br-int转发;

3)继续走到br-int会实现转发到目的帧主机,南下到patch port,port会把帧中间的之前打的内部VLAN ID即local id删除,换成外部的VLAN ID;

4)之后帧走到实际的外部物理交换机网口,发送到目的地。

3.2.2 br-int dump-flows信息

br-int完成从brcps上过来流量(从口int-brcps到达)的vlan tag转换,下面例子可以看到从外部VLAN ID:1013转换为内部VLAN ID:2。

Compute153 
:~  
# ovs-ofctl dump-flows br-int 
NXST_FLOW reply (xid=0x4): 
 cookie=0xaf3ffaad56834ff8,duration=8767986.702s, table=0, n_packets=138635866, n_bytes=49130127982,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=1013actions=mod_vlan_vid:2,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=8759690.249s, table=0, n_packets=902894466, n_bytes=111008267998,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=1014actions=mod_vlan_vid:3,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=8606291.966s, table=0, n_packets=75523546, n_bytes=7721353259,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=503actions=mod_vlan_vid:4,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=7943259.828s, table=0, n_packets=27312770, n_bytes=4039091682,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=1011actions=mod_vlan_vid:5,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=7248098.099s, table=0, n_packets=17132221, n_bytes=1590164809,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=504actions=mod_vlan_vid:6,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=5730798.970s, table=0, n_packets=35859018, n_bytes=4389953008,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=1012actions=mod_vlan_vid:7,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=583874.187s, table=0, n_packets=2041814, n_bytes=433205117,idle_age=0, hard_age=65534, priority=3,in_port=1,dl_vlan=1015actions=mod_vlan_vid:8,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=146306.053s, table=0, n_packets=435169, n_bytes=31391505, idle_age=0,hard_age=65534, priority=3,in_port=1,dl_vlan=1016 actions=mod_vlan_vid:9,NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=9233017.369s, table=0, n_packets=8966890076, n_bytes=2799828872226,idle_age=0, hard_age=65534, priority=2,in_port=1 actions=drop 
 cookie=0xaf3ffaad56834ff8, duration=9233016.732s,table=0, n_packets=1106708092, n_bytes=190560627712, idle_age=0,hard_age=65534, priority=0 actions=NORMAL 
 cookie=0xaf3ffaad56834ff8,duration=9233019.667s, table=23, n_packets=0, n_bytes=0, idle_age=65534,hard_age=65534, priority=0 actions=drop 
 cookie=0xaf3ffaad56834ff8,duration=9233019.551s, table=24, n_packets=0, n_bytes=0, idle_age=65534,hard_age=65534, priority=0 actions=drop 

3.2.3 brcps dump-flows信息

brcps上负责从br-int上过来的流量(从口phy-brcps到达),实现local vlan到外部vlan的转换,下面例子可以看到从内部VLAN ID:2转换为外部VLAN ID:1013。

Compute153 
:~  
# ovs-ofctl dump-flows brcps 
NXST_FLOW reply (xid=0x4): 
 cookie=0xaaf94399aad7707e,duration=8768079.505s, table=0, n_packets=4610859, n_bytes=723908441,idle_age=6, hard_age=65534, priority=4,in_port=5,dl_vlan=2actions=mod_vlan_vid:1013,NORMAL 
 cookie=0xaaf94399aad7707e,duration=8759783.046s, table=0, n_packets=1061625441, n_bytes=180117774176,idle_age=0, hard_age=65534, priority=4,in_port=5,dl_vlan=3actions=mod_vlan_vid:1014,NORMAL 
 cookie=0xaaf94399aad7707e,duration=8606384.765s, table=0, n_packets=12135266, n_bytes=3806123480,idle_age=32, hard_age=65534, priority=4,in_port=5,dl_vlan=4actions=mod_vlan_vid:503,NORMAL 
 cookie=0xaaf94399aad7707e,duration=7943352.621s, table=0, n_packets=8783552, n_bytes=1513703385,idle_age=0, hard_age=65534, priority=4,in_port=5,dl_vlan=5actions=mod_vlan_vid:1011,NORMAL 
 cookie=0xaaf94399aad7707e,duration=7248190.902s, table=0, n_packets=2559355, n_bytes=510785011,idle_age=16, hard_age=65534, priority=4,in_port=5,dl_vlan=6actions=mod_vlan_vid:504,NORMAL 
 cookie=0xaaf94399aad7707e,duration=5730891.771s, table=0, n_packets=16831749, n_bytes=3864947698,idle_age=0, hard_age=65534, priority=4,in_port=5,dl_vlan=7actions=mod_vlan_vid:1012,NORMAL 
 cookie=0xaaf94399aad7707e,duration=583966.979s, table=0, n_packets=169878, n_bytes=24055409, idle_age=29,hard_age=65534, priority=4,in_port=5,dl_vlan=8 actions=mod_vlan_vid:1015,NORMAL 
 cookie=0xaaf94399aad7707e,duration=146398.874s, table=0, n_packets=1541, n_bytes=157171, idle_age=132,hard_age=65534, priority=4,in_port=5,dl_vlan=9 actions=mod_vlan_vid:1016,NORMAL 
 cookie=0xaaf94399aad7707e,duration=9233110.012s, table=0, n_packets=78, n_bytes=6780, idle_age=65534,hard_age=65534, priority=2,in_port=5 actions=drop 
 cookie=0xaaf94399aad7707e,duration=9233111.393s, table=0, n_packets=10761364888, n_bytes=3180091314185,idle_age=0, hard_age=65534, priority=0 actions= 

3.2.4 iptables安全组

每一个虚拟机的tap都对应2个chain表(out和in),dhcp agent到虚拟机的访问策略定义在out表;

Compute153 
:~  
#  iptables -Lneutron-openvswi-sg-chain 
Chain 
 neutron-openvswi-sg-chain ( 
20 
 references) 
target     prot opt source               destination         
neutron-openvswi-i7fc1e7d0-0 all  --  anywhere             anywhere             PHYSDEV match --physdev-outtap7fc1e7d0-0c --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-o7fc1e7d0-0 all  --  anywhere             anywhere             PHYSDEV match --physdev-intap7fc1e7d0-0c --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-i931641ad-4 all  --  anywhere             anywhere             PHYSDEV match --physdev-outtap931641ad-4b --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-o931641ad-4 all  --  anywhere             anywhere             PHYSDEV match --physdev-intap931641ad-4b --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-i963c4b38-7 all  --  anywhere             anywhere             PHYSDEV match --physdev-outtap963c4b38-70 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-o963c4b38-7 all  --  anywhere             anywhere             PHYSDEV match --physdev-intap963c4b38-70 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-i9df6f9f9-4 all  --  anywhere             anywhere             PHYSDEV match --physdev-outtap9df6f9f9-42 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-o9df6f9f9-4 all  --  anywhere             anywhere             PHYSDEV match --physdev-intap9df6f9f9-42 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ib9dd9478-0 all  --  anywhere             anywhere             PHYSDEV match --physdev-outtapb9dd9478-0f --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ob9dd9478-0 all  --  anywhere            anywhere             PHYSDEV match --physdev-intapb9dd9478-0f --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ic24f2999-b all  --  anywhere             anywhere             PHYSDEV match --physdev-outtapc24f2999-b9 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-oc24f2999-b all  --  anywhere             anywhere             PHYSDEV match --physdev-intapc24f2999-b9 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ic3833757-a all  --  anywhere             anywhere             PHYSDEV match --physdev-outtapc3833757-af --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-oc3833757-a all  --  anywhere             anywhere             PHYSDEV match --physdev-intapc3833757-af --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ic78917be-9  all --  anywhere             anywhere             PHYSDEV match --physdev-outtapc78917be-9c --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-oc78917be-9  all --  anywhere             anywhere             PHYSDEV match --physdev-intapc78917be-9c --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-id5cbf3b0-e all  --  anywhere             anywhere             PHYSDEV match --physdev-outtapd5cbf3b0-ef --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-od5cbf3b0-e all  --  anywhere             anywhere             PHYSDEV match --physdev-intapd5cbf3b0-ef --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ife79631b-8 all  --  anywhere             anywhere             PHYSDEV match --physdev-outtapfe79631b-85 --physdev-is-bridged /* Jump to the VM specific chain. */ 
neutron-openvswi-ofe79631b-8  all  -- anywhere             anywhere             PHYSDEV match --physdev-intapfe79631b-85 --physdev-is-bridged /* Jump to the VM specific chain. */ 
ACCEPT     all  -- anywhere             anywhere    
Compute153 
:~  
# iptables -L neutron-openvswi-oc78917be-9 
Chain 
 neutron-openvswi-oc78917be- 
9 
 ( 
2 
 references) 
target     prot opt source               destination         
RETURN     udp  -- default             255.255.255.255      udpspt:bootpc dpt:bootps /* Allow DHCP client traffic. */ 
neutron-openvswi-sc78917be-9 all  --  anywhere             anywhere            
RETURN     udp  -- anywhere             anywhere             udp spt:bootpc dpt:bootps /* AllowDHCP client traffic. */ 
DROP       udp  -- anywhere             anywhere             udp spt:bootps udp dpt:bootpc /*Prevent DHCP Spoofing by VM. */ 
RETURN     all  -- anywhere             anywhere             state RELATED,ESTABLISHED /*Direct packets associated with a known session to the RETURN chain. */ 
RETURN     all  --  anywhere             anywhere            
DROP       all  -- anywhere             anywhere             state INVALID /* Drop packets thatappear related to an existing connection (e.g. TCP ACK/FIN) but do not have anentry in conntrack. */ 
neutron-openvswi-sg-fallback all  --  anywhere             anywhere              
/*  
Send 
 unmatched traffic to thefallback chain. */ 
Compute153 
:~  
#  iptables -Lneutron-openvswi-ic78917be-9 
Chain 
 neutron-openvswi-ic78917be- 
9 
 ( 
1 
 references) 
target     prot opt source               destination         
RETURN     all  -- anywhere             anywhere             state RELATED,ESTABLISHED /*Direct packets associated with a known session to the RETURN chain. */ 
RETURN     udp --  xxx.xxx.xxx.xxx      anywhere             udp spt:bootps udp dpt:bootpc  ---DHCP 
RETURN     udp --  xxx.xxx.xxx.xxx       anywhere             udp spt:bootps udp dpt:bootpc  ---DHCP 
RETURN     all  -- anywhere             anywhere            
DROP       all  -- anywhere             anywhere             state INVALID /* Drop packets thatappear related to an existing connection (e.g. TCP ACK/FIN) but do not have anentry in conntrack. */ 
neutron-openvswi-sg-fallback all  --  anywhere             anywhere             /* Send unmatched traffic to thefallback chain. */ 

3.3 计算节点的vlan隔离

在vlan模式下,每个 vlan network 都有自己的 bridge,从而也就实现了基于 vlan 的隔离,vlan tag的转换需要在br-int和brcps两个网桥上进行相互配合。br-int负责从int-brcps过来的包(带外部vlan)转换为内部vlan,而brcps负责从phy-brcps过来的包(带内部vlan)转化为外部的vlan。租户的流量隔离也是通过vlan来进行的,因此包括两种vlan,虚拟机在Compute Node内流量带有的local vlan和在Compute Node之外物理网络上隔离不同租户的vlan。物理交换机与eth网卡相连的 port 设置成 trunk 模式,实现同一块物理网卡上面通过多个不同vlan 的数据。


以上所述就是小编给大家介绍的《openstack vlan模式下的隔离和数据流向》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithms

Data Structures and Algorithms

Alfred V. Aho、Jeffrey D. Ullman、John E. Hopcroft / Addison Wesley / 1983-1-11 / USD 74.20

The authors' treatment of data structures in Data Structures and Algorithms is unified by an informal notion of "abstract data types," allowing readers to compare different implementations of the same......一起来看看 《Data Structures and Algorithms》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具