VLAN模式

一 二层基础知识

1.1 vlan介绍

本小节重点:数据库

  • vlan的含义
  • vlan的类型
  • 交换机端口类型
  • vlan的不足

1.1.1:vlan的含义

  局域网LAN的发展是VLAN产生的基础,于是先介绍一下局域网LANvim

  由Hub、网桥或交换机等网络设备链接同一网段内的全部节点造成局域网(LAN),一般是一个单独的广播域。缓存

  处于同一个局域网LAN以内的网络节点之间能够直接通讯服务器

  处于不一样局域网段的设备之间的通讯则必须通过路由器才能通讯。网络


  上述传统拓扑结构的关键在于用三层设备,即路由器,来隔离不一样的LAN,在网络规模增大的状况下存在两个缺陷: 
  1. 路由器数量须要增多,网络时延随之加长,进而致使网络数据传输速度的降低。这主要是由于数据在从一个局域网传递到另外一个局域网时,必须通过路由器的路由操做: 路由器根据数据包中的相应信息肯定数据包的目标地址,而后再选择合适的路径转发出去。 
  
  2. 用户是按照它们的物理链接被天然地划分到不一样的用户组(广播域)中。这种分割方式并非根据工做组中全部用户的共同须要和带宽的需求来进行的。所以,尽管不一样的工做组或部门对带宽的需求有很大的差别,但它们却被机械地划分到同一个广播域中争用相同的带宽。 
  app

  综上两点,必须选出一种隔离广播域的方式,兼备下述两点ide

  1.能够不用经过路由器来隔离不一样广播域  学习

  2.能够突破地理位置的限制,在逻辑上划分出不一样的广播域spa

  这就是VLAN,IEEE 802.1Q 标准定义了 VLAN Header 的格式。它在普通以太网帧结构的 SA (src addr)以后加入了 4bytes 的 VLAN Tag/Header 数据,其中包括 12-bits 的 VLAN ID。VLAN ID 最大值为4096,可是有效值范围是 1 - 4094。3d

带 VLAN 的交换机的端口分为两类:

  • Access port:这些端口被打上了 VLAN Tag。离开交换机的 Access port 进入计算机的以太帧中没有 VLAN Tag,这意味着链接到 access ports 的机器不会觉察到 VLAN 的存在。离开计算机进入这些端口的数据帧被打上了 VLAN Tag。
  • Trunk port: 有多个交换机时,组A中的部分机器链接到 switch 1,另外一部分机器链接到 switch 2。要使得这些机器可以相互访问,你须要链接两台交换机。 要避免使用一根电缆链接每一个 VLAN 的两个端口,咱们能够在每一个交换机上配置一个 VLAN trunk port。Trunk port 发出和收到的数据包都带有 VLAN header,该 header 代表了该数据包属于那个 VLAN。所以,只须要分别链接两个交换机的一个 trunk port 就能够转发全部的数据包了。一般来说,只使用 trunk port 链接两个交换机,而不是用来链接机器和交换机,由于机器不想看到它们收到的数据包带有 VLAN Header。

 

 

  单台交换机上划分VLAN


  

  

  多台交换机上划分VLAN


  

1.1.2:vlan的类型

(1)基于端口的 VLAN (untagged VLAN - 端口属于一个VLAN,数据帧中没有VLAN tag)

    这种模式中,在交换机上建立若干个VLAN,在将若干端口放在每一个VLAN 中。每一个端口在某一时刻只能属于一个VLAN。一个 VLAN 能够包含全部端口,或者部分端口。每一个端口有个PVID (port VLAN identifier)。这种模式下,一个端口上收到的 frame 是 untagged frame,所以它不包含任何有关 VLAN 的信息。VLAN 的关系只能从端口的 PVID 上看出来。交换机在转发 frame 时,只将它转发到相同 PVID 的端口。

 

如上图所示,链接两个交换机的同一个 VLAN 中的两个计算机须要通讯的话,须要在两个交换机之间连两根线:

  • 一根从 Switch A 端口4 到 Switch B 端口 4 (VLAN 1)
  • 一根从 Switch A 端口8 到 Switch B 端口 8 (VLAN 2)

(2)Tagged VLANs (数据帧中带有 VLAN tag)

