下面我将从核心概念、组件架构、常见部署模型和配置示例四个方面,为你详细解析 OpenStack 的网络配置。

核心概念与术语
在开始配置之前,必须理解以下几个关键概念,它们是构建 OpenStack 网络的基石:
-
Neutron:
- OpenStack 的核心网络服务,负责管理所有虚拟网络、IP 地址、路由器、防火墙等。
- 它本身不直接处理数据包,而是通过调用不同的 插件 来实现网络功能。
-
网络:
一个隔离的二层广播域,类似于传统交换机,你可以创建多个虚拟网络,它们之间默认是隔离的。
(图片来源网络,侵删) -
子网:
在一个网络内部,定义了一个 IP 地址段、网关、DNS 等信息,虚拟机从这个子网获取 IP 地址。
-
路由器:
- 连接不同网络的设备,它可以在租户的私有网络和外部网络(如物理网络)之间进行路由,它还提供 NAT (网络地址转换) 功能,使私有网络中的实例可以访问外部网络,而外部网络无法直接访问它们。
-
端口:
(图片来源网络,侵删)虚拟机网卡、路由器接口、负载均衡器等设备连接到网络的端点,每个端口都有一个唯一的 ID 和 MAC 地址。
-
安全组:
状态ful的虚拟防火墙,作用于端口级别,你可以定义一组规则(如允许入站的 SSH 流量)来控制进出虚拟机的流量。
-
浮动 IP:
外部网络的一个可路由 IP 地址,它被动态地绑定到虚拟机的固定(私有)IP 上,从而使虚拟机可以从外部网络被访问,这就像给虚拟机分配了一个“公网电话号码”。
-
插件:
- Neutron 的核心架构,插件决定了底层网络技术的实现方式,常见的插件有:
- ML2 (Modular Layer 2): 最流行、最灵活的插件,它本身不实现网络,而是通过 驱动 来支持多种技术(如 VLAN, VXLAN, GRE 等)。
- OVS (Open vSwitch): 一种高性能的软件交换机,通常与 ML2 插件配合使用,是目前生产环境中最主流的选择。
- 其他: 还有如 Calico (基于 BGP 的路由)、VPP (用户态协议栈) 等插件,用于特定场景。
- Neutron 的核心架构,插件决定了底层网络技术的实现方式,常见的插件有:
组件架构
一个典型的 OpenStack 网络架构由以下几个关键部分组成:
- Neutron Server: API 服务,接收和处理来自 Horizon、CLI 或其他客户端的网络请求。
- Plugin Agent (如 ML2/OVS Agent): 运行在每个计算节点和控制节点上,负责在本地创建虚拟交换机(如 OVS),并根据 Neutron Server 的指令来配置这些交换机,实现虚拟机网卡的连接、VLAN 标签的打/解、VXLAN 隧道的建立等。
- L3 Agent (路由器代理): 运行在指定节点上,负责实现虚拟路由器的功能,包括路由和 NAT。
- DHCP Agent: 运行在指定节点上,为虚拟机提供 DHCP 服务,分配 IP 地址、网关等信息。
- Metadata Agent: 运行在指定节点上,允许虚拟机通过一个特殊的本地 IP 地址(169.254.169.254)获取元数据(如用户数据、SSH 密钥等)。
- ML2 Core & Mechanism Drivers: ML2 插件的核心,Core Driver 处理基础的网络对象(网络、端口、子网),Mechanism Driver 处理具体的网络实现技术(如 OVS、Linux Bridge)。
数据流向示例 (虚拟机访问外网):
- 虚拟机发送数据包到其默认网关(虚拟路由器的接口)。
- 虚拟机所在的计算节点上的 OVS Agent 将数据包从虚拟机的
vnet端口转发到路由器的qr-xxx端口。 - L3 Agent 接收到数据包,发现目标地址是外网,于是进行源地址 NAT (SNAT),将虚拟机的私有 IP 替换为浮动 IP。
- L3 Agent 将数据包从路由器的
qg-xxx端口发送到外部网络。 - 数据包通过物理网卡到达物理网络,最终到达互联网。
常见部署模型
根据业务需求,OpenStack 网络有几种经典的部署模型:
Provider 网络 (最简单)
- 场景: 快速部署,虚拟机直接使用物理网络 VLAN。
- 特点:
- 网络由管理员预先在物理交换机上配置好 VLAN。
- Neutron 只是“借用”这个物理网络,不对其进行隔离管理。
- 虚拟机直接暴露在物理网络中,安全性较低。
- 适用: 简单的测试环境,或对网络隔离要求不高的场景。
Self-Service 网络 (最常用)
- 场景: 为租户提供完全隔离、可定制的私有网络。
- 特点:
- 租户可以创建自己的虚拟网络 (
tenant-network)。 - 通过 路由器 连接到外部网络 (
provider-network),实现内外通信。 - 关键技术: 使用 VXLAN 或 GRE 等隧道技术,在物理网络上叠加一层虚拟网络,实现租户间的二层隔离。
- 这是 OpenStack 网络的精髓所在。
- 租户可以创建自己的虚拟网络 (
- 适用: 绝大多数生产环境,提供安全、灵活的网络服务。
VLAN-aware Router 模式 (高级)
- 场景: 需要为不同租户的子网分配不同的、可路由的 VLAN ID。
- 特点:
- 是 Self-Service 网络的增强版。
- 路由器直接与物理网络集成,每个子网对应一个物理 VLAN。
- 租户的子网可以直接被外部网络路由,无需 NAT。
- 对物理交换机的配置要求更高。
- 适用: 需要高度集成和性能,且物理交换机支持 VLAN Trunking 的场景。
配置示例 (Self-Service 网络)
下面我们以最常用的 Self-Service 网络 模式为例,演示如何通过 OpenStack CLI (命令行) 进行配置。
假设环境:
- 已部署好 OpenStack,包括 Neutron 服务。
- 已存在一个外部网络,名为
public,其网络 ID 为a1b2c3d4-e5f6-7890-1234-567890abcdef。
步骤 1: 创建租户私有网络
# 创建一个名为 'private-net' 的租户网络 neutron net-create private-net --shared # 输出: # +---------------------------+--------------------------------------+ # | Field | Value | # +---------------------------+--------------------------------------+ # | admin_state_up | True | # | id | 5e6f7g8h-i9j0-kl12-mn34-op56q7r8s9t | # | mtu | 1500 | # | name | private-net | # | provider:network_type | vxlan | # 通常默认为 vxlan # | provider:physical_network | | # | provider:segmentation_id | 1 | # VXLAN 的 VNI # | router:external | False | # | shared | True | # | status | ACTIVE | # | subnets | | # +---------------------------+--------------------------------------+
步骤 2: 在私有网络上创建子网
# 在 'private-net' 上创建一个子网,名为 'private-subnet'
neutron subnet-create private-net 10.0.0.0/24 --name private-subnet --gateway 10.0.0.1 --dns-nameserver 8.8.8.8
# 输出:
# +------------------+------------------------------------------------------+
# | Field | Value |
# +------------------+------------------------------------------------------+
# | allocation_pools | {"start": "10.0.0.2", "end": "10.0.0.254"} |
# | cidr | 10.0.0.0/24 |
# | enable_dhcp | True |
# | gateway_ip | 10.0.0.1 |
# | host_routes | |
# | id | 6a7b8c9d-e0f1-g234-h567-i890j1k2l3m4n |
# | ip_version | 4 |
# | name | private-subnet |
# | network_id | 5e6f7g8h-i9j0-kl12-mn34-op56q7r8s9t |
# | subnetpool_id | |
# +------------------+------------------------------------------------------+
步骤 3: 创建路由器并连接到外部网络
# 创建一个路由器 neutron router-create my-router # 输出: # +-------------------+--------------------------------------+ # | Field | Value | # +-------------------+--------------------------------------+ # | admin_state_up | True | # | id | j1k2l3m4-n5o6-p789-q012-r3s4t5u6v7w | # | name | my-router | # | routes | | # | status | ACTIVE | # +-------------------+--------------------------------------+ # 将路由器连接到外部网络 'public' neutron router-gateway-set my-router public # 输出: (无输出,表示成功)
步骤 4: 将路由器接口连接到私有子网
# 将路由器的接口添加到 'private-subnet' neutron router-interface-add my-router private-subnet # 输出: (无输出,表示成功)
步骤 5: 创建安全组规则
# 允许 ICMP 流量 (ping) neutron security-group-rule-create --protocol icmp default # 允许 SSH 流量 (端口 22) neutron security-group-rule-create --protocol tcp --port-range-min 22 --port-range-max 22 default
步骤 6: 启动虚拟机并分配浮动 IP
-
启动虚拟机:
- 在 Horizon 或通过
nova boot命令启动一个实例。 - 在创建实例时,选择
private-net网络。 - 选择
default安全组。
- 在 Horizon 或通过
-
分配浮动 IP:
# 从 'public' 网络中分配一个浮动 IP neutron floatingip-create public # 输出: # +---------------------+--------------------------------------+ # | Field | Value | # +---------------------+--------------------------------------+ # | fixed_ip_address | | # | floating_ip_address | 203.0.113.10 | # 分配到的公网 IP # | floating_network_id | a1b2c3d4-e5f6-7890-1234-567890abcdef | # | id | z1x2c3v4-b5n6-m7k8-l9p0-q1w2e3r4t5y6 | # | port_id | | # | router_id | | # | status | DOWN | # +---------------------+--------------------------------------+
-
将浮动 IP 绑定到虚拟机:
- 你需要知道虚拟机实例的端口 ID,可以在 Horizon 的实例详情页找到,或通过
neutron port-list查看。 - 假设端口 ID 为
d4e5f6g7-h8i9-j012-k345-l6m7n8o9p0q。# 将浮动 IP 绑定到虚拟机的端口 neutron floatingip-associate z1x2c3v4-b5n6-m7k8-l9p0-q1w2e3r4t5y6 d4e5f6g7-h8i9-j012-k345-l6m7n8o9p0q # 输出: (无输出,表示成功)
- 虚拟机就拥有了公网 IP
0.113.10,你可以通过 SSH 连接到它了。
- 你需要知道虚拟机实例的端口 ID,可以在 Horizon 的实例详情页找到,或通过
总结与建议
- 从简单开始: 如果你是新手,先从 Provider 网络 开始,理解基本概念。
- 掌握核心: Self-Service 网络 是必须掌握的,理解其背后的 VXLAN 隧道 和 路由器 原理至关重要。
- 文档是朋友: OpenStack 官方文档是最好的学习资料,特别是 Neutron 的部分。
- 工具辅助: 使用 Horizon (Web UI) 进行操作可以更直观地理解各个组件之间的关系,然后再学习使用 CLI。
- 故障排查: 网络问题最常见,学会使用
neutron port-list,neutron port-show,neutron router-port-list等命令查看端口状态,以及在各节点上使用ovs-vsctl show,tcpdump等工具排查底层网络问题。
希望这份详细的指南能帮助你理解并配置 OpenStack 网络!
