07 · 网络管理 Neutron

本篇导读:前面学的 Keystone(身份)、Glance(镜像)、Cinder(块存储)……都是"围着虚拟机转"的辅助服务。而 Neutron 要解决的是最抽象、也最贴近真实运维的问题——虚拟机怎么连上网?两个租户的虚拟机为什么不能互相访问?怎么让一台内网虚拟机既能主动上外网,又能被外网主动访问到?

Neutron 是 OpenStack 里难度最大、内容最多的一篇。它的设计目标是"网络即服务(Networking as a Service,NaaS)",在实现上基于 SDN(软件定义网络)做网络虚拟化,底层大量复用 Linux 原生网络技术(TAP/VETH/namespace/iptables/网桥)。本篇按"物理网络 → Linux 虚拟网络元件 → Neutron 资源与网络类型 → 架构组件 → 三种 vSwitch(Linux Bridge / OVS / OVN)→ 三层路由与浮动 IP → 安全 → 连通性实验 → Dashboard/CLI 操作 → OVN 实验 → 排障 → 进阶补充"的顺序,由浅入深把这张网彻底讲透。

学习目标:

  1. 说清 Neutron 的定位:NaaS、基于 SDN 的网络虚拟化,它提供二层交换、三层路由、负载均衡、防火墙、VPN 五大能力;
  2. 分清物理网络与虚拟网络的对应关系(Switch↔vSwitch、NIC↔vNIC),讲清 TAP / TUN / VETH Pair / network namespace / Linux Bridge / OVS 各自是干什么的;
  3. 吃透三大核心资源 Network / Subnet / Port 的定义、约束(CIDR 重叠判定)与 Project 1:m Network 1:m Subnet 1:m Port 1:1 VIF m:1 Instance 关系链;
  4. 对比 local / flat / vlan / vxlan / gre 五种网络类型,记住 VLAN tag、VXLAN 的 VNI(24 位)与 UDP 封装、GRE 的 IP 封装;
  5. 画出 Neutron 架构:Neutron Server → Plugin(核心是 ML2)→ Agent → network provider,靠 RabbitMQ 通信、MySQL 存状态;
  6. 讲通"外部网络 + 浮动 IP = 1:1 NAT",理解 SNAT 与 DNAT 的方向;
  7. 背下连通性实验的六条结论,并能解释三个思考题(端口固定 IP、浮动 IP 不通、能否直接释放);
  8. 掌握 Dashboard 与 CLI 创建网络/子网/路由器/浮动 IP/安全组的全套命令;
  9. 读懂 OVN 实验环境:ovn-nbctl show 输出、NB/SB 双库 6641/6642、Geneve 封装。

文章目录

1. 为什么需要 Neutron:从手工网络到 SDN

传统网络管理高度依赖管理员手工配置物理交换机、路由器。但在云平台多租户场景下,用户随时要创建、修改、删除网络,网络的连通性与隔离性不可能靠手工保证。

  • 传统方式:管理员登录交换机敲命令,慢、易错、无法自动化;
  • 云的要求:用户自助、秒级开通、租户间强隔离、随时可销毁重建;
  • 答案:软件定义网络(SDN, Software-Defined Networking)——把网络的"控制平面"从物理设备里抽出来,交给软件集中编排,数据平面仍由设备转发,从而获得灵活性与自动化。

⚠️ 关键定位(必背):Neutron 的设计目标是实现 “网络即服务(NaaS)”,设计上遵循基于 SDN 实现网络虚拟化的原则,实现上充分利用 Linux 系统的各种网络技术。它为整个 OpenStack 环境提供网络支持。


2. 物理网络 vs 虚拟网络:一张对照表

学 Neutron 之前,先把"现实世界的网"和"云里虚拟出来的网"一一对应起来,后面所有概念都好懂。

物理世界虚拟世界(OpenStack / Linux)说明
物理交换机 Switch虚拟交换机 vSwitch(Linux Bridge、Open vSwitch OVS、OVN)在一台 Linux 主机上用软件模拟一台交换机
物理网卡 NIC虚拟网卡 vNIC(VM 内部看到的网卡,对应宿主机的 VIF)虚拟机以为自己插了一张网卡
物理网线VETH Pair(成对出现的虚拟网线)一端进虚拟机,一端进虚拟交换机
物理路由器Neutron Router(虚拟路由器,用 Linux network namespace 实现)跨网段路由 + NAT
物理防火墙Security Group(安全组)/ FWaaS用 iptables 实现包过滤
机房物理网络External 外部网络(flat/vlan,接 br-ex 和物理网卡 ens160)让云里的世界能接到真实网络

一句话:vSwitch 是软件写的交换机,vNIC 是软件写的网卡,VETH 是软件写的网线,namespace 是软件写的"一台隔离的路由器/主机"。


3. Linux 网络虚拟化四大件(Neutron 的地基)

Neutron 并不是从零发明了一套网络,它是把 Linux 内核里现成的几样"玩具"组装成了云网络。这一节是理解后面一切的关键。

3.1 TAP 设备 vs TUN 设备

对比项TAPTUN
工作层级二层三层
收发内容以太网帧(带 MAC 头)IP 包(只有 IP 头)
用途直接给虚拟机当网卡用(VM 的虚拟网卡背后就是 TAP)隧道封装/解封装(VPN、VXLAN/GRE 把包收上来再加工)
一句话记忆TAP = 一块虚拟"网卡",跑二层帧TUN = 一条虚拟"串口/管道",跑三层 IP 包

3.2 VETH Pair(成对虚拟网线)

  • 总是成对出现,像一根普通网线的两头:从一头进去的包,一定从另一头出来;
  • 典型用法:一头塞进虚拟机/network namespace,另一头插进 Linux Bridge 或 OVS 的端口,从而把命名空间里的"机器"接到虚拟交换机上。

3.3 Linux Bridge 与 Open vSwitch(虚拟交换机)

  • Linux Bridge:Linux 原生网桥,工作在二层,像一台老式傻瓜交换机,把多个端口的二层帧转发到一起;
  • Open vSwitch(OVS):开源、支持标准管理接口与协议的"企业级"虚拟交换机,更像一台可编程交换机,靠**流表(OpenFlow)**决定每个包怎么走,功能远强于 Linux Bridge。

