OpenStack Networking

OpenStack Networking 允许您创建和管理网络对象,例如网络、子网和端口,其他 OpenStack 服务可以使用这些对象。可以通过实现插件来适应不同的网络设备和软件,为 OpenStack 架构和部署提供灵活性。

Networking 服务,代码名为 neutron,提供了一个 API,让您可以定义云中的网络连接和寻址。Networking 服务使操作员能够利用不同的网络技术来支持他们的云网络。Networking 服务还提供了一个 API,用于配置和管理各种网络服务,从 L3 转发和网络地址转换 (NAT) 到周界防火墙和虚拟专用网络。

它包括以下组件

API server

OpenStack Networking API 包括对 Layer 2 网络和 IP 地址管理 (IPAM) 的支持,以及对 Layer 3 路由器结构的扩展,该结构支持在 Layer 2 网络和外部网络网关之间进行路由。OpenStack Networking 包含一个不断增长的插件列表,这些插件支持与各种商业和开源网络技术的互操作性,包括路由器、交换机、虚拟交换机和软件定义网络 (SDN) 控制器。

OpenStack Networking 插件和代理

连接和断开端口,创建网络或子网,并提供 IP 寻址。所选插件和代理取决于特定云中使用的供应商和技术。重要的是要注意,一次只能使用一个插件。

消息队列

接受和路由代理之间的 RPC 请求,以完成 API 操作。在 ML2 插件中,消息队列用于 neutron 服务器和运行在每个 hypervisor 上的 neutron 代理之间的 RPC,在 ML2 机制驱动程序中用于 Open vSwitch 和 Linux bridge。

概念

要配置丰富的网络拓扑,您可以创建和配置网络和子网,并指示其他 OpenStack 服务(如 Compute)将虚拟设备连接到这些网络上的端口。OpenStack Compute 是 OpenStack Networking 的一个重要用户,为它的实例提供连接。特别是,OpenStack Networking 支持每个项目拥有多个私有网络,并允许项目选择自己的 IP 寻址方案,即使这些 IP 地址与其他项目使用的 IP 地址重叠。有两种类型的网络:项目网络和提供商网络。可以在网络创建过程中在项目之间共享这些类型的网络。

提供商网络

提供商网络为实例提供 Layer 2 连接,并可选地支持 DHCP 和元数据服务。这些网络连接或映射到数据中心中现有的 Layer 2 网络,通常使用 VLAN (802.1q) 标记来识别和分隔它们。

提供商网络通常提供简单性、性能和可靠性,但牺牲了灵活性。默认情况下,只有管理员可以创建或更新提供商网络,因为它们需要配置物理网络基础设施。可以使用 policy.yaml 的以下参数来更改允许创建或更新提供商网络的用戶:

  • create_network:provider:physical_network

  • update_network:provider:physical_network

警告

提供商网络的创建和修改能够使用物理网络资源,例如 VLAN。仅对受信任的项目启用这些更改。

此外,提供商网络仅处理实例的 Layer 2 连接,因此缺乏对诸如路由器和浮动 IP 地址之类的功能的支持。

在许多情况下,已经熟悉依赖于物理网络基础设施进行 Layer 2、Layer 3 或其他服务的虚拟网络架构的操作员可以无缝部署 OpenStack Networking 服务。特别是,提供商网络吸引了希望从 Compute 网络服务 (nova-network) 迁移到 OpenStack Networking 服务的操作员。随着时间的推移,操作员可以在这种最小架构的基础上构建,以启用更多的云网络功能。

通常,处理 Layer 3 操作的 OpenStack Networking 软件组件对性能和可靠性的影响最大。为了提高性能和可靠性,提供商网络将 Layer 3 操作转移到物理网络基础设施。

在一种特定的用例中,OpenStack 部署位于一个混合环境中,其中包含传统的虚拟化和裸机主机,这些主机使用大量的物理网络基础设施。在 OpenStack 部署内部运行的应用程序可能需要直接的 Layer 2 访问,通常使用 VLAN,才能访问部署外部的应用程序。

路由的提供商网络

路由的提供商网络为实例提供 Layer 3 连接。这些网络映射到数据中心中现有的 Layer 3 网络。更具体地说,网络映射到多个 Layer 2 段,每个段本质上都是一个提供商网络。每个段都连接了一个路由器网关,该网关在它们之间以及与外部网络之间路由流量。Networking 服务不提供路由。

