neutron底层网络实现的模型
1、传统网络到虚拟网络的演进
传统网络

虚拟网络

分布式虚拟网络

neutron是为Openstack提供网络服务的项目,当然neutron也可以脱离Keystone体系作为一个独立的SDN中间件。
- 作为Openstack组件:为openstack 虚拟机、裸机、容器提供网络服务
- 作为SDN中间件:北向提供统一的资源接口,南向提供对接异构的SDN控制器
Neutron 所追求的目标 —— 云计算时代的分布式虚拟化网络与多租户隔离私有的多平面网络,而且 Neutron 的设计初衷是纯粹的 “软件定义”,无需设计新的硬件,而是对现有硬件的协同,这是一个务实的设计思想,通过 Plugin-Driver 的方式来调用底层物理/虚拟网元功能,为上层服务提供支撑。这一特点使 Neutron 得以在业界收到广泛的关注。
NEUTRON 的网络实现模型
在了解 Neutron 网络实现模型的过程中,主要弄明白三个问题:
- Neutron 是怎么支持多类型网络的(e.g. VLAN、VxLAN)?
- 同一个租户网络内的跨计算节点虚拟机之间是怎么通信的?
- 虚拟机是怎么访问外网的?
Neutron 的网络实现模型概览
计算节点网络实现模型

下面我们直接介绍计算机节点上的虚拟机流量是如果被送出计算节点的,并在过程中插入介绍相关的虚拟网络设备于工作机理。
Step 1. 流量经由虚拟机内核 TCP/IP Stack 交给虚拟网卡 vNIC 处理,vNIC 是一个 Tap 设备,它允许用户态程序(这里指 GuestOS,一个 qemu 进程)向内核 TCP/IP 协议栈注入数据。Tap 设备可以运行在 GuestOS 上,提供与物理 NIC 完全相同的功能。
Step 2. 虚拟机的 vNIC(Tap 设备)没有直连到 OvS Bridge 上,而是通过 Linux Bridge 中继到 OvS br-int(Integrated bridge,综合网桥)。为什么 vNIC 不直连 br-int?这是因为 OvS 在 v2.5 以前只有静态防火墙规则,并不支持有状态的防火墙规则。这些规则是 Neutron Security Group 的底层支撑,为虚拟机提供针对端口(vNIC)级别的安全防护,所以引入了 Linux Bridge 作为安全层,应用 iptables 对有状态的数据包进行过滤。其中 Linux Bridge qbr 是 quantum bridge 的缩写。
Step 3. Linux Bridge 与 OvS Bridge 之间通过 veth pair (虚拟网线)设备连接,“网线” 的一端命名为 qvb(quantum veth bridge)另一端命名为 qvo(quantum veth ovs)。veth pair 设备总是成对存在的,用于连接两个虚拟网络设备,模拟虚拟设备间的数据收发。veth pair 设备的工作原理是反转通讯数据的方向,需要发送的数据会被转换成需要收到的数据重新送入内核 TCP/IP 协议栈进行处理,最终重定向到目标设备(“网线” 的另一端)。
Step 4. OvS br-int 是一个综合网桥,作为计算节点本地(Local)虚拟交换设备,完成虚拟机流量在本地的处理 —— Tenant flows are separated by internally assigned VLAN ID.(Tenant 网络的 Local VLAN ID 由 内部分配)
- 虚拟机发出的流量在 br-int 打上 Local VLAN tag,传输到虚拟机的流量在 br-int 被去掉 Local VLAN tag。
- 本地虚拟机之间的 2 层流量直接在 br-int 转发,被同 VLAN tag 的端口接收。
Step 5. 从本地虚拟机传输到远端虚拟机(或网关)的流量由 OvS br-int 上的 int-br-eth1(ovs patch peer 设备)端口送到 OvS br-ethX 上。需要注意的是,br-ethX 并未是一成不变的:当网络类型为 Flat、VLAN 时,使用 br-ethX;当网络类型为 Tunnel(e.g. VxLAN、GRE)时,br-ethX 就会被 br-tun 替换。上图示例为 VLAN 网络。我们将 br-ethX、br-tun 统称为租户网络层网桥设备(TNB),以便于叙述。
NOTE:qbr-xxx 与 OvS br-int 之间使用 veth pair 设备相连,br-int 与 br-ethx/br-tun 之间使用 patch peer 设备相连。两种都是类似的虚拟 “网线”,区别在于前者是 Linux 虚拟网络设备,后者是 OvS 实现的虚拟网络设备。
NOTE:如果租户网桥是 br-tun 而不是 br-ethX,那么在 br-tun 上会有 port:patch-int,br-int 上会有 port:patch-tun,通过 patch-int 和 patch-tun 实现租户网桥 br-tun 和本地网桥 br-int 之间的通信。
Step 6. 当虚拟机流量流经 OvS br-int 与 OvS br-ethX 之间时,需要进行一个至关重要且非常复杂的动作 —— 内外 VID 转换。这是一种 “分层兼容” 的设计理念,让我想起了:所有计算机问题都可以通过引入一个中间层来解决。而 Neutron 面对的这个问题就是 —— 支持多种租户网络类型(Flat、VLAN、VxLAN、GRE)。
Step 7. 最后虚拟机流量通过挂载到 TNB(br-ethX/br-tun)上的物理网卡 ethX 发出到物理网络。OvS br-int 与 OvS br-ethX 之间也是通过 veth pair 设备实现。
Step 8. 虚拟机的流量进入到物理网络之后,剩下的就是传统网络的那一套了。网络包被交换机或其他桥接设备转发到其他计算、网络节点(PS:这取决于具体的部署网络拓扑,一般虚拟机流量只会被同处 Internal Network 的计算节点)接收到。
网络节点网络实现模型
网络节点所承载的最核心的功能就是解决虚拟机与外部网络(e.g. Internet)通信的问题,围绕这个问题我们设想一下在传统网络中是怎么实现的?

