来源:《OpenStack 实验手册》第 6 章 + 《OpenStack 管理手册》OVN 网络整体实验。
这篇把网络管理的实操一次走完:先用 Dashboard 把「建网络 → 验证隔离 → 连路由 → 上外网 → 绑浮动 IP → 配安全组」走通,再用 CLI 把同一套流程复现一遍,最后看 OVN 下的现象。理论篇见第 1 篇。

一、实验设计:三个结论撑起全场
整个实验围绕三个结论展开,先记住,后面的每一步都是在验证它们:
- 同一网络中的虚拟机实例默认可以互通;
- 不同网络间的虚拟机实例默认无法互通(二层隔离);
- 不同网络接入同一个路由器后可以互通(三层路由)。
前置准备(管理员身份):创建镜像 Img_web / Img_cli、实例规格 Flavor_web / Flavor_cli(步骤同镜像/计算管理实验)。
二、Dashboard:创建网络与子网
用 admin 登录 Dashboard,「项目 > 网络 > 网络拓扑」,单击下方「创建网络」:
- 网络页签 :网络名称
Network_web_01,勾选「共享的」,其他默认; - 子网页签 :子网名称
Subnet_web_01,网络地址192.168.1.0/24,网关 IP192.168.1.1; - 子网详情页签 :分配地址池起止
192.168.1.100, 192.168.1.200。
创建后到「项目 > 网络 > 网络」列表点进 Network_web_01,能看到概览 / 子网 / 端口三个页签------端口页签里已经有一个网口,固定 IP 是 192.168.1.2(网关侧端口从 2 开始分配,实例从地址池 100 起拿)。
参考上面步骤再建一套 Network_web_02 / Subnet_web_02(192.168.2.0/24,池 100~200)。
三、验证一:同网互通,异网隔离
发放 2 个实例:名称 Instance_web_test、数量 2、启动源 Image(不建新卷)、镜像 Img_web、规格 Flavor_web、网络只选 Network_web_01。
记录两个 IP(如 192.168.1.137 / 192.168.1.140),进两台实例的控制台互 ping------通。结论 1 到手。
再发一台 Instance_web_test-3,唯一区别是网络选 Network_web_02 。控制台里与 test-1 互 ping------不通。看网络拓扑图:两台实例分属两个独立网络,中间没有路由。结论 2 到手。
四、验证二:路由器打通异网
「项目 > 网络 > 路由」→「新建路由」:名称 Router_web,其他默认。
点进 Router_web →「接口」页签 →「增加接口」:
- 先选子网
Subnet_web_01 (192.168.1.0/24)提交; - 再加
Subnet_web_02 (192.168.2.0/24)。
接口状态都为「运行中」后,网络拓扑图上两个网络被 Router_web 连在一起。再互 ping test-1 与 test-3------通了。结论 3 到手。
五、外部网络与浮动 IP
5.1 创建外部网络
此时实例还出不了外网。外部网络是管理员侧的操作:「管理员 > 网络 > 网络」→ 创建网络:
- 名称按环境惯例(实验里叫
External,界面显示资源池名),勾选「外部网络」; - 物理网络填什么取决于配置文件 (ml2 的 flat_networks 配置),本环境填
physnet1这类值; - 子网地址填真实能上网的网段(取决于宿主机网络配置),比如 192.168.108.0/24。
然后「项目 > 网络 > 路由」→ Router_web → 设置外部网关指向 External(CLI 对应 router set --external-gateway)。拓扑图上路由器接上了外部网络,实例可以访问外网了(SNAT)。
5.2 浮动 IP:从「能出去」到「能进来」
在外部服务器上 ping 实例的固定 IP------不通 :Network_web_02 是 OpenStack 内部网络,外部要访问实例必须通过外部网络分配浮动 IP。
「项目 > 网络 > 浮动 IP」→「分配 IP 给项目」→ 资源池选 External → 分配。然后到实例列表「绑定浮动 IP」选刚分配的地址关联。
绑定后从外部 ping------还是不通。这里就是实验的连环坑,两个检查点按顺序查:

检查点 1:浮动 IP 的状态。 浮动 IP 列表里看到状态是 Down------只创建、没关联成功。重新关联到实例端口,状态变为「运行中/Active」才算生效。验证小实验:把浮动 IP 关联到 test-1 再解绑、释放,观察状态随操作变化。
检查点 2:安全组入口规则。 状态对了还不通,就是 default 安全组把入口流量拦了(见下一节)。
5.3 安全组:放行入口流量
先看现状:实例默认挂的是 default 安全组,「项目 > 网络 > 安全组」→ default →「管理规则」:允许所有出口流量,但入口除内部来源外全禁------外部 ping 不进来是设计使然。
自建安全组放行:
- 「创建安全组」:名称
SG_web; - 「添加规则」:规则「所有 ICMP 规则」、方向「入口」、远程「CIDR」
0.0.0.0/0; - 再加一条「所有 TCP 规则」、入口、
0.0.0.0/0(SSH 用); - 到实例 test-3「编辑安全组」:移除 default,添加 SG_web,保存。
再从外部 ping 浮动 IP------通了。用 ssh cirros@<浮动IP>(密码 gocubsgo)登录成功,实验闭环。
六、CLI:同一套流程的命令版
导入环境变量 source keystonerc_admin,先备好镜像和规格:
bash
openstack image create --disk-format qcow2 --container-format bare \
--min-disk 1 --min-ram 128 --private --file ./cirros-0.5.2-x86_64-disk.img Img_cli
openstack flavor create --vcpus 1 --ram 128 --disk 1 Flavor_cli
6.1 网络与子网
bash
# 创建共享网络
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
# 查看网络的端口列表(--long 显示更多字段)
openstack port list --network Network_cli_01 --long
# 同样方式再建 Network_cli_02 / Subnet_cli_02(192.168.4.0/24)
6.2 发实例与连通性验证
bash
# --min 2 --max 2 一次发两台同配置实例
openstack server create --image Img_cli --flavor Flavor_cli \
--network Network_cli_01 --min 2 --max 2 Instance_cli_test
# 第三台挂到另一个网络
openstack server create --image Img_cli --flavor Flavor_cli \
--network Network_cli_02 Instance_cli_test-3
openstack server list
进控制台互 ping,复现「同网通、异网不通」。
6.3 路由器
bash
# 创建路由器并指定外部网关
openstack router create --project admin Router_cli
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
再加完接口后异网互 ping------通。
6.4 浮动 IP
bash
# 查实例的网口,记录 PORT_ID
openstack port list --server Instance_cli_test-3
# 直接给端口创建并绑定浮动 IP(一步到位)
openstack floating ip create --port PORT_ID External
openstack floating ip list --long # 状态 RUNNING = 已关联生效
# 两步式:先建后绑
openstack floating ip create External
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
注意区分:--port 方式创建即绑定(状态 RUNNING);不带 --port 创建的浮动 IP 状态是 DOWN ,要 server add floating ip 关联后才通------这就是检查点 1 的命令版。
6.5 安全组
bash
# 查实例当前的安全组与项目 ID
openstack server show Instance_cli_test-3
openstack security group list --project PROJECT_ID
# 建安全组并加入口规则(ICMP + TCP)
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
# 给实例换安全组:先摘 default,再挂 SG_cli
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
之后外部 ping 浮动 IP 通、SSH 登录成功。
七、OVN 实验:用 ovn-nbctl 看穿 Neutron
本环境用 OVN 作为 Neutron 的后端实现,可以「透视」每个操作在 OVN 里变成了什么:
bash
openstack network agent list # 看到 OVN Controller / OVN Metadata agent,controller 与 compute 节点各一对
关键配置 /etc/neutron/plugins/ml2/ml2_conf.ini:
ini
[ml2]
type_drivers=geneve,flat # 支持的类型:geneve(OVN 默认 overlay)+ flat
tenant_network_types=geneve # 租户网络用 geneve 隧道
mechanism_drivers=ovn # 机制驱动是 ovn
[ml2_type_geneve]
vni_ranges=10:100 # VNI 分配范围
[ml2_type_flat]
flat_networks=* # flat 网络的物理网卡映射
[ovn]
ovn_nb_connection=tcp:192.168.108.10:6641 # 北向库
ovn_sb_connection=tcp:192.168.108.10:6642 # 南向库
创建外部网络(waiwang)、内网 neiwang-1(192.168.11.0/24)、路由器 router1 连接两者、发两台实例绑内网后,用 ovn-nbctl show 逐阶段观察:
- 建外网后:出现一个
switch(逻辑交换机),带localport端口和localnet端口(连物理网络); - 建内网后:多一个 switch,带自己的 localport;
- 建路由器后:出现
router,两个router类型端口分别插在内外网 switch 上,内网口 192.168.11.1/24、外网口拿到外部地址; - 发实例后:内网 switch 上多出实例端口;
- 观察 NAT:router 里有
type: "snat"记录------内网网段 192.168.11.0/24 共用路由器的外部 IP 出网。
两台内网实例互 ping 通(同网二层),一切现象与前面的三个结论吻合------OVN 只是把「交换机、路由器、NAT」从 iptables/netns 换成了自己的逻辑流表实现。
八、命令速查总表
| 命令 | 关键选项/参数 | 说明 |
|---|---|---|
openstack network create |
--share 共享 |
创建网络 |
openstack subnet create |
--network 归属网络;--subnet-range 网段;--allocation-pool start=,end= 地址池;--gateway 网关 |
创建子网 |
openstack port list |
--network 过滤;--long 详细 |
查端口 |
openstack server create |
--image 镜像;--flavor 规格;--network 网络;--min N --max N 批量数量 |
发放实例 |
openstack router create |
--project 归属项目 |
创建路由器 |
openstack router set |
--external-gateway <外部网络> |
设置外部网关 |
openstack router add subnet |
路由器名 + 子网名 | 子网接入路由器 |
openstack floating ip create |
<外部网络>;--port <端口> 创建即绑定 |
创建浮动 IP |
openstack server add/remove floating ip |
实例名 + 浮动 IP | 绑定/解绑浮动 IP |
openstack floating ip delete |
浮动 IP | 释放浮动 IP |
openstack security group create |
名称 | 创建安全组 |
openstack security group rule create |
--protocol icmp/tcp;--ingress 入口;--remote-ip 0.0.0.0/0 |
添加安全组规则 |
openstack server add/remove security group |
实例名 + 安全组名 | 挂载/摘除安全组 |
ovn-nbctl show |
--- | 查看 OVN 北向逻辑拓扑 |
九、三个结论 + 两个检查点(复习锚点)
- 同一网络默认互通;不同网络默认隔离;挂同一路由器互通;
- 外部访问实例 = 外部网络 + 浮动 IP(DNAT)+ 安全组放行,三步缺一不可;
- 排错顺序:先
floating ip list --long看状态(Down=没关联),再看安全组入口规则(default 只出不进),最后才查路由器网关配置。
📖 实验截图与每一步的现象见《OpenStack 实验手册》6.2/6.3 节;OVN 配置详解见《OpenStack 管理手册》网络管理章节。理论与架构见第 1 篇。