路由的提供商网络提供难以用普通提供商网络实现的规模性能,但牺牲了保证的 Layer 2 连接。

Neutron 端口只能与一个网络段关联,但 OVN 分布式服务(如 OVN Metadata)除外。

有关更多信息,请参阅 路由的提供商网络

自助服务网络

自助服务网络主要使普通(非特权)项目能够在不涉及管理员的情况下管理网络。这些网络完全是虚拟的,需要虚拟路由器才能与提供商和外部网络(如 Internet)交互。自助服务网络通常还为实例提供 DHCP 和元数据服务。

在大多数情况下,自助服务网络使用覆盖协议,如 VXLAN 或 GRE,因为它们可以支持比使用 VLAN 标记 (802.1q) 进行 Layer 2 分段更多的网络。此外,VLAN 通常需要对物理网络基础设施进行额外的配置。

IPv4 自助服务网络通常使用私有 IP 地址范围 (RFC1918),并通过虚拟路由器上的源 NAT 与提供商网络交互。浮动 IP 地址通过虚拟路由器上的目标 NAT 允许从提供商网络访问实例。IPv6 自助服务网络始终使用公共 IP 地址范围,并通过具有静态路由的虚拟路由器与提供商网络交互。

Networking 服务使用 Layer 3 代理来管理路由器,该代理通常至少位于一个网络节点上。与将实例连接到物理网络基础设施的 Layer 2 的提供商网络相反,自助服务网络必须遍历 Layer 3 代理。因此,Layer 3 代理或网络节点的过度订阅或故障会影响大量的自助服务网络和使用它们的实例。考虑实施一个或多个高可用性功能,以提高自助服务网络的冗余性和性能。

用户创建项目网络以实现项目内的连接。默认情况下,它们完全隔离,不与其他项目共享。OpenStack Networking 支持以下类型的网络隔离和覆盖技术。

扁平

所有实例都位于同一网络上,该网络也可以与主机共享。不进行 VLAN 标记或其他网络隔离。

VLAN

Networking 允许用户使用与物理网络中存在的 VLAN 对应的 VLAN ID (802.1Q 标记) 创建多个提供商或项目网络。这允许实例相互通信,以及与环境中的专用服务器、防火墙和其他网络基础设施通信。

GRE 和 VXLAN

VXLAN 和 GRE 是封装协议,可创建覆盖网络以激活和控制计算实例之间的通信。需要 Networking 路由器才能允许流量流出 GRE 或 VXLAN 项目网络。路由器还需要直接连接的项目网络与外部网络(包括 Internet)连接。路由器提供了一种使用浮动 IP 地址直接从外部网络连接到实例的能力。

Project and provider networks

子网

一个 IP 地址块和相关的配置状态。这也被称为 Networking 服务为项目和提供商网络提供的本机 IPAM(IP 地址管理)。当在网络上创建新端口时,会使用子网来分配 IP 地址。

子网池

最终用户通常可以创建具有任何有效 IP 地址的子网,而无需其他限制。但是,在某些情况下,管理员或项目预定义一个地址池,从中自动分配子网会很好。

使用子网池约束了可以使用哪些地址,要求每个子网都在定义的池内。它还防止了来自同一池的两个子网重复使用或重叠地址。

有关更多信息,请参阅 子网池

端口

端口是连接单个设备(例如虚拟服务器的 NIC)到虚拟网络的连接点。端口还描述了相关的网络配置,例如该端口上要使用的 MAC 和 IP 地址。

路由器

路由器提供虚拟 Layer 3 服务,例如自助服务网络和提供商网络之间或属于项目的自助服务网络之间的路由和 NAT。Networking 服务使用 Layer 3 代理通过命名空间管理路由器。

安全组

安全组提供虚拟防火墙规则的容器,这些规则控制在端口级别进入(进入实例)和退出(从实例发出)的网络流量。安全组使用默认拒绝策略,并且仅包含允许特定流量的规则。每个端口可以以累加方式引用一个或多个安全组。防火墙驱动程序将安全组规则转换为底层数据包过滤技术的配置,例如 iptables