这种模式下,frame 的VLAN 关系是它本身携带的信息中保存的,这种信息叫 a tag or tagged header。当交换机收到一个带 VLAN tag 的帧,它只将它转发给具备一样 VID 的端口。一个可以接收或者转发 tagged frame 的端口被称为 a tagged port。全部链接到这种端口的网络设备必须是 802.1Q 协议兼容的。这种设备必须能处理 tagged frame,以及添加 tag 到其转发的 frame。

上图中,两个交换机上的端口8 支持 VLAN 1 和 2, 所以一根线就能够了实现跨交换机的同VLAN 内的计算机互相通讯了。 

1.1.3:vlan的不足

  1. VLAN 使用 12-bit 的 VLAN ID,因此 VLAN 的第一个不足之处就是它最多只支持 4096 个 VLAN 网络(固然这还要除去几个预留的),对于大型数据中心的来讲,这个数量是远远不够的。
  2. VLAN 是基于 L2 的,因此很难跨越 L2 的边界,在很大程度上限制了网络的灵活性。
  3. VLAN 操做需手工介入较多,这对于管理成千上万台机器的管理员来讲是难以接受的。

1.2 : 二层交换的基础知识

1.2.1:二层交换机最基本的功能

二层交换机最基本的功能包括:

  • MAC 地址学习:当交换机从它的某个端口收到数据帧时,它将端口的 ID 和帧的源 MAC 地址保存到它的内部MAC表中。这样,当未来它收到一个要转发到该 MAC 地址的帧时,它就知道直接从该端口转发出去了。
  • 数据帧转发:交换机在将从某个端口收到数据帧,再将其从某个端口转发出去以前,它会作一些逻辑判断:
    • 若是帧的目的 MAC 地址是广播或者多播地址的话,将其从交换机的全部端口(除了传入端口)上转发。
    • 若是帧的目的MAC地址在它的内部MAC表中能找到对应的输出端口的话(MAC 地址学习过程当中保存的),将其从该端口上转发出去。
    • 对其它状况,将其从交换机的全部端口(除了传入端口)上转发。
  • 加 VLAN 标签/去 VLAN 标签:
    • 帧接收:从 trunk port 上收到的数据帧必须是加了标签的。从 access port 上收到的数据帧必须是没有加标签的,不然该帧将会被抛弃。
    • 帧处理:根据上述转发流程决定其发出的端口。
    • 帧发出:从 trunk port 发出的帧是加了标签的。从 access port 上发出的帧必须是没加标签的。

 默认状况下,交换机的全部端口都处于VLAN 1 中,也就至关于没有配置 VLAN。该机制说明以下:

  1. PC A 发一个帧到交换机的 1 端口,其目的MAC地址为 PC B 的 MAC。
  2. 交换机比较其目的 MAC 地址和它的内部 MAC Table,发现它不存在(此时表为空)。在决定泛洪以前,它把端口 1 和 PC A 的 MAC 地址存进它的 MAC Table。
  3. 交换机将帧拷贝多份,分别从2和3端口发出。
  4. PC B 收到该帧之后,发现其目的 MAC 地址和他本身的 MAC 地址相同。它发出一个回复帧进入端口3。
  5. 交换机将 PC B 的 MAC地址和端口3 存在它的 MAC 表中。
  6. 由于该帧的目的地址为PC A 的 MAC 地址它已经在 MAC 表中,交换机直接将它转发到端口1,达到PC A。

配置了 VLAN 的交换机的该机制相似,只不过:

(1)MAC 表格中每一行有不一样的 VLAN ID。作比较的时候,拿传入帧的目的 MAC 地址和 VLAN ID 和此表中的行数据相比较。若是都相同,则选择其 Ports 做为转发出口端口。

 

(2)若是没有吻合的表项,则将此帧从全部有一样 VLAN ID 的 Access ports 和 Trunk ports 转发出去。

1.2.2:ARP协议

二层网络使用 MAC (media access control address)地址做为硬件的惟一标识。基于 TCP/IP 协议的软件使用 ARP 来将 IP 地址转化为 MAC 地址。

1. 目的 IP 地址在同一网段的话

 

    该示例中,Host A 和 B 在同一个网段中。A 的 IP 地址是 10.0.0.99,B 的 IP 地址是 10.0.0.100。当 A 要和 B 通讯时,A 须要知道 B 的 MAC 地址。该过程通过如下步骤:
(1)A 上的 IP 协议栈知道经过B 的 IP 地址能够直接到达 B。A 检查它的本地 ARP 缓存来看B 的 MAC 地址是否已经存在。
(2)若是A 没有发现B 的 MAC 地址,它发出一个 ARP 广播请求,来询问“10.0.0.100 的 MAC 地址是什么?”,该数据包:
SRC MAC: A 的 MAC
DST MAC:FF:FF:FF:FF:FF:FF
SRA IP: A 的 IP
DST IP: B 的 IP
(3)该网段中全部的电脑都将收到该包,而且会检查 DST IP 和本身的IP 是否相同。若是不一样,则丢弃该包。Host B 发现其IP 地址和 DST IP 相同,它将 A 的 IP/MAP 地址加入到本身的ARP 缓存中。
(4)B 发出一个 ARP 回复消息
SRC MAC: B 的 MAC
DST MAC:A 的 MAC
SRA IP: B 的 IP
DST IP: A 的 IP
(5)交换机直接将该包交给 host A。A 收到后,将 B 的 MAC/IP 地址缓存到 ARP 缓存中。
(6)A 使用 B 的 MAC 做为目的 MAC 地址发出 IP 包。
 
2. 目的IP 地址不在同一个网段的话
 
本例子中,A 的地址是 10.0.0.99, B 的地址是 192.168.0.99。Router 的 interface 1 和 A 在同一个网段,其IP 地址为10.0.0.1;interface 2 和 B 在同一个网段,其IP地址为 192.168.0.1。 
A 使用下面的步骤来获取 Router 的 interface 1 的 MAC 地址。
(1)根据其路由表,A 上的 IP 协议知道须要经过它上面配置的 gateway 10.0.0.1 才能到达到 B。通过上面例子中的步骤,A 会获得 10.0.0.1 的 MAC 地址。
(2)当 A 收到 Router interface 1 的 MAC 地址后,A 发出了给B 的数据包:
SRC MAC: A 的 MAC
DST MAC:Router 的 interface 1 的 MAC 地址
SRA IP: A 的 IP
DST IP: B 的 IP
(3)路由器的 interface1 收到该数据包后,根据其路由表,首先通过一样的ARP 过程,路由器根据 B 的 IP 地址经过 ARP 得到其 MAC 地址,而后将包发给它。
SRC MAC: Router interface 2 的 MAC
DST MAC:B 的 MAC
SRA IP: A 的 IP
DST IP: B 的 IP

二 使用OpenvSwitch(OVS)+VLAN组网

Neutron 基于 VLAN 模式的 tenant network 同 provider network 同样,都必须使用物理的 VLAN 网络。

2.1 物理VLAN网络配置

本例子中,交换机上划分了三个 VLAN 区域:

  1. 管理网络,用于 OpenStack 节点之间的通讯,假设 VLAN ID 范围为 50 - 99.
  2. 数据网络,用于虚拟机之间的通信。因为Vlan模式下,租户创建的网络都具备独立的 Vlan ID,故须要将链接虚机的服务器的交换机端口设置为 Trunk 模式,而且设置所容许的 VLAN ID 范围,好比 100~300。
  3. 外部网络,用于链接外部网络。加上 VLAN ID 范围为 1000-1010。

关于网段之间的路由:

  • 若是该物理交换机接到一个物理路由器并作相应的配置,则数据网络可使用这个物理路由器,而不须要使用 Neutron 的虚拟路由器。
  • 若是不使用物理的路由器,能够在网络节点上配置虚拟路由器。

2.2 Neutron配置

2.2.1 配置进行

控制节点上:
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2] 
type_drivers = flat,vlan 
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_flat]
flat_networks = external
[ml2_type_vlan] 
network_vlan_ranges = physnet1:100:300

网络节点上:

#为链接物理交换机的网卡 eth2 和 eth3 创建 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
ovs-vsctl add-br br-eth2
ovs-vsctl add-br br-ex ovs-vsctl add-port br-eth2 eth2
ovs-vsctl add-port br-ex eth3 # vim /etc/neutron/plugins/ml2/ml2_conf.ini
[m12] type_drivers = flat,vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch

[ml2_type_flat]
flat_networks = external
[ml2_type_vlan] 
network_vlan_ranges = physnet1:100:300,external:1000:1010

[ovs]
bridge_mappings = physnet1:br-eth2,external:br-ex