- 所有计算节点内的虚拟机,要访问 Internet,必须先经过网络节点,网络节点作为第一层网关。
- 网络节点会通过连接 DC 物理网络中的一个设备(e.g. 交换机,或者是路由器)到达 DC 的网关 。 这个设备称为第二层网关。当然,网络节点也可以直接对接 DC 网关(如果 DC 网关可控的话),这时候,就不需要第二层网关了。
- DC 网关再连接到 Internet上。
可见,网络节点要处理的事情就是第一层网关处理的事情,西接所有计算节点的流量,东接物理网络(第二层)网关设备。为此,网络节点所需要的元素就是一个 L3 Router。需要注意的是,这里所提到的 L3 Router 并不是一个 vRouter(SDN 中的虚拟路由器),而是网络节点本身(一个可作为路由器的 Linux 服务器)。借助于 Linux 服务器本身的路由转发功能,网络节点得以成为了上文提到的:访问外部网络所需要通过的 第一层网关。

依旧从分层的角度来看,网络节点的网络实现模型可以分为 4 层:
- 租户网络层:对接所有(计算、控制、网络)节点,支持多种网络类型。
- 本地网络层:基于内外 VID 转换机制,通过 Local VLAN tag 来区分网络包所属的网络。
- 服务网络层:提供 L3 Router 和 DHCP 服务。
- 外部网络层:对接外部网络(e.g. Internet)。
网络节点出了提供 L3 Router 服务,同时也为每个有必要(用户手动开启)的租户网络提供 DHCP 服务。为了实现多租户网络资源隔离,应用了 Linux 提供的 Network Namesapce 技术。每创建一个 L3 Router 资源对象,就会添加一个与之对应的 qrouter-XXX namesapce;每为一个租户网络开启 DHCP 服务,就会添加一个与之对应的 qdhcp-XXX namesapce。