教材明确点出:利用 Linux Bridge 和 OVS,Neutron 既能建传统 VLAN 网络,也能建基于隧道的 Overlay 网络(VxLAN、GRE);其中 Linux Bridge 目前只支持 VxLAN,不支持 GRE。

3.4 network namespace(网络命名空间)

这是"不同租户 IP 可以重叠却不冲突"的根本原因,务必理解透:

  • network namespace 是 Linux 的网络隔离机制:每个 namespace 拥有独立的协议栈、路由表、防火墙(iptables)、网卡集合;
  • Neutron 的虚拟路由器就是用 network namespace 实现的——每个 router 跑在自己的 namespace 里,有自己独立的路由表;
  • 推论:不同 router 的路由表互不相干,所以即使两个租户的子网都用了 10.10.1.0/24,也能各自被自己的 router 正常路由,不会"撞 IP"。

3.5 四大件如何拼到一起

背后是一块 TAP

通过 VETH Pair 这根虚拟网线

同节点同网络

跨网段/去外网

Neutron Router 就住在这里

隧道封装解包

虚拟机 VM
内部协议栈看到一张 eth0

TAP 设备(二层,收发以太网帧)

虚拟交换机
Linux Bridge / OVS(br-int)

目标 VM 的 TAP

network namespace
独立协议栈 + 路由表 + iptables

虚拟路由器
独立路由表 → 各租户可重叠 IP

TUN 设备(三层,收发 IP 包)


4. Neutron 的五大功能

Neutron 为整个 OpenStack 提供网络支持,它是一个灵活框架——具体用开源还是商业软件来实现,靠配置插件决定。

功能英文实现要点(必背)
二层交换SwitchingVM 通过虚拟交换机连上虚拟二层网。vSwitch 可选 Linux Bridge、OVS;网络类型支持传统 VLAN 与 Overlay 的 VxLAN / GRE(Linux Bridge 只支持 VxLAN)
三层路由RoutingNeutron 的 router 让不同网段的 Instance 互通;底层靠 IP forwarding + iptables 实现路由与 NAT
负载均衡Load BalancingLBaaS(Load-Balancing-as-a-Service),Grizzly 版本首次引入,把流量分发到多台 Instance;多种实现以 Plugin 接入,默认 Plugin 是 HAProxy
防火墙Firewalling两种方式:① Security Group 用 iptables 限制进出 Instance 的包;② FWaaS 用 iptables 限制进出虚拟路由器的包
VPNVPNaaS站点到站点 VPN(教材与实验环境:OVN 后端下 packstack 提示不支持 VPNaaS)

记忆钩子:“二交三路四均衡,防火 VPN 补全墙”——二层交换、三层路由、负载均衡、防火墙(安全组+FWaaS)、VPN。


5. 三大核心资源:Network / Subnet / Port

Neutron 管理的网络资源就这三样,是后面所有操作的对象。

5.1 Network —— 隔离的二层广播域

  • Network 是一个隔离的二层广播域;
  • 不同 Network 在二层上是隔离的:例如两个 vlan 网络分配不同 VLAN ID,Network A 的广播包绝不会跑到 Network B;
  • 隔离只是二层隔离,借助路由器,不同 Network 在三层上仍然可以通信;
  • Network 必须属于某个 Project(租户),Project 与 Network 是 1 对多关系。

5.2 Subnet —— IPv4/IPv6 地址段

  • Subnet 是一个 IPv4 或 IPv6 地址段,Instance 的 IP 从这里面分配;每个 Subnet 要定义地址范围和掩码;
  • Network 与 Subnet 是 1 对多:一个 Subnet 只属于一个 Network;一个 Network 可以有多个 Subnet;
  • ⚠️ 关键约束(必背,判断题常考):同一个 Network 下的多个 Subnet CIDR 不能重叠——判别的是 CIDR 是否重叠,而不是已分配的具体 IP 是否重叠。
✅ 有效(同一 Network,两个不同网段):
  Network A / Subnet A-a: 10.10.1.0/24  {10.10.1.1 ~ 10.10.1.50}
  Network A / Subnet A-b: 10.10.2.0/24  {10.10.2.1 ~ 10.10.2.50}

❌ 无效(同一 Network,CIDR 都是 10.10.1.0/24,重叠了):
  Network A / Subnet A-a: 10.10.1.0/24  {10.10.1.1 ~ 10.10.1.50}
  Network A / Subnet A-b: 10.10.1.0/24  {10.10.1.51 ~ 10.10.1.100}   ← 哪怕 IP 不重叠也不行!
  • 反过来:如果两个 Subnet 在不同 Network里,CIDR 和 IP 都可以重叠。那两个一样 IP 的 Instance 会不会冲突?
    • 不会! 因为 Neutron 的 router 是用 Linux network namespace 实现的,每个 router 有独立路由表:
      1. 若两个重叠子网走同一个 router,按配置只有其中一个会被路由;
      2. 若走不同 router(各自 namespace、各自路由表),两个子网都能被正常路由,互不干扰。

5.3 Port —— 虚拟交换机上的一个端口

  • Port 可以看作虚拟交换机上的一个端口,上面定义了 MAC 地址 + IP 地址;
  • 当 Instance 的虚拟网卡 VIF(Virtual Interface) 绑定到 Port 时,Port 把 MAC 和 IP 分配给 VIF;
  • Subnet 与 Port 是 1 对多:一个 Port 必须属于某个 Subnet;一个 Subnet 可以有多个 Port。

5.4 关系链(必背一句话)

1 对多

1 对多

1 对多

1 对 1

多对 1

Project 项目(租户)

Network 网络
隔离的二层广播域

Subnet 子网
IPv4/IPv6 地址段(CIDR 不重叠)

Port 端口
MAC + IP

VIF 虚拟网卡

Instance 虚拟机
一台 VM 可以有多块 VIF

教材原文关系:Project 1:m Network 1:m Subnet 1:m Port 1:1 VIF m:1 Instance。


6. 五种网络类型对比(必背表格)

Network 支持五种类型,决定了这个二层广播域"怎么在物理网络上铺开来"。