计算节点上:

#为链接物理交换机的网卡 eth2 创建 OVS physical bridge
ovs-vsctl add-br br-eth2
ovs-vsctl add-port br-eth2 eth2

# vim /etc/neutron/plugins/ml2/ml2_conf.ini 
[m12] type_drivers = vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_vlan] 
network_vlan_ranges = physnet1:100:300

[ovs]
bridge_mappings = physnet1:br-eth2 

注意:

  • network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。
  • bridge_mappings 中所指定的 bridge 须要和在个节点上手工建立的 OVS bridge 一致。

而后重启相应的 Neutron 服务。

2.2.2 配置生效过程

当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各类配置在节点上建立各类 bridge。以 OVS Agent 为例,

(1)建立 intergration brige(默认是 br-int);若是 enable_tunneling = true 的话,建立 tunnel bridge (默认是 br-tun)。

(2)根据 bridge_mappings,配置每个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先建立的 OVS bridge。

(3)全部虚机的 VIF 都是链接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。

(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每一个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 链接起来。

(5)对于每个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来链接 br-int 和物理网桥,以及增长 flow rules等。

(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员能够经过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。

2.3:建立虚拟网络和子网

2.3.1 建立命令

s1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)
Created a new network:
+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | True                                 |
| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
| name                      | net1                                  |
| provider:network_type     | vlan                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | 101                                  |
| router:external           | False                                |
| shared                    | False                                |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |
+---------------------------+--------------------------------------+   
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1

2.3.2 Neutron代码实现

作完以上的步骤以后,用户就能够在 subnet 上 boot 虚机了。

boot 虚机的过程当中,Nova 依次会:

(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。

(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。

(3)启动虚机。

Neutron L2 Agent 的循环任务每隔两秒会依次:

(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成全部变动端口的列表(包括添加的、更新的、删除的端口)。好比:

{'current': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135']), 'removed': set([]), 'added': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135'])}

(2)为每个待处理端口,根据其 ID 从 DB 中取得其详细信息。好比:

{u'profile': {}, u'admin_state_up': True, u'network_id': u'e2022937-ec2a-467a-8cf1-f642a3f777b6', u'segmentation_id': 4, u'device_owner': u'compute:nova', u'physical_network': phynet1, u'mac_address': u'fa:16:3e:fd:ed:22', u'device': u'592740b0-0768-4e57-870d-6495e6c22135', u'port_id': u'592740b0-0768-4e57-870d-6495e6c22135', u'fixed_ips': [{u'subnet_id': u'13888749-12b3-462e-9afe-c527bd0a297e', u'ip_address': u'91.1.180.4'}], u'network_type': u'vlan'}

(3)针对每个增长或者变动的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。

(4)针对每个被删除的 port,设置 db 中其状态为 down。

2.4:Neturon虚拟网络

(1)一个计算节点上的网络实例

它反映的网络配置以下:

  1. Neutron 使用 Open vSiwtch。
  2. 一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
  3. 建立了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
  4. 该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.

 

 

 

 

Neutron在该计算节点上作的事情:

  建立了OVS Integration bridge br-int。它的四个Access口中,两个打上了内部vlan Tag1,链接接入network1的两个网卡;另外两个端口打上的是vlan tag 2

  建立一对patch port链接br-int和br-eth1

  设置br-int中的flow rules。对从access ports进入的数据帧,加上相应的vlan tag,转发到patch port;从patch port进入的数据帧,将vlan id 101修改成1,102修改成2,再转发到相应的access ports

  设置br-eth1中的flow rules。从patch port进入的数据帧,将内部vlan id 1修改成101,内部vlan id 2修改成102,再从eth1端口发出。对从eht1进入的数据帧作相反的处理

 (2)再加上另外一个链接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):

 

Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。

(3)链接到同一物理交换机的网络节点的状况

 

 

(4)网络流向

  • 不一样物理服务器上的虚机,若是 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么二者的通讯直接通过 物理交换机 进行,不须要作到网络节点。如图10 所示。
  • 相同物理服务器上的虚机,若是 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么二者的通讯直接通过 br-int 进行。

对其余虚机之间数据交换情形,都算做跨子网的数据流向,都须要通过网络节点中的 Router 进行 IP 包的路由。(也能够直接使用链接物理交换机的物理路由器)。

相关文章
相关标签/搜索