上图可见,DHCP 服务实际是由 dnsmasq 服务进程提供的,在 qdhcp-XXX namesapce 中会添加一个 DHCP 的端口(Tap 设备),这个 DHCP 端口连接到 br-int 上,具有与对应的租户网络相同的 Local VLAN tag(和租户网络 VID),以此实现为租户网络提供 DHCP 服务。
除此之外,还可以看见在 qrouter-XXX namesapce 中 br-int 和 br-ex 两个网桥设备通过 veth pair 设备 qr-XXX(quantum router) 和 qg-XXX(quantum gateway)连接到了一起。而且 qr-XXX 端口也具有租户网络对应的 Local VLAN tag。不同的租户网络通过不同的 Network Namesapce 实现了 Router 配置(路由表、iptables 规则)的隔离,启用 iptables 在 qrouter-XXX 中主要是提供 NAT 功能,支撑 Neutron 的 Floating IP 功能。
不同的租户具有不同的 qrouter-XXX 与 qdhcp-XXX 实例,所以不同租户间可以实现 IP 地址的复用

在计算节点的网络模型章节中国我们介绍了虚拟机流量如何被送出计算节点,这里继续介绍虚拟机流量是如何被送出外部网络的:
Step 9. 物理网卡 ethX(OvS br-ethX/br-tun)从物理网络接收到从计算节点上虚拟机发出的外部网络访问流量,首先进行内外 VID 转换,然后通过 VETH Pair 设备传输到 OvS br-int。
NOTE:针对每一个租户网络在租户网络层上的 VID 肯定的一致的,而在不同(计算、网络)节点上的 Local VLAN ID 却未必一样,但这并不会导致不同租户网络间的数据包混乱,因为这一切都在 Open vSwitch 流表的掌握之中,我们暂且先对这个问题有个印象。
Step 10. 在网络节点上 OvS br-int 连接了不同的 Network namesapce,qrouter-XXX 通过 qr-XXX 端口接收到租户内跨网段访问流量以及公网访问流量。
- 跨网段访问流量:qr-XXX 端口接收到流量后,内核 TCP/IP 协议栈根据 qrouter-XXX 中的路由规则对跨网段访问流量进行路由、改写 MAC 地址并通过相应的 qr-YYY 接口向 OvS br-int 传输数据包。实现不同网段之间的路由转发。
- 公网访问流量:qr-XXX 端口接收到流量后,内核 TCP/IP 协议栈根据 qrouter-XXX 中的 iptables NAT 规则对流量进行网络地址转换(Floating IP 的实现原理),之后再通过 qg-XXX 接口将数据包发送给 OvS br-ex。
Step 11. 最终由连接第二层网关并挂载到 br-ex 上的物理网卡 ethX 发出送至 Internet 路由器。
综上,“虚拟机是怎么访问外网的?” 这个问题解决了。
控制节点的网络实现模型

控制节点的网络实现模型就相对好理解很多了,因为控制节点不负责数据平面的问题,所以也没有实现具体的网络功能。我们需要关心的只是 neutron-server 这个服务进程。Neutron 没有显式(名为)的 neutron-api 服务进程,而是由 neutron-server 提供 Web Server 的服务。北向接收 REST API 请求,南向通过 RPC 协议转发各节点上的 Neutron Agent 服务进程,这就是 Neutron 在控制节点上的网络实现模型。
至此,我们介绍完了 Neutron 在分别计算、网络、控制节点上的网络实现模型,我们不妨回味一下这之间最重要的的设计思想 —— 分层。