类型是否带 tag跨节点封装方式典型用途记忆点
local无❌ 只能同节点无单机测试与其他网络、其他节点完全隔离,本节点同网络的 VM 才能互访
flat无 VLAN tag✅无(裸二层)直接接物理网的扁平网同网络 VM 互通,可跨多节点
vlan802.1Q tag✅无(裸二层,带 tag)应用最广泛的网络类型同一 vlan 内互通;不同 vlan 是二层广播域,只能通过 router 三层通信
vxlan逻辑隔离(VNI,24 位)✅把二层包封装成 UDP 在三层传输Overlay 大二层通过唯一的 segmentation ID(VNI)区分不同 vxlan 网络,克服 VLAN 和物理基础设施限制
gre逻辑隔离✅用 IP 包(协议号 47)封装,而非 UDPOverlay 大二层与 vxlan 类似,主要区别在于封装层:vxlan 用 UDP,gre 用 IP

补充:VLAN 标签为 12 位(可用 1~4094);VXLAN 的 VNI 也是 24 位空间,远大于 VLAN;VXLAN 默认 UDP 端口 4789。


7. Neutron 架构与组件

和 OpenStack 其他服务一样,Neutron 也是分布式架构,由多个子服务协作对外提供网络服务。

计算节点 / 网络节点

控制节点

用户 / Dashboard / openstack CLI

neutron-server
对外提供 REST API,接收请求并调 Plugin

Plugin(核心是 ML2)
维护逻辑网络状态,调 Agent
= Type Driver + Mechanism Driver

消息队列 Queue
RabbitMQ:Server/Plugin/Agent 之间通信

MySQL neutron 库
存 Network/Subnet/Port/Router 状态(教材实测 171 张表)

Agent
在 network provider 上真正落地网络功能

network provider
Linux Bridge / OVS / 支持 Neutron 的物理交换机

7.1 六大组件职责(必背)

组件职责
Neutron Server对外提供 OpenStack 网络 API,接收请求,并调用 Plugin 处理
Plugin处理 Server 发来的请求,维护 OpenStack 逻辑网络状态,并调用 Agent;当前核心 Plugin 是 ML2
Agent处理 Plugin 的请求,在 network provider 上真正实现各种网络功能
network provider提供网络服务的虚拟或物理网络设备:Linux Bridge、Open vSwitch 或其他支持 Neutron 的物理交换机
Queue(消息队列)Neutron Server、Plugin、Agent 之间通过 Messaging Queue(RabbitMQ) 通信和调用
Database存放网络状态:Network、Subnet、Port、Router 等。教材里 use neutron; show tables; 实测有 171 张表(能看到 networks、subnets、ports、routers、floatingips、securitygroups、ml2_vxlan_allocations、qos_policies、trunks、bgp_peers 等)

7.2 一次"创建网络"请求的时序(理解协作)

L2 Agent RabbitMQ MySQL neutron-server 用户/CLI L2 Agent RabbitMQ MySQL neutron-server 用户/CLI openstack network create(REST 请求) 校验参数,分配 segmentation ID(VLAN/VNI) 写 networks / networksegments 表 通知网络配置已变更 向节点上的 Agent 推送更新 在本机 OVS/Linux Bridge 建桥、配端口、打 tag 上报端口 binding 状态

这套"Server 写库 + MQ 异步通知 + Agent 在本机落地"就是后面所有 OpenStack 服务的通用套路。


8. ML2:Plugin 的核心机制(补充详解)

早期 Neutron 为每种网络设备写一个 Plugin,组合爆炸。ML2(Modular Layer 2) 把二层扩展拆成两个可插拔维度:

维度决定什么常见 Driver
Type Driver(类型驱动)网络"用哪种技术铺"——即网络类型local / flat / vlan / vxlan / gre / geneve
Mechanism Driver(机制驱动)网络"在哪种 vSwitch 上落地"linuxbridge / openvswitch / ovn / l2population
  • Type Driver 负责分配 segment ID(VLAN ID 或 VNI);
  • Mechanism Driver 负责把这个逻辑网络真正配到本机的网桥/OVS 流表上;
  • 除 L2 外,还有三类常用 Agent:L3 Agent(跑路由器 namespace)、DHCP Agent(给 VM 发 IP)、Metadata Agent(给 VM 提供元数据服务)。

教材实验环境的 ML2 配置(/etc/neutron/plugins/ml2/ml2_conf.ini)就是这一思想的直接体现:

[ml2]
type_drivers=geneve,flat          # Type Driver:只启用 Geneve 和 flat
tenant_network_types=geneve       # 租户网络默认用 Geneve 封装
mechanism_drivers=ovn            # Mechanism Driver:落地到 OVN
path_mtu=0
extension_drivers=port_security,qos

[securitygroup]
enable_security_group=True

[ml2_type_geneve]
max_header_size=38                # Geneve 最大头部 38 字节
vni_ranges=10:100                # VNI 分配范围 10~100

[ml2_type_flat]
flat_networks=*

[ovn]
ovn_nb_connection=tcp:192.168.108.10:6641   # 连 Northbound DB
ovn_sb_connection=tcp:192.168.108.10:6642   # 连 Southbound DB
ovn_metadata_enabled=True

9. 三种 vSwitch:Linux Bridge / OVS / OVN

对比项Linux BridgeOpen vSwitch(OVS)OVN
本质Linux 原生二层网桥企业级可编程虚拟交换机,靠流表转发OVS 的控制平面,面向 Neutron 的 SDN 控制器
配置方式brctl 等命令ovs-vsctl、OpenFlow 流表Northbound/Southbound 两个数据库,ovn-northd 翻译
支持隧道仅 VxLANVxLAN、GRE默认 Geneve(教材环境租户网络即 Geneve)
适合规模小环境中大型大规模、高性能、分布式
与 Neutron 关系Mechanism Driver 之一Mechanism Driver 之一Mechanism Driver = ovn,取代传统 L2/L3/DHCP Agent

9.1 OVN 架构(补充,实验环境重点)

OVN(Open Virtual Network)是 OVS 之上的虚拟网络控制器。它把"用户想要什么网络"和"每台机器具体怎么转发"分开存:

