目录

  1. L2基础知识
    1. VLAN基础知识
      1. VLAN定义
      2. VLAN的类型
        1. Untagged VLAN
        2. Tagged VLAN
      3. 交换机端口类型
      4. VLAN的不足
    2. 二层交换的基础知识
      1. 二层交换机最基本的功能
      2. ARP(Address Resolution Protocol)原理
  2. 使用Open vSwitch(ovs)+ VLAN组网
    1. 物理VLAN网络配置
    2. Neutron配置
      1. 配置进行
      2. 配置生效过程
    3. Neutron虚拟路由

L2基础知识

VLAN基础知识

VLAN定义

LAN表示Local Area Network,本地局域网,通常使用Hub和Switch来连接LAN中的计算机。一般来说,将两台计算机连入同一个Hub或者Switch时,它们就在同一个LAN中。同样地,你连接两个Switch的话,它们也是在同一个LAN中。一个LAN表示一个广播域,它表示,LAN中的所有成员都会收到LAN中一个成员发出的广播包。可见,LAN的边界在路由器或者类似的3层设备。

VLAN表示Virtual LAN。一个带有VLAN功能的Switch能够同时处于多个LAN中。最简单来说,VLAN是一种将交换机分成多个交换机的方法。

例如,有两组机器,Group A和B。想配置组A的机器可以互相访问,B中的机器也可以互相访问,但是A组中的机器不能访问B组中的机器。可以使用两个交换机,两个组分别接到一个交换机。如果只有一个交换机,可以使用VLAN达到同样的效果。在交换机上分别配置连接组A和B的机器的端口为VLAN access ports。这样,这个交换机就只会在同一个VLAN的端口之间转发包。

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

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

  • Access Port:一个Access Port只支持一个VLAN。一个Access Port往往被分配一个VLAN ID。根据交换机的不同实现,有些交换机只能支持转发到Access Port的数据帧没有VLAN Tag,而有些支持数据帧中有VLAN ID Tag但是需要与端口的VLAN ID相同。离开交换机的Access Port然后进入计算机的以太帧没有VLAN Tag,这意味着连接到Access Port的机器不会察觉到VLAN的存在。

    • 如果进来的数据帧没有VLAN Tag,它通过Access Port后,会被插入VLAN ID Tag。
    • 如果进来的数据帧带有VLAN ID Tag并且与Access Port所分配的VLAN ID相同,那么它会被转发;如果不同,则会被丢弃。
  • Trunk Port:一个Trunk Port支持多个VLAN。它通常用于连接交换机。有多个交换机时,组A中的部分机器连接到Switch 1,另一部分机器连接到Switch 2。要使得这些机器能够互相访问,需要连接两台交换机。要避免使用一根电缆连接每个VLAN的两个端口,我们可以在每个交换机上配置一个VLAN Trunk Port。Trunk Port发出和收到的数据包都带有VLAN Header,该Header表明该数据包属于哪个VLAN。因此,只需要分别连接两个交换机的一个Trunk Port就可以转发所有的数据包了。通常来讲,只使用Trunk Port连接两个交换机,而不是用来连接机器和交换机,因为机器不想看到它们收到的数据包带有VLAN Header。有时候,如果一个机器需要发出带有不同VLAN ID的数据包,那么与它相连接的交换机的口也要被设置为Trunk Port。

VLAN的类型
Untagged VLAN

基于端口的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)
Tagged VLAN

Tagged VLAN,数据帧中带有VLAN Tag。
这种模式下,Frame的VLAN关系是它自己携带的信息中保存的,这种信息叫A Tag或者Tagged Header。当交换机收到一个带VLAN Tag的帧,它只将它转发给具有同样VID的端口。一个能够接收或者转发Tagged Frame的端口称为A Tagged Port。所有连接到这种端口的网络设备必须是802.1Q协议兼容的。这种设备必须能处理Tagged Frame,以及添加Tag到其转发的Frame。

在实际中VLAN配置的各种情况:

  • 交换机的所有端口,部分是Tagged Port,部分被添加到VLAN中。
  • 一个Untagged Port,不管它是一个基于的VLAN的成员还是一个Tagged VLAN中的成员,同一时刻只能在一个VLAN中。
  • 一个Tagged Port,可以是多个VLAN的成员。
  • 一个Port,可以同时是一个VLAN的Untagged成员,也可以是不同VLAN中的Tagged成员。
交换机端口类型

