openstack之Neutron网络模式vlan,gre,vxlan详解

2023年 7月 10日 25.5k 0

一:基础知识

vlan基础知识

介绍

:首先说下lan,LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接LAN 中的计算机。(一个 LAN 表示一个广播域)

vlan:(Virutal LAN) 将同一个LAN上的用户在逻辑上分成多个虚拟局域网,换句话说,一个带有 VLAN 功能的switch 能够同时处于多个 LAN 中,每个vlan中的主机连接交换机的端口是access口,从而保证了交换机只在同一个vlan中转发包

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

vlan数据帧格式介绍:

openstack之Neutron网络模式vlan,gre,vxlan详解

      TPID(Tag Protocol Identifier,标签协议标识)值规定为0x8100。设备缺省采用协议规定的TPID值,交换机通过TPID来确定数据帧是否附加基于的VLAN信息。

          TCI(Tag Control Information,标签控制信息)字段分为Pri、CFI和VLAN三部分。Pri表示报文优先级(也称1p优先级、COS或1q优先级),CFI(Canonical Format Indicator)标识MAC地址在不同传输介质中是否以标准格式进行封装,通常为0(标准格式)。Vlan ID标识该报文所属的VLAN编号,取值范围为 0~4095,一般0和4095保留(中兴设备Vid=0表示priority-tagged帧)。

带vlan的交换机端口划分:

Access port:这些端口被打上了 VLAN Tag。离开交换机的 Access port 进入计算机的以太帧中没有 VLAN Tag,这意味着连接到 access ports 的机器不会觉察到 VLAN 的存在。离开计算机进入这些端口的数据帧被打上了 VLAN Tag。

Trunk port: 两台或者多台交换机通过一个根线连接,线的两头都是trunk口,可以转发多个vlan信息。

类型

基于port的vlan(数据帧中不包含vlan tag,vlan信息从交换机的端口pvid上得知,交换机转发包也基于此)

基于tagged vlan(数据帧中包含vlan tag,vlan信息从数据帧内包含的vlan信息,交换机需要有对该数据帧拆包/封包的能力,即连接到这种端口的网络设备必须是)

的不足

VLAN 使用 12-bit 的 VLAN ID,所以 VLAN 的第一个不足之处就是它最多只支持 4096 个 VLAN 网络(当然这还要除去几个预留的),对于大型数据中心的来说,这个数量是远远不够的。

VLAN 是基于 L2 的,所以很难跨越 L2 的边界,在很大程度上限制了网络的灵活性。

VLAN 操作需手工介入较多,这对于管理成千上万台机器的管理员来说是难以接受的。

以上上中在小公司,用在小规模的云平台服务完全是可以的,但是每一个小公司都有一颗做大的心嘛,所以还是不提倡的

交换机基础知识

1.交换机工作原理:

交换机在接收到数据帧以后,首先、会记录数据帧中的源MAC地址和对应的接口到MAC表中,接着、会检查自己的MAC表中是否有数据帧中目标MAC地址的信息,如果有则会根据MAC表中记录的对应接口将数据帧发送出去(也就是单播),如果没有,则会将该数据帧从非接收接口发送出去(也就是广播)。

地址:

mac地址表:在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表,交换机就是根据这张表负责将数据帧传输到指定的主机上的。

mac地址学习:

openstack之Neutron网络模式vlan,gre,vxlan详解

1)主机A将一个源MAC地址为自己,目标MAC地址主机C的数据帧发送给交换机

2)交换机1收到此数据帧后,会学习源MAC地址,并检查MAC地址表,发现没有目标MAC地址的记录,则会将数据帧广播出去,主机B和交换机2都会收到此数据帧。

3)交换机2收到此数据帧后也会将数据帧中的源MAC地址和对应的接口记录到MAC地址表中,并检查自己的MAC地址表,发现没有目标MAC地址的记录,则会广播此数据帧。

4)主机C收到数据帧后,会响应这个数据帧,并回复一个源MAC地址为自己的数据帧,这时交换机1和交换机2都会将主机C的MAC地址记录到自己的MAC地址表中,并且以单播的形式将此数据帧发送给主机A。

5)这时,主机A和主机C通信就是一单播的形式传输数据帧了,主机B和主机C通信如上述过程一样,因此交换机2的MAC地址表中记录着主机A和主机B的MAC地址都对应接口f 0/1。

总结:交换机具有动态学习源MAC地址的功能,并且交换机的一个接口可以对应多个MAC地址,但是一个MAC地址只能对应一个接口

原理:

openstack之Neutron网络模式vlan,gre,vxlan详解

主机A与主机B在同一网段

1)如果主机A想发送数据给主机B,主机A首先会检查自己的ARP缓存表,查看是否有主机B的IP地址和MAC地址的对应关系,如果有,则会将主机B的MAC地址作为源MAC地址封装到数据帧中。如果没有,主机A则会发送一个ARP请求信息,请求的目标IP地址是主机B的IP地址,目标MAC地址是MAC地址的广播帧(即FF-FF-FF-FF-FF-FF),源IP地址和MAC地址是主机A的IP地址和MAC地址。