每个节点都跑一份

neutron-server(ML2 的 ovn mechanism driver)

Northbound DB(NB 库)
tcp:6641
存逻辑意图:LS 逻辑交换机 / LR 逻辑路由器 / ACL / NAT

ovn-northd
把 NB 的逻辑意图翻译成 SB 的物理流表

Southbound DB(SB 库)
tcp:6642
存 Logical Flow:每台机器具体怎么转发

ovn-controller
订阅 SB 库,把流表下发到本机 OVS

本机 OVS
br-int 集成网桥 / br-ex 外部网桥

  • Northbound DB(NB,6641):面向管理员的"逻辑世界"——逻辑交换机、逻辑路由器、ACL、NAT;
  • Southbound DB(SB,6642):面向每台机器的"转发世界"——具体的 Logical Flow;
  • ovn-northd:唯一的翻译官,把 NB 的意图编译成 SB 的流表;
  • ovn-controller:装在每个节点上(教材 openstack network agent list 里 controller 和 compute 节点各有一个 OVN Controller agent 和 OVN Metadata agent),订阅 SB 库并下发到本机 OVS;
  • OVN 用分布式 DHCP、分布式路由,不再需要在某台网络节点上跑集中式 L3 Agent;
  • Geneve 为何被 OVN 选中(补充):Geneve(Generic Network Virtualization Encapsulation)头部长度可变、可携带更多元数据(如服务链、QoS 标记),比 VXLAN(定长 UDP 头)更灵活;VNI 同样是 24 位。教材环境 max_header_size=38 即预留 38 字节 Geneve 头。

10. 三层世界:路由、外部网络、浮动 IP、NAT

二层解决"同网互通",跨网段、上外网就要靠虚拟路由器。

10.1 虚拟路由器(Router)

  • 给每个需要跨网段的子网在路由器上加一个接口(实验:openstack router add subnet 或 Dashboard"增加接口");
  • 路由器底层是 network namespace 里开了 IP forwarding 的一台 Linux,靠 iptables 做路由与 NAT;
  • 把两个隔离的 Network 各接一根网线到同一台 router,它们就能三层互通。

10.2 外部网络(External Network)

  • 默认租户网络是"内网",出不去真实世界;
  • 要让 VM 主动上外网,必须:① 建一个标记为 external 的外部网络(flat/vlan,接到 br-ex 和物理网卡 ens160,用真实能上网的地址);② 给路由器设置外部网关(openstack router set --external-gateway External);
  • 教材 OVN 实验里:外部网络 waiwang 在 192.168.108.0/24,路由器外网口拿到 192.168.108.185/24,并自动生成一条 snat 规则:external ip: 192.168.108.185, logical ip: 192.168.11.0/24。

10.3 浮动 IP(Floating IP)= 1:1 NAT

  • VM 内网地址(如 192.168.11.4)外部看不见;
  • 浮动 IP 从外部网络地址池里取一个真实可达 IP,1:1 绑定到 VM 的内网 Port 上;
  • 方向:
    • 出方向(SNAT):VM 主动访问外网时,源 IP 被改成浮动 IP(路由器外网口 IP);
    • 入方向(DNAT):外网主动访问浮动 IP 时,目的 IP 被改回 VM 的内网 IP;
  • ⚠️ 释放浮动 IP 前必须先解绑(解除绑定),不能直接释放一个还绑在端口上的浮动 IP(实验思考题答案)。

租户内网 192.168.11.0/24

出方向 SNAT:源地址改成 192.168.108.185

外部主动访问

目的地址改回 192.168.11.4

VM1
内网 IP 192.168.11.4

虚拟路由器 router1
内网口 192.168.11.1/24
外网口 192.168.108.185/24

外部网络 External
br-ex 接物理网卡 ens160

外部物理网络 192.168.108.0/24

浮动 IP 192.168.108.185
1 对 1 NAT(入方向 DNAT)


11. 安全:安全组 / FWaaS / LBaaS / VPNaaS

11.1 安全组(Security Group)——最常用

  • 本质:一组作用在 VM 网卡上的 iptables 规则;
  • ⚠️ 默认规则必背:default 安全组允许所有出口(egress)流量,但禁止所有入口(ingress)流量——除了来自同一安全组内部的流量;
  • 推论:VM 能主动往外发包,但外部(含浮动 IP)默认进不来。这就是"绑了浮动 IP 却 Ping 不通"的头号原因——要在安全组里放行入口 ICMP/TCP。
  • 一台 VM 可挂多个安全组,规则叠加生效。

11.2 FWaaS

  • 与安全组的区别:安全组管"进出 Instance",FWaaS 管"进出虚拟路由器"的包,同样用 iptables 实现。

11.3 LBaaS / VPNaaS

  • LBaaS:Grizzly 引入,默认 HAProxy,把访问流量按算法分摊到后端多台 VM;
  • VPNaaS:站点间加密隧道。教材提醒:OVN 后端下 packstack 提示 OVN 不支持 VPNaaS。

12. 计算节点完整数据通路(补充,把前面所有元件串起来)

一个 VM 的包从发出到出物理网卡,依次经过:

同节点、同网络

跨节点

跨网段 / 去外网

VM 内协议栈发出二层帧

TAP 网卡
(VM 的 vNIC)

VETH Pair

集成网桥 br-int(OVS)
或 Linux Bridge,流表打 VLAN/Geneve 头

查目的

直接送到目标 VM 的 TAP

br-tun / Geneve 隧道口
封装外层 UDP/IP 头

送 L3 Agent 所在 namespace
查路由表 + iptables NAT

物理网卡 ens
发往对端节点隧道端点

br-ex 外部网桥 → 物理网卡
接入真实外部网络

  • 封包/解包:跨节点的 Overlay 包在源节点被"套上"外层 UDP/IP 头(封装),到对端节点再拆出来(解封装),VM 完全无感;
  • MTU(补充):封装会额外占用头部字节,所以隧道网络的有效 MTU 要比物理网小(VXLAN/Geneve 通常减 50 字节左右),否则大包会被分片或丢弃;jumbo frame 场景尤其要注意。

13. 连通性实验:六条结论(必背)

