07 · OpenStack的网络管理 Neutron
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 实验 → 排障 → 进阶补充"的顺序,由浅入深把这张网彻底讲透。
学习目标:
- 说清 Neutron 的定位:NaaS、基于 SDN 的网络虚拟化,它提供二层交换、三层路由、负载均衡、防火墙、VPN 五大能力;
- 分清物理网络与虚拟网络的对应关系(Switch↔vSwitch、NIC↔vNIC),讲清 TAP / TUN / VETH Pair / network namespace / Linux Bridge / OVS 各自是干什么的;
- 吃透三大核心资源 Network / Subnet / Port 的定义、约束(CIDR 重叠判定)与
Project 1:m Network 1:m Subnet 1:m Port 1:1 VIF m:1 Instance关系链;- 对比 local / flat / vlan / vxlan / gre 五种网络类型,记住 VLAN tag、VXLAN 的 VNI(24 位)与 UDP 封装、GRE 的 IP 封装;
- 画出 Neutron 架构:Neutron Server → Plugin(核心是 ML2)→ Agent → network provider,靠 RabbitMQ 通信、MySQL 存状态;
- 讲通"外部网络 + 浮动 IP = 1:1 NAT",理解 SNAT 与 DNAT 的方向;
- 背下连通性实验的六条结论,并能解释三个思考题(端口固定 IP、浮动 IP 不通、能否直接释放);
- 掌握 Dashboard 与 CLI 创建网络/子网/路由器/浮动 IP/安全组的全套命令;
- 读懂 OVN 实验环境:
ovn-nbctl show输出、NB/SB 双库 6641/6642、Geneve 封装。
文章目录
- 07 · 网络管理 Neutron
- 1. 为什么需要 Neutron:从手工网络到 SDN
- 2. 物理网络 vs 虚拟网络:一张对照表
- 3. Linux 网络虚拟化四大件(Neutron 的地基)
- 4. Neutron 的五大功能
- 5. 三大核心资源:Network / Subnet / Port
- 6. 五种网络类型对比(必背表格)
- 7. Neutron 架构与组件
- 8. ML2:Plugin 的核心机制(补充详解)
- 9. 三种 vSwitch:Linux Bridge / OVS / OVN
- 10. 三层世界:路由、外部网络、浮动 IP、NAT
- 11. 安全:安全组 / FWaaS / LBaaS / VPNaaS
- 12. 计算节点完整数据通路(补充,把前面所有元件串起来)
- 13. 连通性实验:六条结论(必背)
- 14. Dashboard 操作步骤(实验手册流程)
- 15. CLI 全套命令(实验手册)
- 16. OVN 实验环境详解(教材实机输出)
- 17. 排障思路与常用命令(补充)
- 18. 易混点对比表(考前速扫)
- 19. 进阶补充(教材点到、扩展了解)
- 本篇小结
- 重点速记
- 自测题(附答案)
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 设备
| 对比项 | TAP | TUN |
|---|---|---|
| 工作层级 | 二层 | 三层 |
| 收发内容 | 以太网帧(带 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 四大件如何拼到一起
4. Neutron 的五大功能
Neutron 为整个 OpenStack 提供网络支持,它是一个灵活框架——具体用开源还是商业软件来实现,靠配置插件决定。
| 功能 | 英文 | 实现要点(必背) |
|---|---|---|
| 二层交换 | Switching | VM 通过虚拟交换机连上虚拟二层网。vSwitch 可选 Linux Bridge、OVS;网络类型支持传统 VLAN 与 Overlay 的 VxLAN / GRE(Linux Bridge 只支持 VxLAN) |
| 三层路由 | Routing | Neutron 的 router 让不同网段的 Instance 互通;底层靠 IP forwarding + iptables 实现路由与 NAT |
| 负载均衡 | Load Balancing | LBaaS(Load-Balancing-as-a-Service),Grizzly 版本首次引入,把流量分发到多台 Instance;多种实现以 Plugin 接入,默认 Plugin 是 HAProxy |
| 防火墙 | Firewalling | 两种方式:① Security Group 用 iptables 限制进出 Instance 的包;② FWaaS 用 iptables 限制进出虚拟路由器的包 |
| VPN | VPNaaS | 站点到站点 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 有独立路由表:
- 若两个重叠子网走同一个 router,按配置只有其中一个会被路由;
- 若走不同 router(各自 namespace、各自路由表),两个子网都能被正常路由,互不干扰。
- 不会! 因为 Neutron 的 router 是用 Linux network namespace 实现的,每个 router 有独立路由表:
5.3 Port —— 虚拟交换机上的一个端口
- Port 可以看作虚拟交换机上的一个端口,上面定义了 MAC 地址 + IP 地址;
- 当 Instance 的虚拟网卡 VIF(Virtual Interface) 绑定到 Port 时,Port 把 MAC 和 IP 分配给 VIF;
- Subnet 与 Port 是 1 对多:一个 Port 必须属于某个 Subnet;一个 Subnet 可以有多个 Port。
5.4 关系链(必背一句话)
教材原文关系: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 互通,可跨多节点 |
| vlan | 802.1Q tag | ✅ | 无(裸二层,带 tag) | 应用最广泛的网络类型 | 同一 vlan 内互通;不同 vlan 是二层广播域,只能通过 router 三层通信 |
| vxlan | 逻辑隔离(VNI,24 位) | ✅ | 把二层包封装成 UDP 在三层传输 | Overlay 大二层 | 通过唯一的 segmentation ID(VNI)区分不同 vxlan 网络,克服 VLAN 和物理基础设施限制 |
| gre | 逻辑隔离 | ✅ | 用 IP 包(协议号 47)封装,而非 UDP | Overlay 大二层 | 与 vxlan 类似,主要区别在于封装层:vxlan 用 UDP,gre 用 IP |
补充:VLAN 标签为 12 位(可用 1~4094);VXLAN 的 VNI 也是 24 位空间,远大于 VLAN;VXLAN 默认 UDP 端口 4789。
7. Neutron 架构与组件
和 OpenStack 其他服务一样,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 一次"创建网络"请求的时序(理解协作)
这套"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 Bridge | Open vSwitch(OVS) | OVN |
|---|---|---|---|
| 本质 | Linux 原生二层网桥 | 企业级可编程虚拟交换机,靠流表转发 | OVS 的控制平面,面向 Neutron 的 SDN 控制器 |
| 配置方式 | brctl 等命令 | ovs-vsctl、OpenFlow 流表 | Northbound/Southbound 两个数据库,ovn-northd 翻译 |
| 支持隧道 | 仅 VxLAN | VxLAN、GRE | 默认 Geneve(教材环境租户网络即 Geneve) |
| 适合规模 | 小环境 | 中大型 | 大规模、高性能、分布式 |
| 与 Neutron 关系 | Mechanism Driver 之一 | Mechanism Driver 之一 | Mechanism Driver = ovn,取代传统 L2/L3/DHCP Agent |
9.1 OVN 架构(补充,实验环境重点)
OVN(Open Virtual Network)是 OVS 之上的虚拟网络控制器。它把"用户想要什么网络"和"每台机器具体怎么转发"分开存:
- 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(实验思考题答案)。
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 的包从发出到出物理网卡,依次经过:
- 封包/解包:跨节点的 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 前必须先解绑 |
13.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 端口的。 - 绑了浮动 IP,外部还是 Ping 不通,可能原因?
答:安全组 default 默认拒绝所有入口流量(只放内部互访)。需要新建安全组并放行入口 ICMP/TCP,再把 VM 的安全组从 default 换成新组。 - 若不先"解除绑定",能否直接释放已分配的浮动 IP?
答:不能。 浮动 IP 还关联在端口上时必须先"解除绑定(unbind)“,解绑后才能"释放(delete)”,否则会因仍被占用而无法删除。
14. Dashboard 操作步骤(实验手册流程)
用 admin 登录 Dashboard,左侧导航"项目 → 网络"。
① 创建网络(含共享)
- “网络 → 网络拓扑” → “创建网络”;
- "网络"页签:名称
Network_web_01,勾选"共享的(shared)" → 下一项; - "子网"页签:子网名
Subnet_web_01,网络地址192.168.1.0/24,网关192.168.1.1→ 下一项; - "子网详情"页签:分配地址池起止
192.168.1.100, 192.168.1.200→ 创建; - 到"网络"列表点进网络,可看"概览 / 子网 / 端口"三个页签;
- 同样方法建
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:
- “网络 → 浮动 IP” → “分配 IP 给项目”,资源池选外部网络 External → “分配 IP”;
- 到实例列表,对 VM “Actions → 绑定浮动 IP”,选刚分配的浮动 IP、待连接端口选该 VM 内网口 → 关联;
- 若外部仍 Ping 不通 → 查安全组;
- 再建一个浮动 IP(状态 Down)→ “关联"到另一台 VM(状态变"运行中”)→ “解除绑定” → 勾选后"释放浮动 IP"。
⑥ 创建安全组:
- 看 VM 当前安全组是
default;“网络 → 安全组” → 对 default “管理规则”,可见默认允许所有出口、禁止除内部外入口; - “创建安全组”
SG_web→ “添加规则”:① 协议"所有 ICMP 规则"、方向"入口"、远程 CIDR0.0.0.0/0;② 再按相同方式加一条 All TCP 入口; - 到实例"编辑安全组":移除 default、添加 SG_web → 保存;
- 再从外部 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 是否齐全、安全组是否放行入口 |
| 路由器 namespace | ip 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-int | br-int/br-ex 是否存在、端口接对没、流表是否下发 |
| OVN 落地 | ovn-nbctl show(逻辑意图)、ovn-sbctl show(chassis 与流表)、ovn-nbctl lr-list / ls-list | NB/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 Subnet | Network = 二层广播域;Subnet = IP 地址段。一个 Network 下多个 Subnet CIDR 不能重叠 |
| CIDR 重叠 vs IP 重叠 | 同一 Network 判的是 CIDR 是否重叠,不是具体 IP;不同 Network 之间 CIDR/IP 都可重叠 |
| VLAN vs VXLAN vs GRE | VLAN=802.1Q tag 裸二层;VXLAN=二层包封装成 UDP;GRE=封装成 IP 包。Linux Bridge 只支持 VXLAN |
| local vs flat | local=本节点隔离(测试用);flat=无 tag、可跨节点 |
| Security Group vs FWaaS | SG 过滤进出 Instance;FWaaS 过滤进出虚拟路由器;都用 iptables |
| SNAT vs DNAT | SNAT=出方向改源地址(VM 上外网);DNAT=入方向改目的地址(外部访问浮动 IP 对应的 VM) |
| 解绑 vs 释放浮动 IP | 先 unbind(remove)才能 delete(释放),占用中不能直接删 |
| OVS vs OVN | OVS 是软件交换机(数据面);OVN 是它的 SDN 控制器(控制面,NB/SB 双库) |
| Type Driver vs Mechanism Driver | Type 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 |
| LBaaS | Grizzly 引入,默认 HAProxy |
| TAP vs TUN | TAP 二层传以太网帧;TUN 三层传 IP 包 |
| 路由器为何能重叠 IP | 用 network namespace 实现,独立路由表 |
| Network | 隔离的二层广播域 |
| Subnet 约束 | 同 Network 下 CIDR 不能重叠;不同 Network 可重叠 |
| Port | MAC + 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) |
| 外部网络 + 浮动 IP | 1: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 日志)定位。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)