以太网端口有三种链路类型:Access、Hybrid和Trunk。

  • Access类型的端口只能属于一个VLAN,一般用于连接计算机的端口。这种类型的端口允许接收没有打标签的帧,再发出去时将会被打上标签。
  • Trunk类型的端口可以属于多个VLAN,可以接收和发送多个VLAN的报文,一般用于交换机之间连接的端口。在配置Trunk口时,可以指定允许接收的VLAN的ID区间,还可以配置一个Native VLAN(本征VLAN,缺省VLAN)。当设置了PVID(Natvie VLAN ID)时,没有打标签的进来的帧被打上PVID的Tag再被发出去。

    对于支持PVLAN的交换机,每个端口都有一个PVID(PVID是不分Trunk口或Access口),缺省跟该端口的VLAN ID一样。对设置成Trunk口的端口,PVID等于Native VLAN ID。

  • Hybrid类型的端口可以属于多个VLAN,可以接收和发送多个VLAN的报文,可以用于交换机之间的连接,也可以用于连接用户的计算机。Hybrid端口和Trunk端口的不同之处在于Hybrid端口可以允许多个VLAN的报文发送时不打标签,而Trunk端口只允许缺省VLAN的报文发送时不打标签。

各种类型

  • Access(接收)Tagged = PVID,不接收。部分高端产品可能接收。

  • Access(接收)Tagged != PVID,不接收。部分高端产品可能接收。

  • Access(接收)Untagged,接收,增加Tag=PVID。

  • Access(发送)Tagged = PVID,转发,删除Tag。

  • Access(发送)Tagged != PVID,不转发,不处理。

  • Access(发送)Untagged,无此情况。

  • Trunk(接收)Tagged = PVID,接收,不修改Tag。

  • Trunk(接收)Tagged != PVID,接收,不修改Tag。

  • Trunk(接收)Untagged,接收,增加Tag = PVID。

  • Trunk(发送)Tagged = PVID,如果通过则转发,删除Tag。

  • Trunk(发送)Tagged != PVID,如果通过则转发,不修改Tag。

  • Trunk(发送)Untagged,无此情况。

  • Hybrid(接收)Tagged = PVID,接收,不修改Tag,对端是Trunk。

  • Hybrid(接收)Tagged != PVID,接收,不修改Tag,对端是Trunk。

  • Hybrid(接收)Untagged,接收,增加Tag = PVID,类Trunk。

  • Hybrid(发送)Tagged = PVID,Tag和Untag中列出来的VLAN可以通过。

  • Hybrid(发送)Tagged != PVID,Tag和Untag中列出来的VLAN可以通过。

  • Hybrid(发送)Untagged,无此情况。

解释:

  • 主机只能处理标出以太帧(没打标签的),交换机内部的帧都是打了标签的。
  • 收报文:Access端口,收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则直接丢弃(缺省)。
  • 发报文:Access端口,将报文的VLAN信息剥离,直接发送出去。
  • 收报文:Trunk端口,收到一个报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有判断该Trunk端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃。
  • 发报文:Trunk端口,比较端口的PVID和将要发送报文的VLAN信息,如果两者相等则剥离VLAN信息,再发送,如果不相等则直接发送。
  • 收报文:Hybrid端口,收到报文,判断是否有VLAN信息:如果没有则打上端口的PVID,并进行交换转发,如果有则判断该Hybrid端口是否允许该VLAN的数据进入:如果可以则转发,否则丢弃。
  • 发报文:Hybrid端口,判断该VLAN在本端口的属性(disp interface即可看到该端口对哪些VLAN是Untagged,哪些VLAN是Tagged),如果是Untagged则剥离VLAN信息,再发送,如果是Tagged则直接发送。
tagged(进) untagged(出) 出(交换机在做交换时,只会把帧发给包含其VID的端口)
Access端口 丢弃 打上PVID 剥离VID,此时的帧为标准以太网帧
Trunk端口 如果是允许的,则不变;否则丢弃 打上PVID 如果VID与PVID不同,则透传;如果VID与PVID相同,则剥离VID
VLAN的不足
  1. VLAN使用12-bit的VLAN ID,所以VLAN的第一个不足之处就是它最多支持4096个VLAN网络(去除预留的有4094个),对于大型数据中心来书,这个数量远远不够。
  2. VLAN是基于L2的,所以很难跨越L2D的边界,在很大程度上限制了网络的灵活性。
  3. VLAN操作需手工介入较多,这对于管理成千上万台机器的管理员来说是难以接受的。

二层交换的基础知识