这是整个 Neutron 实验的灵魂,也是面试/考试高频点。教材实验环境:Network_web_01(192.168.1.0/24,地址池 .100~.200)、Network_web_02(192.168.2.0/24)、路由器 Router_web、外部网络 External。

#场景结论
①两台 VM 在同一 Network默认互通(二层直连,如 .1.137 与 .1.140 互 Ping 通)
②两台 VM 在不同 Network默认隔离、不通(如 .1.137 与 .2.111 互 Ping 不通)
③不同 Network 的子网接到同一台路由器三层路由后可以互通(Router_web 加两个接口后 .1 与 .2 互 Ping 通)
④VM 主动访问外网需要给路由器接外部网络(外部网关),靠 SNAT 出去;没接外部网关则出不去
⑤外部主动访问 VM内网地址外部不可达,必须给 VM 绑浮动 IP
⑥绑了浮动 IP 外部仍不通多半是安全组 default 默认拒绝入口;放行入口后即通。释放浮动 IP 前必须先解绑

是

否

是

否

配了外部网关

没配外部网关

是

是

否

否

两个 VM 能否互通?

同一 Network?

结论① 默认互通

接同一台路由器?

结论③ 三层路由后互通

结论② 默认隔离

VM 主动访问外网?

结论④ SNAT 后可出外网

出不去

外部主动访问 VM?

绑了浮动 IP?

安全组放行入口?

结论⑤ 外部可访问

结论⑥ 被安全组拦截

无可达入口地址

13.1 实验里的三个思考题(必背答案)

  1. 创建子网后,端口列表里"网口固定 IP 为什么是 192.168.1.100"?
    答:这是 Neutron 自动为该子网创建的 DHCP 服务端口(以及网关端口)。子网创建后 DHCP Agent 需要一个地址在该子网里给 VM 发 IP;它会从配置的分配地址池(allocation pool,本例 192.168.1.100~200)里取第一个可用地址 192.168.1.100。所以列表里第一个"固定 IP"不是 VM 的,而是 DHCP 端口的。
  2. 绑了浮动 IP,外部还是 Ping 不通,可能原因?
    答:安全组 default 默认拒绝所有入口流量(只放内部互访)。需要新建安全组并放行入口 ICMP/TCP,再把 VM 的安全组从 default 换成新组。
  3. 若不先"解除绑定",能否直接释放已分配的浮动 IP?
    答:不能。 浮动 IP 还关联在端口上时必须先"解除绑定(unbind)“,解绑后才能"释放(delete)”,否则会因仍被占用而无法删除。

14. Dashboard 操作步骤(实验手册流程)

用 admin 登录 Dashboard,左侧导航"项目 → 网络"。

① 创建网络(含共享)

  1. “网络 → 网络拓扑” → “创建网络”;
  2. "网络"页签:名称 Network_web_01,勾选"共享的(shared)" → 下一项;
  3. "子网"页签:子网名 Subnet_web_01,网络地址 192.168.1.0/24,网关 192.168.1.1 → 下一项;
  4. "子网详情"页签:分配地址池起止 192.168.1.100, 192.168.1.200 → 创建;
  5. 到"网络"列表点进网络,可看"概览 / 子网 / 端口"三个页签;
  6. 同样方法建 Network_web_02(192.168.2.0/24,网关 .2.1,地址池 .2.100~.200)。

② 验证互通:发 2 台 VM 到 Network_web_01(如 .1.137、.1.140)控制台互 Ping → 通;再发 1 台到 Network_web_02(.2.111)→ 与 .1.137 Ping 不通。

③ 创建路由器:“网络 → 路由” → “新建路由” Router_web → 进入路由"接口"页签 → “增加接口”,分别把 Subnet_web_01、Subnet_web_02 接进来(状态"运行中")→ 此时 .1 与 .2 互 Ping 通。

④ 创建外部网络:管理员"网络 → 网络"建 external 网络。“物理网络填什么取决于配置文件”,外部地址要用真实能上网的地址(本实验 br-ex 接 ens160,外部网段 192.168.108.0/24)。

⑤ 管理浮动 IP:

  1. “网络 → 浮动 IP” → “分配 IP 给项目”,资源池选外部网络 External → “分配 IP”;
  2. 到实例列表,对 VM “Actions → 绑定浮动 IP”,选刚分配的浮动 IP、待连接端口选该 VM 内网口 → 关联;
  3. 若外部仍 Ping 不通 → 查安全组;
  4. 再建一个浮动 IP(状态 Down)→ “关联"到另一台 VM(状态变"运行中”)→ “解除绑定” → 勾选后"释放浮动 IP"。

⑥ 创建安全组:

  1. 看 VM 当前安全组是 default;“网络 → 安全组” → 对 default “管理规则”,可见默认允许所有出口、禁止除内部外入口;
  2. “创建安全组” SG_web → “添加规则”:① 协议"所有 ICMP 规则"、方向"入口"、远程 CIDR 0.0.0.0/0;② 再按相同方式加一条 All TCP 入口;
  3. 到实例"编辑安全组":移除 default、添加 SG_web → 保存;
  4. 再从外部 Ping 浮动 IP → 通;SSH 登录(cirros 用户,密码 gocubsgo)验证。

15. CLI 全套命令(实验手册)

先导入环境变量:source keystonerc_admin(实验里还先建了 Img_cli 镜像和 Flavor_cli 规格)。

# ========== 1. 创建网络(--share 表示共享)与子网 ==========
openstack network create --share Network_cli_01
openstack network list

openstack subnet create --network Network_cli_01 \
  --subnet-range 192.168.3.0/24 \
  --allocation-pool start=192.168.3.100,end=192.168.3.200 \
  --gateway 192.168.3.1 Subnet_cli_01
openstack subnet list
openstack port list --network Network_cli_01 --long     # 看网口(含自动建的 DHCP 端口)

# 第二个网络
openstack network create --share Network_cli_02
openstack subnet create --network Network_cli_02 \
  --subnet-range 192.168.4.0/24 \
  --allocation-pool start=192.168.4.100,end=192.168.4.200 \
  --gateway 192.168.4.1 Subnet_cli_02