每个项目都包含一个 default 安全组,默认情况下允许所有出口流量并拒绝所有入口流量。您可以更改 default 安全组中的规则。管理员用户还可以定义自己的安全组规则集,这些规则集将默认添加到每个新的 default 和每个为云中的每个项目创建的新非默认(自定义)安全组。有一个 security-group-default-rules API 扩展,允许定义这样一组默认安全组规则。如果您在不指定安全组的情况下启动实例,则 default 安全组将自动应用于它。同样,如果您在不指定安全组的情况下创建端口,则 default 安全组将自动应用于它。

注意

如果您使用元数据服务,删除默认出口规则会拒绝访问 TCP 端口 80 上的 169.254.169.254,从而阻止实例检索元数据。

安全组规则是有状态的。因此,允许进入 TCP 端口 22 进行安全 shell 会自动创建允许返回出口流量和涉及这些 TCP 连接的 ICMP 错误消息的规则。

默认情况下,所有安全组都包含一系列基本(理智性)和反欺骗规则,这些规则执行以下操作

  • 仅当它使用实例的源 MAC 和 IP 地址、allowed-address-pairs 中的源 MAC 和 IP 组合,或有效的 MAC 地址(端口或 allowed-address-pairs)和相关的 EUI64 链路本地 IPv6 地址时,才允许出口流量。

  • 允许使用实例的端口的源 MAC 地址和未指定的 IPv4 地址 (0.0.0.0) 的出口 DHCP 发现和请求消息。

  • 允许来自子网上的 DHCP 服务器的入口 DHCP 和 DHCPv6 响应,以便实例可以获取 IP 地址。

  • 拒绝出口 DHCP 和 DHCPv6 响应,以防止实例充当 DHCP(v6) 服务器。

  • 允许入口/出口 ICMPv6 MLD、邻居请求和邻居发现消息,以便实例可以发现邻居并加入多播组。

  • 拒绝出口 ICMPv6 路由器通告,以防止实例充当 IPv6 路由器并为其他实例转发 IPv6 流量。

  • 允许出口 ICMPv6 MLD 报告(v1 和 v2)和邻居请求消息,这些消息使用特定实例的源 MAC 地址和未指定的 IPv6 地址 (::)。重复地址检测 (DAD) 依赖于这些消息。

  • 允许出口非 IP 流量来自实例的端口的 MAC 地址和实例端口上的 allowed-address-pairs 中的任何其他 MAC 地址。

上述规则由 neutron 自动添加,不能使用 default security group rules API 通过 security-group-default-rules 扩展进行更改。

虽然是非 IP 流量,安全组不会隐式允许所有 ARP 流量。单独的 ARP 过滤规则可防止实例使用 ARP 截获另一个实例的流量。您无法禁用或删除这些规则。

您可以通过将端口属性 port_security_enabled 设置为 False 来禁用包括基本和反欺骗规则的安全组。

扩展

OpenStack Networking 服务是可扩展的。扩展有两个目的:它们允许在不更改版本的情况下在 API 中引入新功能,并且它们允许引入供应商特定的利基功能。应用程序可以通过对 /extensions URI 执行 GET 请求来以编程方式列出可用的扩展。请注意,这是一个版本化的请求;也就是说,在一个 API 版本中可用的扩展可能在另一个 API 版本中不可用。

DHCP

可选的 DHCP 服务管理提供商和自助服务网络上实例的 IP 地址。Networking 服务使用管理 qdhcp 命名空间的代理和 dnsmasq 服务来实现 DHCP 服务。

元数据

可选的元数据服务提供了一个 API,供实例获取元数据,例如 SSH 密钥。

服务和组件层次结构

服务器

  • 提供 API、管理数据库等。

插件

  • 管理代理

代理

  • 为实例提供 Layer 2/3 连接

  • 处理物理-虚拟网络转换

  • 处理元数据等。

Layer 2(以太网和交换)

  • Linux Bridge

  • OVS

Layer 3(IP 和路由)

  • L3

  • DHCP

杂项

  • 元数据

服务

路由服务

VPNaaS

虚拟专用网络即服务 (VPNaaS) 是 neutron 扩展,它引入了 VPN 功能集。

LBaaS

负载均衡即服务 (LBaaS) API 配置和配置负载均衡器。参考实现基于 HAProxy 软件负载均衡器。有关更多信息,请参阅 Octavia 项目

FWaaS

防火墙即服务 (FWaaS) API 允许将防火墙应用于 OpenStack 对象,例如项目、路由器和路由器端口。