二层交换机最基本的功能

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

  • MAC地址学习:当交换机从它的某个接口收到数据帧时,它将端口的ID和帧的源MAC地址保存到它内部的MAC表中。这样,当将来它收到一个要转发到该MAC地址的帧时,它就知道直接从该端口转发出去了。
  • 数据帧转发:交换机在将从某个端口收到数据帧,再将其从某个端口转发出去之前,它会做一些逻辑判断:
    • 如果帧的目的MAC地址是广播或者多播地址的话,将其从交换机的所有端口(除了传入端口)上转发。
    • 如果帧的目的MAC地址在它内部MAC表中能找到对应的输出输出端口的话(MAC地址学习过程中保存的),将其从该端口上转发出去。
    • 对其他情况,将其从交换机的所有端口(除了传入端口)上转发。
  • 加VLAN标签/去VLAN标签:
    • 帧接收:从Trunk Port上接收到的数据帧必须是加了Tag的。从Access Port上收到的数据帧必须是没有加Tag的,否则该帧将会被抛弃。
    • 帧处理:根据上述转发流程决定其出发的端口。
    • 帧发出:从Trunk Port发出的帧是加了Tag的。从Access Port上发送的数据帧必须是没有加Tag的。
ARP(Address Resolution Protocol)原理

二层网络使用MAC(Media Access Control Address)作为硬件的唯一标识。基于TCP/IP协议的软件使用ARP来将IP地址转化为MAC地址。

A的地址是10.0.0.2,B的地址时192.168.0.2。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的数据包:
    1
    2
    3
    4
    SRC MAC: A的MAC地址
    DST MAC: Router的Interface 1的MAC地址
    SRA IP: A的IP
    DST IP: B的IP
  3. 路由器的Interface 1收到该数据包后,根据其路由表,首先经过同样的ARP过程,路由器根据B的IP地址获得其MAC地址,然后将包发给它。
    1
    2
    3
    4
    SRC MAC: Router Interface 2的MAC地址
    DST MAC: B的MAC地址
    SRA IP: A的IP
    DST IP: B的IP

使用Open vSwitch(ovs)+ VLAN组网

Neutron基于VLAN模式的Tenant Network同Provider Network一样,都必须使用物理的VLAN网络。

物理VLAN网络配置

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

  1. 管理网络,用于OpenStack节点之间的通信,假设VLAN ID范围为50 - 99。
  2. 数据网络,用于虚拟机之间的通讯。由于VLAN模式下,租户建立的网络都具有独立的VLAN ID,故需要将连接虚机的服务器的交换机端口设为Trunk模式,并且设置允许的VLAN ID范围,比如100 - 300。
  3. 外部网络,用于连接外部网络。加上VLAN ID范围为1000 - 1010。

关于网段之间的路由:

  • 如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用Neutron的虚拟路由器。
  • 如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。

Neutron配置

配置进行

控制节点

1
2
3
4
5
6
7
8
9
10
11
12
# 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

网络节点上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 为连接物理交换机的网卡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
[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,external:1000:1010

# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
bridge_mappings = physnet1:br-eth2,external:br-ex

计算节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 为连接物理交换机的网卡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
[ml2]
type_drivers = vlan
tenant_network_types = vlan
mechanism_drivers = openvswitch
[ml2_type_vlan]
network_vlan_ranges = physnet1:100:300

# vim /etc/neutron/plugins/ml2/openvswitch_agent.ini
[ovs]
bridge_mappings = physnet1:br-eth2

注意:
network_vlan_ranges中的VLAN ID必须和物理交换机上的VLAN ID区间一致。
brige_mappings中所指定的bridge需要和在各个节点上手动创建的OVS Bridge一致。

重启相应的Neutron服务。

配置生效过程

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

  1. 创建Intergration Bridge(默认是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秒。

Neutron虚拟路由

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

它反映的网络配置如下:

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

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

  1. 创建了OVS Integration Bridge br-int。它的四个access ports中,两个打上了内部Tag 1,连接接入Network 1的两块网卡;另外两个端口的VLAN Tag为2。
  2. 创建了一对patch port,连接br-int和br-eth1。
  3. 设置br-int中的flow rules。对虚机过来的从access ports进入br-int的数据帧,会被加上对应的VLAN Tag,转发到patch port;从patch port进入的数据帧,将VLAN ID 101修改为1,102修改为2,再转发到相应的access ports。
  4. 设置br-eth1中的flow rules。从patch port进入的数据帧,将内部VLAN ID 1修改为101,内部VLAN ID 2修改为102,再从eth1端口发出。对从eth1进入的数据帧做相反的处理。
  • 使用该设计时,br-int只能接收虚机发出的网络包没有加VLAN Tag,也就是Untagged。
  • 在某些场景中,虚机发出的包需要带有VLAN Tag。
  1. 不同物理服务器上的虚拟机,如果vm1和vm2属于同一个tenant network同一个子网,那么两者的通信直接经过物理交换机进行,不需要到网络节点。
  2. 相同物理服务器上的虚拟机,如果vm1和vm2属于同一个tenant network的同一个子网,那么两者的通信可以直接经过br-int进行。
  3. 对于其他虚拟机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点的Router进行IP包的路由。