# ========== 2. 发实例并验证互通 ==========
openstack server create --image Img_cli --flavor Flavor_cli \
  --network Network_cli_01 --min 2 --max 2 Instance_cli_test
openstack server list
openstack server create --image Img_cli --flavor Flavor_cli \
  --network Network_cli_02 Instance_cli_test-3

# ========== 3. 创建路由器 + 接外部网关 + 接内网子网 ==========
openstack router create --project admin Router_cli
openstack router list
openstack router set --external-gateway External Router_cli     # 接外部网关
openstack router add subnet Router_cli Subnet_cli_01             # 接内网子网
openstack router add subnet Router_cli Subnet_cli_02
openstack router show Router_cli | grep interfaces_info         # 看接口

# ========== 4. 浮动 IP:分配 / 绑定 / 解绑 / 释放 ==========
openstack port list --server Instance_cli_test-3               # 查 VM 的 port ID
openstack floating ip create --port PORT_ID External              # 一步到位:建并绑到端口
openstack floating ip list --long

openstack floating ip create External                            # 先只建不绑(状态 Down)
openstack server add floating ip   Instance_cli_test-1 FLOATING_IP
openstack server remove floating ip Instance_cli_test-1 FLOATING_IP   # 先解绑
openstack floating ip delete FLOATING_IP                         # 解绑后才能释放
openstack floating ip list

# ========== 5. 安全组:查看 / 创建 / 加规则 / 挂到 VM ==========
openstack server show Instance_cli_test-3                       # 看当前安全组与项目 ID
openstack security group list --project PROJECT_ID
openstack security group rule list | grep SECURITY_GROUP_ID
openstack security group rule show SECURITY_GROUP_RULE_ID

openstack security group create SG_cli
openstack security group rule create --protocol icmp --ingress --remote-ip 0.0.0.0/0 SG_cli
openstack security group rule create --protocol tcp  --ingress --remote-ip 0.0.0.0/0 SG_cli
openstack security group rule list | grep SECURITY_GROUP_ID

openstack server remove security group Instance_cli_test-3 default
openstack server add    security group Instance_cli_test-3 SG_cli
openstack server show Instance_cli_test-3 | grep security_groups

记忆点:建网络 --share;建子网核心三件套 --subnet-range / --allocation-pool / --gateway;路由器"先 set --external-gateway 再接 router add subnet";浮动 IP"先 add(绑)后 remove(解)再 delete(释放)";安全组规则 --protocol icmp|tcp --ingress --remote-ip 0.0.0.0/0。


16. OVN 实验环境详解(教材实机输出)

实验后端是 OVN(不是传统 openvswitch agent)。先确认:

openstack network agent list
# 看到的是:
#   OVN Controller agent   compute/controller   UP   ovn-controller
#   OVN Metadata agent     compute/controller   UP   neutron-ovn-metadata-agent

创建外部网络 waiwang(192.168.108.0/24)、内网 neiwang-1(192.168.11.0/24)、路由器 router1、两台 VM(192.168.11.4、192.168.11.169)后,用 ovn-nbctl show 看 NB 库,输出怎么读:

switch 9e269a0c-... (neutron-c5a25fa7...) (aka neiwang-1)     ← 一个逻辑交换机 = 一个 Network
    port 0e42719e-...
        addresses: ["fa:16:3e:33:e8:8b 192.168.11.4"]        ← localport:VM 的 VIF,带 MAC+IP
    port 9da6f7af-...
        type: router
        router-port: lrp-9da6f7af-...                        ← 这个口接路由器

switch e69d7e37-... (neutron-e79063ae...) (aka waiwang)      ← 外部网络
    port provnet-50a84802-...
        type: localnet
        addresses: ["unknown"]                               ← localnet:对接物理网(provnet)

router 9374d9e7-... (neutron-a75adc8f...) (aka router1)      ← 一个逻辑路由器
    port lrp-9da6f7af-...
        mac: "fa:16:3e:78:18:6c"
        networks: ["192.168.11.1/24"]                         ← 内网口
    port lrp-c0354999-...
        mac: "fa:16:3e:82:b8:23"
        networks: ["192.168.108.185/24"]                     ← 外网口
        gateway chassis: [46cd64c9-...]                     ← 这台 chassis 上跑网关
    nat d6fae190-...
        external ip: "192.168.108.185"                       ← SNAT 出口地址
        logical ip: "192.168.11.0/24"
        type: "snat"                                        ← 出方向源地址转换

读法总结:

  • switch ... (aka 名字) = 一个 Neutron Network(逻辑交换机);
  • 端口类型三种:localport(VM 网卡,带 MAC IP)、localnet(对接物理网的 provnet)、type: router(这个口连到逻辑路由器);
  • router 段列出路由器每个口的 MAC/网段,以及一条 nat ... type: snat(内网网段出网时源地址改成外网口 IP 192.168.108.185);
  • MAC 前缀 fa:16:3e 是 QEMU/KVM 给虚机分配的固定 OUI。

17. 排障思路与常用命令(补充)

网络不通时,按"从里到外、从逻辑到物理"的顺序查:

排查层面命令 / 位置看什么
逻辑资源openstack network list / show、openstack subnet list、openstack port list --server <vm>、openstack router show、openstack floating ip list、openstack security group rule list网络/子网/端口/路由器接口/浮动 IP 是否齐全、安全组是否放行入口
路由器 namespaceip netns list、ip netns exec qrouter-<id> ip addr、ip netns exec qrouter-<id> iptables -t nat -L -n传统 L3 路由器是否在 namespace 里、SNAT/DNAT 规则是否生成;DHCP 看 ip netns exec qdhcp-<id>
OVS 落地ovs-vsctl show、ovs-ofctl dump-flows br-intbr-int/br-ex 是否存在、端口接对没、流表是否下发
OVN 落地ovn-nbctl show(逻辑意图)、ovn-sbctl show(chassis 与流表)、ovn-nbctl lr-list / ls-listNB/SB 是否一致、ovn-controller 是否把 chassis 上报
抓包验证tcpdump -i <桥/网卡> -nn在 TAP、br-int、物理网卡上逐段抓,定位包断在哪一跳
日志/var/log/neutron/(ovn 环境看 /var/log/openvswitch/、ovn-controller 日志)agent 报错、DB 连接、流表下发失败