2)当交换机接受到此数据帧之后,发现此数据帧是广播帧,因此,会将此数据帧从非接收的所有接口发送出去。

3)当主机B接受到此数据帧后,会校对IP地址是否是自己的,并将主机A的IP地址和MAC地址的对应关系记录到自己的ARP缓存表中,同时会发送一个ARP应答,其中包括自己的MAC地址。

4)主机A在收到这个回应的数据帧之后,在自己的ARP缓存表中记录主机B的IP地址和MAC地址的对应关系。而此时交换机已经学习到了主机A和主机B的MAC地址了。

主机A与主机B不在同一网段

openstack之Neutron网络模式vlan,gre,vxlan详解

不在同一网段的话,就需要借助路由器了

1)HostA在网络层将来自上层的报文封装成IP数据包,其中源IP地址为自己,目标IP地址是HostB,HostA会用本机配置的24位子网掩码与目标地址进行“与”运算,得出目标地址与本机不是同一网段,因此发送HostB的数据包需要经过网关路由A的转发。

2)HostA通过ARP请求获取网关路由A的E0口的MAC地址,并在链路层将路由器E0接口的MAC地址封装成目标MAC地址,源MAC地址是自己。

3)路由器A从E0可接收到数据帧,把数据链路层的封装去掉,并检查路由表中是否有目标IP地址网段(即的网段)相匹配的的项,根据路由表中记录到网段的数据请发送给下一跳地址10..2,因此数据在路由器A的E1口重新封装,此时,源MAC地址是路由器A的E1接口的MAC地址,封装的目标MAC地址则是路由器2的E1接口的MAC地址。

4)路由B从E1口接收到数据帧,同样会把数据链路层的封装去掉,对目标IP地址进行检测,并与路由表进行匹配,此时发现目标地址的网段正好是自己E0口的直连网段,路由器B通过ARP广播,获知HostB的MAC地址,此时数据包在路由器B的E0接口再次封装,源MAC地址是路由器B的E0接口的MAC地址,目标MAC地址是HostB的MAC地址。封装完成后直接从路由器的E0接口发送给HostB。

5)此时HostB才会收到来自HostA发送的数据。

总结:路由表负责记录一个网络到另一个网络的路径,因此路由器是根据路由表工作的。

二:openvswitch+vlan组网

1.物理网络vlan配置

管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.

数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。

外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。

openstack之Neutron网络模式vlan,gre,vxlan详解

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

配置生效的过程:

配置就不详细说了,后续将会整理成一个完成的部署博客,下面简述下Neutron配置生效的过程。

当 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秒。

代码的实现流程

boot虚拟机的过程。nova依次会

1调用neutron rest api申请一个或多个port,neutron会根据数据库中的配置进行分配

2计算机节点上,nova调用ovs-vsctl命令将虚拟机的VIF被plug到br-int上

3启动虚拟机

neutron l2 agent的循环任务每隔2秒会

1)调用ovs-vsctl list-ports命令获取br-int上的port,在根据上次保存的历史记录,生成所有变更端口的列表(包括添加的,删除的,更新的)

2)为每一个待处理端口,根据其ID从DB中取出详细信息

3)针对每一个增加或变更的port设置local vlan tag,调用命令ovs-ofctl mod-flows命令来设置br-tun或者物理的bridge的flow rules;并设置db中其状态为up

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

4.Neutron的vlan模式的虚拟网络

一个计算节点上的网络示例:

1) Neutron 使用 Open vSiwtch。

2) 一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。

3) 创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。

4) 该服务器上运行三个虚机,vm1 和 vm2 分别有一个网卡接入 network 1;vm2 和 vm3 分别有一个网卡接入 network 2.

openstack之Neutron网络模式vlan,gre,vxlan详解

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进入的数据帧做相反的处理

连接到同一个物理交换机上的两个计算节点的内部通信

openstack之Neutron网络模式vlan,gre,vxlan详解

两个物理节点,compute01上面有两个云主机,都是vlan1,compute02上面有两个云主机,vm3为vlan1,vm4位vlan2。

.1:同一个物理节点上,同一个vlan之间的通信

例如:vm1:》vm2:

相同物理服务器上的虚机, VM1 访问VM2,当数据包到达br-int的时候,先查询br-int的mac地址表,如果有记录,则直接找到VM2,如果没有记录的话,需要经过 br-int 进行广播,寻找,这个时候vm2收到mac地址,一看是我的,他就回给br-int,br-int就会把mac地址缓存起来,并回给vm1即可

.2:不同物理节点上,同一个vlan之间的通信

        例如:vm1:》vm3:10.0.0.4

.3:同一个物理节点上,不同vlan之间的通信

例如:vm3:》vm4: 或者

.4:不同物理节点上,不同vlan之间的通信

例如:vm1:》vm 4:

相关文章

如何在 Linux 中使用 logname 命令?
为什么有 HTTPS?HTTPS 如何实现安全通信?
HTTPS的TSL握手流程是什么
华为无线网络射频调优及WLAN跨VLAN的三层漫游示例
502错误是什么、应该怎么排查?
HTTP3为什么抛弃了经典的TCP,而选择QUIC

发布评论