Compute Node 中的 Instance 通过 VXLAN/GRE访问 Public Network
名词解释
bridge(网桥):Linux 中用于表示一个能连接不同网络设备的虚拟设备,Linux 中传统实现的网桥类似于一个 Hub 设备,而 OVS 管理的网桥一般类似交换机。
br-int(bridge-integration):综合网桥,常用于表示实现主要内部网络功能的网桥(ovs)。
br-ex(brifge-external):外部网桥,负责跟外部网络通信的网桥。
GRE(General Routing Encapsulation):一种通过封装来实现隧道的方式,在 Openstack 中一般是基于 L3 的 GRE。
VETH(虚拟 Ethernet接口):通常以 Pair 对的方式出现,一端发出网包,会被对应的另一端接收,可以形成两个网桥之前的通道。
qvb(虚拟接口):neutron veth,Linux Bridge-side
qvo(虚拟接口):OVS-Side
TAP设备:模拟一个 L2 的网络设备,用于接收和发送 L2 网包。
TUN设备:模拟一个 L3 的网络设备,可以接受和发送 L3 网包。
iptables:Linux 安全策略防火墙。
Vlan:虚拟 Lan,同一个物理 Lan 下用标签来实现隔离,范围是0-4095,可用标号为1-4094.
VXLAN:一套利用 UDP 协议作为底层传输协议的 Overlay 实现。被认为是 VLan 技术的延伸和替代者。
namespace:命名空间,是一套用于资料隔离的机制,不同 namespace 中的资源之间彼此不可见。
qbr(Linux 传统网桥):为了让 Instance 能够连接到 br-int (综合网桥上)。因为 br-int 只能对 L3 做防火墙限制,不能针对一个 Instance 做防火墙设置。所以需要 qbr 来完成对一个 Instance 做安全策略。

[A-B] (VM1 ⇒ qbr-1 ) : 被应用在 L2 中,将 VM1 的网包传输到 qbr-1 ,为什么不直接传输到 br-int 呢?因为这之中会涉及到一个 SecurityGroup 的问题。 br-int 综合网桥只能对 L3 层做安全策略,即只能对同一个 subnet 内所有的 Instance 做一个统一的安全策略。这样的话就无法防止同一个 subnet 内的 Instance 去攻击另外一个 Instance 。所以还需要针对单个 Instance 做安全策略,来防止同网段中的 Instance 攻击,而这个针对单个 Instance 的安全策略由 qbr-1(传统 Linux 网桥)来提供。
[C-D] (qbr-1 ⇒ br-int) : qvb 和 qvo 分别作为 Bridge-side 和 OVS-side 的虚拟接口。如果 qbr-1 要跟 br-int 传输数据,就需要将这两个虚拟接口对接。在 br-int 中会对整个 Subnet 中的 Instance 做统一的安全策略。而且 br-int 还能提供 VLan 的功能,br-int 对同一个 subnet 上传输来的网包打上相同的 tag 标记,就是说拥有不同的 tag 的响应数据包会被转发到不同的 VLan 。 br-int 提供的 VLan 功能,将不同的 subnet 隔开,实现了 L3 的隔离(L3 的广播阻断)。br-int 和 qbr-1 完成了 OVS 的功能。
[E-F] ( br-int ⇒ br-tun) : 将网包传输给 br-tun 之后会为每个网包做流表限制,保证了网包响应时,能够根据流表找到对应的 VLan ,而不会胡乱的将响应网包分发给错误的 VLan 中。
[G-H] (br-tun ⇒ br-tun) : 直连的GRE隧道传输,即跨协议传输,拥有相同流表的网包会在同一个隧道中被传输,可以同时拥有多条隔离的隧道。
[I-J] (br-tun ⇒ br-int) : 与 [E,F] 类似,主要完成将隧道号(流表号)和 VLan 号对应转换,保证数据的完整传输和独立性。
[O-P] (br-int ⇒ DHCP):在创建 Instacne 的过程中,会向 DHCP 申请分配 IP。
[M-N] ( br-int ⇒ Route):将内网 Instance 网包的 IP 转换为 Public Network IP
[K-L] (Route ⇒ br-ex) : 最后再通过 br-ex 将网包转发到物理网卡。
文章大部分来源于https://www.cnblogs.com/jmilkfan-fanguiju/p/10589719.html

浙公网安备 33010602011771号