通用排查口诀:先看安全组(入口默认拒)→ 再看浮动 IP 绑没绑/解没解绑 → 再看路由器接没接子网、配没配外部网关 → 最后上 namespace/ovs/ovn 和 tcpdump。


18. 易混点对比表(考前速扫)

易混点区别
Network vs SubnetNetwork = 二层广播域;Subnet = IP 地址段。一个 Network 下多个 Subnet CIDR 不能重叠
CIDR 重叠 vs IP 重叠同一 Network 判的是 CIDR 是否重叠,不是具体 IP;不同 Network 之间 CIDR/IP 都可重叠
VLAN vs VXLAN vs GREVLAN=802.1Q tag 裸二层;VXLAN=二层包封装成 UDP;GRE=封装成 IP 包。Linux Bridge 只支持 VXLAN
local vs flatlocal=本节点隔离(测试用);flat=无 tag、可跨节点
Security Group vs FWaaSSG 过滤进出 Instance;FWaaS 过滤进出虚拟路由器;都用 iptables
SNAT vs DNATSNAT=出方向改源地址(VM 上外网);DNAT=入方向改目的地址(外部访问浮动 IP 对应的 VM)
解绑 vs 释放浮动 IP先 unbind(remove)才能 delete(释放),占用中不能直接删
OVS vs OVNOVS 是软件交换机(数据面);OVN 是它的 SDN 控制器(控制面,NB/SB 双库)
Type Driver vs Mechanism DriverType Driver 选网络类型(vlan/vxlan/geneve…);Mechanism Driver 选落地设备(linuxbridge/ovs/ovn)
DHCP 端口 vs VM 端口子网里 .100 那种"固定 IP"往往是自动建的 DHCP 端口,不是某台 VM

19. 进阶补充(教材点到、扩展了解)

以下为理解教材与生产环境所需的补充概念,考试以教材正文为主,这里用于拓宽认知。

  • allocation pool(地址池):子网里真正拿来给 VM/DHCP 动态分配的 IP 区间(教材实验 start=.100,end=.200),网关、DHCP 端口通常不在池内或单独占用。
  • host route(主机路由):子网可下发额外静态路由(--host-route),让 VM 自动学到去特定网段的路由。
  • metadata 服务:VM 通过 169.254.169.254 这个保留地址向 Metadata Agent 请求自己的元数据(注入的密码、密钥、userdata)。
  • port security(端口安全):默认开启,校验进出 Port 的源 MAC/IP 与 Port 一致,防止欺骗。
  • allowed-address-pairs:在端口上额外放行一组允许的 MAC/IP 对,常用于高可用(如 keepalived VIP 漂移)场景。
  • DVR(分布式虚拟路由,补充):把 L3 路由从集中式网络节点下沉到各计算节点,东西向流量不再绕行中心路由器,解决单点与瓶颈。
  • L3 HA(补充):用 VRRP 在多台网络节点间做主备,一台挂了另一台接管虚拟路由。
  • QoS(补充):教材 DB 里能看到 qos_policies、qos_bandwidth_limit_rules 等表,支持端口/浮动 IP 的带宽限速。
  • Trunk(补充):一个主 Port 下挂多个 subport,支持容器嵌套/子接口。
  • SR-IOV(补充):把物理网卡虚拟成多个 VF 直接直通给 VM,绕开 OVS 软转发,性能接近裸金属。
  • BGP(补充):DB 里 bgp_peers/bgp_speakers 表对应 BGP 动态路由,用于把租户网段宣告到外部网络。

本篇小结

  • Neutron 的目标是 “网络即服务(NaaS)”,基于 SDN 做网络虚拟化,底层复用 Linux 的 TAP/TUN/VETH/namespace/iptables/网桥;
  • 五大功能:二层交换、三层路由、负载均衡(LBaaS,Grizzly 引入,默认 HAProxy)、防火墙(安全组 + FWaaS)、VPN;
  • 三大资源:Network(隔离二层广播域)/ Subnet(IP 段,同 Network 下 CIDR 不重叠)/ Port(MAC+IP);关系链 Project 1:m Network 1:m Subnet 1:m Port 1:1 VIF m:1 Instance;
  • 五种网络类型:local(单机测试)/ flat(无 tag 跨节点)/ vlan(802.1Q,应用最广)/ vxlan(VNI 24 位、UDP 封装)/ gre(IP 封装);
  • 架构:neutron-server(API)→ Plugin(核心 ML2 = Type Driver + Mechanism Driver)→ Agent → network provider,靠 RabbitMQ 通信、MySQL(171 张表) 存状态;
  • vSwitch 三件套:Linux Bridge(只支持 VXLAN)、OVS(流表)、OVN(NB/SB 双库 + ovn-northd + ovn-controller,默认 Geneve);
  • 跨网段/上外网靠虚拟路由器(namespace 实现,故可重叠 IP);上外网要接外部网关(SNAT);外部访问 VM 靠浮动 IP(1:1 NAT,含入方向 DNAT);
  • 默认安全组允许所有出口、拒绝除内部外入口——这是"绑了浮动 IP 还不通"的头号原因;
  • 连通性六条结论与三个思考题(DHCP 端口占 .100、浮动 IP 不通查安全组、释放前先解绑)必须背熟。

重点速记

必背项内容
定位NaaS,基于 SDN 的网络虚拟化
五大功能二层交换 / 三层路由 / LBaaS / 防火墙(SG+FWaaS)/ VPN
LBaaSGrizzly 引入,默认 HAProxy
TAP vs TUNTAP 二层传以太网帧;TUN 三层传 IP 包
路由器为何能重叠 IP用 network namespace 实现,独立路由表
Network隔离的二层广播域
Subnet 约束同 Network 下 CIDR 不能重叠;不同 Network 可重叠
PortMAC + IP,绑到 VIF
关系链Project 1:m Network 1:m Subnet 1:m Port 1:1 VIF m:1 Instance
网络类型local / flat / vlan(802.1Q) / vxlan(VNI 24 位,UDP) / gre(IP 封装)
Linux Bridge 隧道只支持 VXLAN
ML2 两维度Type Driver(网络类型)+ Mechanism Driver(落地设备)
架构组件neutron-server / Plugin(ML2) / Agent / network provider / Queue(RabbitMQ) / DB(MySQL)
外部网络 + 浮动 IP1:1 NAT;出方向 SNAT,入方向 DNAT
默认安全组允许所有出口,拒绝除内部外入口
浮动 IP 删除顺序先解绑(remove)再释放(delete)
OVN 端口类型localport(VM)/ localnet(接物理网)/ type: router
OVN 双库端口NB 库 tcp:6641,SB 库 tcp:6642
OVN 隧道Geneve(max_header_size=38,vni_ranges=10:100)
OVN 不支持VPNaaS(packstack 提示)
配置/日志目录/etc/neutron/、/var/log/neutron/(ovn 环境看 /var/log/openvswitch/)

自测题(附答案)

Q1. Neutron 的设计目标是什么?它基于什么思想实现?
答:实现"网络即服务(NaaS)",设计上遵循基于 SDN(软件定义网络)实现网络虚拟化,底层充分利用 Linux 的网络技术。

Q2. Neutron 提供哪五大网络功能?分别靠什么实现?
答:二层交换(Linux Bridge/OVS,支持 VLAN/VXLAN/GRE)、三层路由(IP forwarding + iptables,实现路由与 NAT)、负载均衡 LBaaS(Grizzly 引入,默认 HAProxy)、防火墙(Security Group 过滤进出 Instance、FWaaS 过滤进出路由器,均用 iptables)、VPN(VPNaaS)。

Q3. TAP 和 TUN 有什么区别?
答:TAP 工作在二层、收发以太网帧,常直接当 VM 网卡;TUN 工作在三层、收发 IP 包,用于隧道封装/解封装。

Q4. 为什么不同租户的子网可以用同一个 CIDR 而不冲突?
答:因为 Neutron 的虚拟路由器用 Linux network namespace 实现,每个路由器有独立的协议栈和路由表;不同路由器的路由表互不相干,所以相同网段能各自被正常路由。

Q5. 同一 Network 下两个 Subnet,一个 10.10.1.0/24(.1~.50),另一个 10.10.1.0/24(.51~.100),合法吗?为什么?
答:不合法。同一 Network 下判断的是 CIDR 是否重叠,两者 CIDR 都是 10.10.1.0/24,重叠了,即使具体 IP 不重叠也不行。

Q6. 对比 vlan、vxlan、gre。
答:vlan 用 802.1Q tag、裸二层、应用最广;vxlan 是 Overlay,用 24 位 VNI 区分网络,把二层包封装成 UDP 包在三层传;gre 类似 vxlan,但用 IP 包(协议 47)而非 UDP 封装。

Q7. 写出 Neutron 六大组件及职责。
答:neutron-server(对外 API、调 Plugin)、Plugin(维护逻辑网络状态、调 Agent,核心 ML2)、Agent(在 network provider 上落地网络功能)、network provider(Linux Bridge/OVS/物理交换机)、Queue(RabbitMQ 通信)、Database(MySQL,存 Network/Subnet/Port/Router)。

Q8. ML2 的 Type Driver 和 Mechanism Driver 分别决定什么?
答:Type Driver 决定网络用哪种技术铺(local/flat/vlan/vxlan/gre/geneve);Mechanism Driver 决定网络在哪种 vSwitch 上落地(linuxbridge/openvswitch/ovn/l2population)。

Q9. 写出连通性六条结论。
答:① 同网络默认互通;② 不同网络默认隔离;③ 不同网络接同一台路由器后互通;④ VM 主动上外网需配外部网关(SNAT);⑤ 外部主动访问 VM 需绑浮动 IP;⑥ 绑了浮动 IP 仍不通多为安全组拦截,释放浮动 IP 前必须先解绑。

Q10. 为什么子网端口列表里第一个固定 IP 往往是 .100?
答:那是 Neutron 自动为该子网创建的 DHCP 服务端口,从地址池(如 .100~.200)取第一个可用地址,不是某台 VM。

Q11. 默认安全组规则是什么?为什么绑了浮动 IP 外部仍 Ping 不通?
答:默认允许所有出口、拒绝除安全组内部外的所有入口。外部进不来是因为 default 拒绝入口 ICMP/TCP,需新建安全组放行入口规则并挂到 VM 上。

Q12. 浮动 IP 能不能直接 delete?正确顺序是什么?
答:不能,占用中无法释放。正确顺序:先 openstack server remove floating ip(解绑),再 openstack floating ip delete(释放)。

Q13. 浮动 IP 背后的 NAT 方向是怎样的?
答:出方向 SNAT——VM 访问外网时源地址改成浮动 IP;入方向 DNAT——外部访问浮动 IP 时目的地址改回 VM 内网 IP,即 1:1 NAT。

Q14. OVN 的 NB 库和 SB 库分别存什么?端口 6641/6642 对应哪个?
答:NB 库(6641)存逻辑意图(逻辑交换机/路由器、ACL、NAT);SB 库(6642)存面向各节点的 Logical Flow;ovn-northd 把 NB 翻译成 SB,ovn-controller 在每台节点上读 SB 并下发到本机 OVS。

Q15. ovn-nbctl show 里 localport、localnet、type: router 三种端口分别是什么?
答:localport 是 VM 的 VIF(带 MAC 和 IP);localnet(provnet)对接外部物理网络;type: router 表示这个交换机口连到逻辑路由器上。

Q16. OVN 为什么用 Geneve?实验里租户网络封装是什么?
答:Geneve 头部可变、可携带更多元数据,比 VXLAN 更灵活;实验 tenant_network_types=geneve,租户网络用 Geneve 封装(max_header_size=38,vni_ranges=10:100)。

Q17. 网络不通,你的排查顺序是什么?
答:先查安全组(入口默认拒)→ 再查浮动 IP 是否绑定/是否未解绑 → 再查路由器是否接了子网、是否配了外部网关 → 最后用 ip netns、ovs-vsctl show、ovn-nbctl/sbctl、tcpdump 和 /var/log/neutron(ovn 看 openvswitch 日志)定位。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