Neutron 实战教程:物理 vs 虚拟网络,OVN 环境创建网络与安全策略

文章目录

OpenStack网络管理-neutron

物理网络与虚拟网络区别

Switch:物理交换机 vSwitch:虚拟交换机 NIC:网络接口卡、网络适配器、网卡 vNIC:虚拟网卡 Switch有很多品牌:cisco、华为 vSwitch有很多软件:linuxbridge、ovs、ovn •Neutron最为核心的工作是对二层物理网络的抽象与管理,物理服务器虚拟化后,虚拟机的网络功能由 虚拟网卡(vNIC)和虚拟交换机提供,各个vNIC连接在vSwitch的端口上,最后这些vSwitch通过物理服 务器的物理网卡访问外部的物理网络。

Linux网络虚拟化技术

网卡虚拟化:

TAP TUN VETH PAIR

交换机虚拟化:

linux bridge open vswitch

网络隔离:

network namespace

Linux网卡虚拟化TAP/TUN/VETH

TAP设备:模拟一个二层的网络设备,可以接收和发送二层网包 TUN设备:模拟一个三层的网络设备,可以接收和发送三层网包 VETH:虚拟ethernet接口,通常以pair的方式出现,一端发出的网包,会被另一端接收,可以形成两个 网桥之间的通道 •TAP/TUN提供了一台主机内用户空间的数据传输机制。它虚拟了一套网络接口,这套接口和物理的接口 无任何区别,可以配置IP,可以路由流量,不同的是,它的流量只在主机内流通。 •TAP/TUN有些许的不同,TUN只操作三层的IP包,而TAP操作二层的以太网帧。 •Veth-Pair是成对出现的一种虚拟网络设备,一端连接着协议栈,一端连接着彼此,数据从一端出,从另 一端进。它的这个特性常常用来连接不同的虚拟网络组件,构建大规模的虚拟网络拓扑,比如连接Linux Bridge、OVS、LXC容器等。一个很常见的案例就是它被用于OpenStack Neutron,构建非常复杂的网络 形态。

Linux bridge

Linux bridge:工作于二层的网络设备,功能类似于物理交换机 Bridge可以绑定Linux上的其他网络设备,并将这些设备虚拟化为端口 当一个设备被绑定到bridge时,就相当于物理交换机端口插入了一条连接着终端的网线 使用brctl命令配置Linux bridge: brctl addbr BRIDGE brctl addif BRIDGE DEVICE •Linux Bridge结构如上图所示,Bridge设备br0绑定了实际设备eth0与虚拟设备tap0和tap1,但是对于 Hypervisor的网络协议栈上层来说,只能看到br0,并不会关心桥接的细节。 •当这些设备接收到数据包时,会将其提交给br0决定数据包的去向,br0会根据MAC地址与端口的映射关 系进行转发。 •因为Bridge工作在二层,所以绑定在br0上的从设备eth0、tap0与tap1均不需要再设置IP地址,对于上 层路由器来说,它们都位于同一子网,因此只需为br0设置IP地址。因为br0具有自己的IP地址,br0可以 被加入路由表,并利用它来发送数据,但是最终实际的发送过程则是由某个从设备来完成。 •即使eth0原本具有自己的IP地址,但是在被绑定到br0上后,它的IP地址会失效,用户程序不能接收到这 个IP地址的数据。只有目的地址为br0的IP地址的数据包才会被Linux接收。 •brctl addbr BRIDGE:表示添加BRIDGE。 •brctl addif BRIDGE DEVICE:表示添加接口到bridge。

OVS

Open vSwitch是产品级的虚拟交换机 Linux bridge更适用于小规模,主机内部间通信场景 Open vSwitch更适合于大规模、多主机间通信场景 华为的FusionCompute用的就是DVS(基于EVS,EVS基于OVS) Open vSwitch常用的命令: ovs-vsctl add-br BRIDGE ovs-vsctl add-port PORT ovs-vsctl show BRIDGE ovs-vsctl dump-ports-desc BRIDGE ovs-vsctl dump-flows BRIDGE •Open vSwitch负责连接vNIC与物理网卡,同时桥接同一物理Server内的各个vNIC。其实Linux Bridge已 经能够很好地充当这样的角色,为什么我们还需要Open vSwitch? •因为Open vSwitch的引入使得云环境中对虚拟网络的管理及对网络状态和流量的监控变得更容易。 •我们可以像配置物理交换机一样,将接入Open vSwitch的各个VM分配到不同的VLAN中以实现网络的隔 离。我们也可以在Open vSwitch端口上为VM配置QoS,同时Open vSwitch也支持包括NetFlow、sFlow 等很多标准的管理接口和协议,我们可以通过这些接口完成流量监控等工作。 •Open vSwitch在云环境中的各种虚拟化平台(如Xen与KVM)上实现了分布式的虚拟交换机 (Distributed Virtual Switch),一个物理Server上的vSwitch可以透明地与另一个物理Server上的 vSwitch连接在一起。

Neutron功能概述

从今天开始,我们将学习 OpenStack 的 Networking Service,Neutron。 Neutron 的难度会比前面所有模块都大一些,内容也多一些。为了帮助大家更好的掌握 Neutorn,也会 分析地更详细一些。 Neutron 概述 传统的网络管理方式很大程度上依赖于管理员手工配置和维护各种网络硬件设备;而云环境下的网络已 经变得非常复杂,特别是在多租户场景里,用户随时都可能需要创建、修改和删除网络,网络的连通性 和隔离不已经太可能通过手工配置来保证了。 如何快速响应业务的需求对网络管理提出了更高的要求。传统的网络管理方式已经很难胜任这项工作, 而"软件定义网络(software-defined networking, SDN)"所具有的灵活性和自动化优势使其成为云时代 网络管理的主流。

Neutron 的设计目标是实现"网络即服务(Networking as a Service)"。为了达到这一目标,在设计上 遵循了基于 SDN 实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网络相关的技术。 在这一章,我们将讨论 Neutron 的功能和它的各个组件,学习部署和配置 OpenStack 网络的不同方 法,会涉及软件和硬件设备多个层面。 Neutron 功能 Neutron 为整个 OpenStack 环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和 VPN 等。Neutron 提供了一个灵活的框架,通过配置,无论是开源还是商业软件都可以被用来实现这些功 能。 二层交换 Switching Nova 的 Instance 是通过虚拟交换机连接到虚拟二层网络的。Neutron 支持多种虚拟交换机,包括 Linux 原生的 Linux Bridge 和 Open vSwitch。 Open vSwitch(OVS)是一个开源的虚拟交换机,它支 持标准的管理接口和协议。 利用 Linux Bridge 和 OVS,Neutron 除了可以创建传统的 VLAN 网络,还可以创建基于隧道技术的 Overlay 网络,比如 VxLAN 和 GRE(Linux Bridge 目前只支持 VxLAN)。在后面章节我们会学习如何使 用和配置 Linux Bridge 和 Open vSwitch。 三层路由 Routing Instance 可以配置不同网段的 IP,Neutron 的 router(虚拟路由器)实现 instance 跨网段通信。 router 通过 IP forwarding,iptables 等技术来实现路由和 NAT。我们将在后面章节讨论如何在 Neutron 中配置 router 来实现 instance 之间,以及与外部网络的通信。 负载均衡 Load Balancing Openstack 在 Grizzly 版本第一次引入了 Load-Balancing-as-a-Service(LBaaS),提供了将负载分发到 多个 instance 的能力。LBaaS 支持多种负载均衡产品和方案,不同的实现以 Plugin 的形式集成到 Neutron,目前默认的 Plugin 是 HAProxy。我们会在后面章节学习 LBaaS 的使用和配置。 防火墙 Firewalling Neutron 通过下面两种方式来保障 instance 和网络的安全性。 Security Group 通过 iptables 限制进出 instance 的网络包。 Firewall-as-a-Service FWaaS,限制进出虚拟路由器的网络包,也是通过 iptables 实现。

Neutron网络基本概念

上次我们讨论了 Neutron 提供的功能,接下来我们学习 Neutron 模块几个重要的概念。Neutron 管理 的网络资源包括 Network,subnet 和 port,下面依次介绍。 network network 是一个隔离的二层广播域。Neutron 支持多种类型的 network,包括 local, flat, VLAN, VxLAN 和 GRE。

local local 网络与其他网络和节点隔离。local 网络中的 instance 只能与位于同一节点上同一网络的 instance 通信,local 网络主要用于单机测试。 flat flat 网络是无 vlan tagging 的网络。flat 网络中的 instance 能与位于同一网络的 instance 通信,并且可 以跨多个节点。 vlan vlan 网络是具有 802.1q tagging 的网络。vlan 是一个二层的广播域,同一 vlan 中的 instance 可以通 信,不同 vlan 只能通过 router 通信。vlan 网络可跨节点,是应用最广泛的网络类型。 vxlan vxlan 是基于隧道技术的 overlay 网络。vxlan 网络通过唯一的 segmentation ID(也叫 VNI)与其他 vxlan 网络区分。vxlan 中数据包会通过 VNI 封装成 UDP 包进行传输。因为二层的包通过封装在三层传 输,能够克服 vlan 和物理网络基础设施的限制。 gre gre 是与 vxlan 类似的一种 overlay 网络。主要区别在于使用 IP 包而非 UDP 进行封装。

不同 network 之间在二层上是隔离的。 以 vlan 网络为例,network A 和 network B 会分配不同的 VLAN ID,这样就保证了 network A 中的广 播包不会跑到 network B 中。当然,这里的隔离是指二层上的隔离,借助路由器不同 network 是可能在 三层上通信的。 network 必须属于某个 Project( Tenant 租户),Project 中可以创建多个 network。Project 与 network 之间是 1对多关系。 subnet subnet 是一个 IPv4 或者 IPv6 地址段。instance 的 IP 从 subnet 中分配。每个 subnet 需要定义 IP 地址 的范围和掩码。 network 与 subnet 是 1对多 关系。一个 subnet 只能属于某个 network;一个 network 可以有多个 subnet,这些 subnet 可以是不同的 IP 段,但不能重叠。下面的配置是有效的: network A subnet A-a: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.50"} subnet A-b: 10.10.2.0/24 {"start": "10.10.2.1", "end": "10.10.2.50"} 但下面的配置则无效,因为 subnet 有重叠 networkA subnet A-a: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.50"}

subnet A-b: 10.10.1.0/24 {"start": "10.10.1.51", "end": "10.10.1.100"} 这里不是判断 IP 是否有重叠,而是 subnet 的 CIDR 重叠(都是 10.10.1.0/24)。但是,如果 subnet 在 不同的 network 中,CIDR 和 IP 都是可以重叠的,比如 network A subnet A-a: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.50"} networkB subnet B-a: 10.10.1.0/24 {"start": "10.10.1.1", "end": "10.10.1.50"} 这里大家不免会疑惑: 如果上面的IP地址是可以重叠的,那么就可能存在具有相同 IP 的两个 instance, 这样会不会冲突? 简单的回答是:不会! 具体原因: 因为 Neutron 的 router 是通过 Linux network namespace 实现的。network namespace 是一种网络的隔离机制。通过它,每个 router 有自己独立的路由表。上面的配置有两种结果: 1. 如果两个 subnet 是通过同一个 router 路由,根据 router 的配置,只有指定的一个 subnet 可被路 由。 2. 如果上面的两个 subnet 是通过不同 router 路由,因为 router 的路由表是独立的,所以两个 subnet 都可以被路由。 这里只是先简单做个说明,我们会在后面三层路由的章节详细分析这种场景。 port port 可以看做虚拟交换机上的一个端口。port 上定义了 MAC 地址和 IP 地址,当 instance 的虚拟网卡 VIF(Virtual Interface) 绑定到 port 时,port 会将 MAC 和 IP 分配给 VIF。 subnet 与 port 是 1对多 关系。一个 port 必须属于某个 subnet;一个 subnet 可以有多个 port。 小节 下面总结了 Project,Network,Subnet,Port 和 VIF 之间关系。 Project 1 : m Network 1 : m Subnet 1 : m Port 1 : 1 VIF m : 1 Instance 下一节我们讨论 Neutron 的架构。

Neutron架构

前面我们讨论了 Neutron 的基本概念,接下来我们开始分析 Neutron 的架构。 Neutron 架构 与 OpenStack 的其他服务的设计思路一样,Neutron 也是采用分布式架构,由多个组件(子服务)共同 对外提供网络服务。

Neutron 由如下组件构成: Neutron Server 对外提供 OpenStack 网络 API,接收请求,并调用 Plugin 处理请求。 Plugin 处理 Neutron Server 发来的请求,维护 OpenStack 逻辑网络状态, 并调用 Agent 处理请求。 Agent 处理 Plugin 的请求,负责在 network provider 上真正实现各种网络功能。 network provider 提供网络服务的虚拟或物理网络设备,例如 Linux Bridge,Open vSwitch 或者其他支持 Neutron 的物 理交换机。 Queue Neutron Server,Plugin 和 Agent 之间通过 Messaging Queue 通信和调用。 Database 存放 OpenStack 的网络状态信息,包括 Network, Subnet, Port, Router 等。

bash 复制代码
# 执行命令:mysql
[root@controller ~(keystone_admin)]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8516
Server version: 10.3.10-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use neutron;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [neutron]> show tables;
+-----------------------------------------+
| Tables_in_neutron                       |
+-----------------------------------------+
| address_scopes                          |
| agents                                  |
| alembic_version                         |
| allowedaddresspairs                     |
| arista_provisioned_nets                 |
| arista_provisioned_tenants              |
| arista_provisioned_vms                  |
| auto_allocated_topologies               |
| bgp_peers                               |
| bgp_speaker_dragent_bindings            |
| bgp_speaker_network_bindings            |
| bgp_speaker_peer_bindings               |
| bgp_speakers                            |
| brocadenetworks                         |
| brocadeports                            |
| cisco_csr_identifier_map                |
| cisco_hosting_devices                   |
| cisco_ml2_apic_contracts                |
| cisco_ml2_apic_host_links               |
| cisco_ml2_apic_names                    |
| cisco_ml2_n1kv_network_bindings         |
| cisco_ml2_n1kv_network_profiles         |
| cisco_ml2_n1kv_policy_profiles          |
| cisco_ml2_n1kv_port_bindings            |
| cisco_ml2_n1kv_profile_bindings         |
| cisco_ml2_n1kv_vlan_allocations         |
| cisco_ml2_n1kv_vxlan_allocations        |
| cisco_ml2_nexus_nve                     |
| cisco_ml2_nexusport_bindings            |
| cisco_port_mappings                     |
| cisco_router_mappings                   |
| consistencyhashes                       |
| default_security_group                  |
| dnsnameservers                          |
| dvr_host_macs                           |
| externalnetworks                        |
| extradhcpopts                           |
| firewall_policies                       |
| firewall_rules                          |
| firewalls                               |
| flavors                                 |
| flavorserviceprofilebindings            |
| floatingipdnses                         |
| floatingips                             |
| ha_router_agent_port_bindings           |
| ha_router_networks                      |
| ha_router_vrid_allocations              |
| healthmonitors                          |
| ikepolicies                             |
| ipallocationpools                       |
| ipallocations                           |
| ipamallocationpools                     |
| ipamallocations                         |
| ipamsubnets                             |
| ipsec_site_connections                  |
| ipsecpeercidrs                          |
| ipsecpolicies                           |
| logs                                    |
| lsn                                     |
| lsn_port                                |
| maclearningstates                       |
| members                                 |
| meteringlabelrules                      |
| meteringlabels                          |
| ml2_brocadenetworks                     |
| ml2_brocadeports                        |
| ml2_distributed_port_bindings           |
| ml2_flat_allocations                    |
| ml2_geneve_allocations                  |
| ml2_geneve_endpoints                    |
| ml2_gre_allocations                     |
| ml2_gre_endpoints                       |
| ml2_nexus_vxlan_allocations             |
| ml2_nexus_vxlan_mcast_groups            |
| ml2_port_binding_levels                 |
| ml2_port_bindings                       |
| ml2_ucsm_port_profiles                  |
| ml2_vlan_allocations                    |
| ml2_vxlan_allocations                   |
| ml2_vxlan_endpoints                     |
| multi_provider_networks                 |
| network_segment_ranges                  |
| networkconnections                      |
| networkdhcpagentbindings                |
| networkdnsdomains                       |
| networkgatewaydevicereferences          |
| networkgatewaydevices                   |
| networkgateways                         |
| networkqueuemappings                    |
| networkrbacs                            |
| networks                                |
| networksecuritybindings                 |
| networksegments                         |
| neutron_nsx_network_mappings            |
| neutron_nsx_port_mappings               |
| neutron_nsx_router_mappings             |
| neutron_nsx_security_group_mappings     |
| nexthops                                |
| nsxv_edge_dhcp_static_bindings          |
| nsxv_edge_vnic_bindings                 |
| nsxv_firewall_rule_bindings             |
| nsxv_internal_edges                     |
| nsxv_internal_networks                  |
| nsxv_port_index_mappings                |
| nsxv_port_vnic_mappings                 |
| nsxv_router_bindings                    |
| nsxv_router_ext_attributes              |
| nsxv_rule_mappings                      |
| nsxv_security_group_section_mappings    |
| nsxv_spoofguard_policy_network_mappings |
| nsxv_tz_network_bindings                |
| nsxv_vdr_dhcp_bindings                  |
| nuage_net_partition_router_mapping      |
| nuage_net_partitions                    |
| nuage_provider_net_bindings             |
| nuage_subnet_l2dom_mapping              |
| poolloadbalanceragentbindings           |
| poolmonitorassociations                 |
| pools                                   |
| poolstatisticss                         |
| portbindingports                        |
| portdataplanestatuses                   |
| portdnses                               |
| portforwardings                         |
| portqueuemappings                       |
| ports                                   |
| portsecuritybindings                    |
| portuplinkstatuspropagation             |
| providerresourceassociations            |
| provisioningblocks                      |
| qos_bandwidth_limit_rules               |
| qos_dscp_marking_rules                  |
| qos_fip_policy_bindings                 |
| qos_minimum_bandwidth_rules             |
| qos_network_policy_bindings             |
| qos_policies                            |
| qos_policies_default                    |
| qos_port_policy_bindings                |
| qos_router_gw_policy_bindings           |
| qospolicyrbacs                          |
| qosqueues                               |
| quotas                                  |
| quotausages                             |
| reservations                            |
| resourcedeltas                          |
| router_extra_attributes                 |
| routerl3agentbindings                   |
| routerports                             |
| routerroutes                            |
| routerrules                             |
| routers                                 |
| securitygroupportbindings               |
| securitygrouprbacs                      |
| securitygrouprules                      |
| securitygroups                          |
| segmenthostmappings                     |
| serviceprofiles                         |
| sessionpersistences                     |
| standardattributes                      |
| subnet_service_types                    |
| subnetpoolprefixes                      |
| subnetpools                             |
| subnetroutes                            |
| subnets                                 |
| subports                                |
| tags                                    |
| trunks                                  |
| tz_network_bindings                     |
| vcns_router_bindings                    |
| vips                                    |
| vpnservices                             |
+-----------------------------------------+
171 rows in set (0.001 sec)

OVN网络整体实验

bash 复制代码
# 加载keystonerc_admin环境变量
[root@controller ~]# source keystonerc_admin

# 执行命令:openstack network agent list
[root@controller ~(keystone_admin)]# openstack network agent list
+--------------------------------------+----------------------+------------+-----
--------------+-------+-------+----------------------------+
| ID                                   | Agent Type           | Host       | 
Availability Zone | Alive | State | Binary                     |
+--------------------------------------+----------------------+------------+-----
--------------+-------+-------+----------------------------+
| 6e7f51ef-117d-4b7f-b650-599aa5a3cfd7 | OVN Controller agent | compute    |     
              | :-)   | UP    | ovn-controller             |
| b1374481-f227-5e89-9a3f-8a3708d59251 | OVN Metadata agent   | compute    |     
              | :-)   | UP    | neutron-ovn-metadata-agent |
| 46cd64c9-2f35-4dfb-9351-e0b1693daf8b | OVN Controller agent | controller |     
              | :-)   | UP    | ovn-controller             |
| 497883dc-f0f1-5780-87b4-630075557d30 | OVN Metadata agent   | controller |     
              | :-)   | UP    | neutron-ovn-metadata-agent |
+--------------------------------------+----------------------+------------+-----
--------------+-------+-------+----------------------------+

确认配置

bash 复制代码
# 编辑/etc/neutron/plugins/ml2/ml2_conf.ini配置文件
[root@controller ~]# vim /etc/neutron/plugins/ml2/ml2_conf.ini
#按G跳到末尾
[ml2]
type_drivers=geneve,flat
tenant_network_types=geneve
mechanism_drivers=ovn
path_mtu=0
extension_drivers=port_security,qos
[securitygroup]
enable_security_group=True
[ml2_type_geneve]
max_header_size=38
vni_ranges=10:100
[ml2_type_flat]
flat_networks=*
[ovn]
ovn_nb_connection=tcp:192.168.108.10:6641
ovn_sb_connection=tcp:192.168.108.10:6642
ovn_metadata_enabled=True

创建外部网络

bash 复制代码
#查看现象
[root@controller ~]# ovn-nbctl show
switch e69d7e37-9a0d-4abe-81c8-9d10c2246178 (neutron-e79063ae-1291-42b2-8519-
ec0ce0a421e1) (aka waiwang)
    port 43b284b0-ebc8-4bd3-8c59-77dcec8d33dd
        type: localport
        addresses: ["fa:16:3e:be:d3:41 192.168.108.100"]
    port provnet-50a84802-b570-4cad-be3e-cb934c259c48
        type: localnet
        addresses: ["unknown"]

创建内网neiwang-1,192.168.11.0/24

查看现象:

bash 复制代码
# 执行命令:ovn-nbctl show
[root@controller ~]# ovn-nbctl show
switch 9e269a0c-5049-4c20-b602-ce42d722017c (neutron-c5a25fa7-559f-4e62-8bf0-
7ebcd8c8a1f1) (aka neiwang-1)
    port 3b975511-7c63-495e-969c-1424e69770dc
        type: localport
        addresses: ["fa:16:3e:dd:ea:9d 192.168.11.2"]
switch e69d7e37-9a0d-4abe-81c8-9d10c2246178 (neutron-e79063ae-1291-42b2-8519-
ec0ce0a421e1) (aka waiwang)
    port 43b284b0-ebc8-4bd3-8c59-77dcec8d33dd
        type: localport
        addresses: ["fa:16:3e:be:d3:41 192.168.108.100"]
    port provnet-50a84802-b570-4cad-be3e-cb934c259c48
        type: localnet
        addresses: ["unknown"]

创建路由器router1,连接内网与外网

观察现象

bash 复制代码
# 执行命令:ovn-nbctl show
[root@controller ~]# ovn-nbctl show
switch 9e269a0c-5049-4c20-b602-ce42d722017c (neutron-c5a25fa7-559f-4e62-8bf0-
7ebcd8c8a1f1) (aka neiwang-1)
    port 9da6f7af-22e3-44fc-8465-90334f8abeea
        type: router
        router-port: lrp-9da6f7af-22e3-44fc-8465-90334f8abeea
    port 3b975511-7c63-495e-969c-1424e69770dc
        type: localport
        addresses: ["fa:16:3e:dd:ea:9d 192.168.11.2"]
switch e69d7e37-9a0d-4abe-81c8-9d10c2246178 (neutron-e79063ae-1291-42b2-8519-
ec0ce0a421e1) (aka waiwang)
    port 43b284b0-ebc8-4bd3-8c59-77dcec8d33dd
        type: localport
        addresses: ["fa:16:3e:be:d3:41 192.168.108.100"]
    port c0354999-1e15-436f-b15f-be2d3b17c5b4
        type: router
        router-port: lrp-c0354999-1e15-436f-b15f-be2d3b17c5b4
    port provnet-50a84802-b570-4cad-be3e-cb934c259c48
        type: localnet
        addresses: ["unknown"]
router 9374d9e7-b8b0-4d6e-924d-c9fdef6662e5 (neutron-a75adc8f-9668-4fe1-b6eb-
b4573d574ae0) (aka router1)
    port lrp-9da6f7af-22e3-44fc-8465-90334f8abeea
        mac: "fa:16:3e:78:18:6c"
        networks: ["192.168.11.1/24"]
    port lrp-c0354999-1e15-436f-b15f-be2d3b17c5b4
        mac: "fa:16:3e:82:b8:23"
        networks: ["192.168.108.185/24"]
        gateway chassis: [46cd64c9-2f35-4dfb-9351-e0b1693daf8b]
    nat d6fae190-e948-475c-b5b1-a9258a8b7c65
        external ip: "192.168.108.185"
        logical ip: "192.168.11.0/24"
        type: "snat"

创建两实例绑到neiwang-1 创建实例需要(镜像,规格,网络) 镜像 规格自定义,网络使用neiwang-1

此处网络一定要选择内网neiwang-1

效果如下

VM1 ping 通 VM2

观察OVN现象

bash 复制代码
# 执行命令:ovn-nbctl show
[root@controller ~]# ovn-nbctl show
switch 9e269a0c-5049-4c20-b602-ce42d722017c (neutron-c5a25fa7-559f-4e62-8bf0-
7ebcd8c8a1f1) (aka neiwang-1)
    port 0e42719e-b450-4fbf-a222-be6402b2bb93
        addresses: ["fa:16:3e:33:e8:8b 192.168.11.4"]
    port 9da6f7af-22e3-44fc-8465-90334f8abeea
        type: router
        router-port: lrp-9da6f7af-22e3-44fc-8465-90334f8abeea
    port 3ff7bcb4-c9be-4e6d-b14c-cff503adfae6
        addresses: ["fa:16:3e:bd:e5:c5 192.168.11.169"]
    port 3b975511-7c63-495e-969c-1424e69770dc
        type: localport
        addresses: ["fa:16:3e:dd:ea:9d 192.168.11.2"]
switch e69d7e37-9a0d-4abe-81c8-9d10c2246178 (neutron-e79063ae-1291-42b2-8519-
ec0ce0a421e1) (aka waiwang)
    port 43b284b0-ebc8-4bd3-8c59-77dcec8d33dd
        type: localport
        addresses: ["fa:16:3e:be:d3:41 192.168.108.100"]
    port c0354999-1e15-436f-b15f-be2d3b17c5b4
        type: router
        router-port: lrp-c0354999-1e15-436f-b15f-be2d3b17c5b4
    port provnet-50a84802-b570-4cad-be3e-cb934c259c48
        type: localnet
        addresses: ["unknown"]
router 9374d9e7-b8b0-4d6e-924d-c9fdef6662e5 (neutron-a75adc8f-9668-4fe1-b6eb-
b4573d574ae0) (aka router1)
    port lrp-9da6f7af-22e3-44fc-8465-90334f8abeea
        mac: "fa:16:3e:78:18:6c"
        networks: ["192.168.11.1/24"]
    port lrp-c0354999-1e15-436f-b15f-be2d3b17c5b4
        mac: "fa:16:3e:82:b8:23"
        networks: ["192.168.108.185/24"]
        gateway chassis: [46cd64c9-2f35-4dfb-9351-e0b1693daf8b]
    nat d6fae190-e948-475c-b5b1-a9258a8b7c65
        external ip: "192.168.108.185"
        logical ip: "192.168.11.0/24"
        type: "snat"

实践

关于本实验

本实验主要介绍如何通过OpenStack Dashboard 和OpenStack CLI 两种方式创建网络、子网、路由器、安全

组以及浮动IP 分配等基本操作,并测试虚拟机实例的连通性。

实验目的

⚫ 熟悉OpenStack Dashboard 和OpenStack CLI 创建网络和子网的操作方法。

⚫ 熟悉OpenStack Dashboard 和OpenStack CLI 创建路由器以及安全组的操作方法。

⚫ 熟悉OpenStack Dashboard 和OpenStack CLI 分配浮动IP 的操作方法。

⚫ 熟悉OpenStack Dashboard 和OpenStack CLI 测试虚拟机实例连通性的操作方法。

实验流程

OpenStack Dashboard 操作

检查OpenStack 环境配置

还原快照到openstack 刚装完

管理员创建镜像。

管理员创建实例规格。

创建网络

使用admin 用户登录OpenStack Dashboard 界面,在左侧导航栏,选择"项目>网络>网络拓扑",进入网

络拓扑页面,显示环境当前的网络拓扑,单击下方的"创建网络"。

弹出创建网络对话框。在"网络"页签,输入网络名称"Network_web_01",并勾选"共享的",共享

该网络,其他保持默认,单击"下一项"。

进入"子网"页签,输入子网名称"Subnet_web_01",网络地址"192.168.1.0/24",网关IP

"192.168.1.1",其他保持默认,单击"下一项"。

进入"子网详情"页签,输入分配地址池的起止IP"192.168.1.100,192.168.1.200",其他保持默认,单

击"创建"。

返回网络拓扑页面,查看网络拓扑的变化。

在左侧导航栏,选择"项目>网络>网络",进入网络列表,查看刚刚创建的网络。

单击网络名称"Network_web_01",进入网络概览页面,查看网络详细信息。

选择"子网"页签,查看网络子网信息。

选择"端口"页签,查看网络网口信息。

单击"项目>网络>网络",返回网络列表,单击页面上方的"创建网络",创建网络

"Network_web_02",子网名称"Subnet_web_02",网络地址"192.168.2.0/24",网关IP

"192.168.2.1",地址池的起止IP"192.168.2.100,192.168.2.200"。

验证:虚拟机实例相互访问

在左侧导航栏,选择"项目>计算>实例",进入虚拟机实例列表,单击页面上方的"创建实例"。参考

之前的步骤,发放如下2 个虚拟机实例:

⚫ 虚拟机实例名称:Instance_web_test。

⚫ 数量:2。

⚫ 选择启动源:Image。

⚫ 创建新卷:否。

⚫ 分配镜像:Img_web。

⚫ 分配规格:Flavor_web。

⚫ 分配网络:Network_web_01。

⚫ 其他保持默认。

分别记录2 个虚拟机实例的IP 地址。

Instacne_web_test-1 192.168.1.137

Instance_web_test-2 192.168.1.140

在左侧导航栏,选择"项目>计算>实例",进入虚拟机实例列表分别单击刚刚创建的2 个虚拟机实例名

称,进入虚拟机实例概览页面,选择"控制台"页签,单击页面上方的"点击此处只登录控制台"。

按系统提示的用户名和密码登录,查看虚拟机实例IP 地址,并进行互Ping,测试是否互通。

在左侧导航栏,选择"项目>网络>网络拓扑",进入网络拓扑页面,查看当前的网络拓扑。

结论:

  1. 由结果可知:同一网络中的虚拟机实例默认可以互通。

发放虚拟机实例"Instance_web_test-3",网络选择"Network_web_02",其他参数与虚拟机

实例"Instance_web_test-1"和"Instance_web_test-2"保持一致。

单击刚刚创建的虚拟机实例名称"Instance_web_test-3",进入虚拟机实例概览页面,选择"控制台"页

签,单击页面上方的"点击此处只显示控制台",按系统提示的用户名和密码登录,查看虚拟机实例IP

地址,并与虚拟机实例"Instance_web_test-1"进行互Ping,测试是否互通。

由图可知无法相互Ping 通。

在左侧导航栏,选择"项目>网络>网络拓扑",进入网络拓扑页面,查看当前的网络拓扑。

由网络拓扑图可知,虚拟机实例"Instance_web_test-1"与"Instance_web_test-3"分别处于不同网络

中,不同网络间相互隔离,所以无法互通。

结论:

  1. 不同网络间的虚拟机实例默认无法互通。

创建路由器

在左侧导航栏,选择"项目>网络>路由",进入路由列表,单击页面上方的"新建路由"。

弹出创建路由对话框,输入路由名称"Router_web",其他保持默认,单击"新建路由"。

返回路由列表,查看刚刚创建的路由。

单击路由名称"Router_web",进入路由概览页面。

选择"接口"页签,进入路由接口列表,单击页面上方的"增加接口"。

弹出添加接口对话框,选择子网"Network_web_01:192.168.1.0/24(Subnet_web_01)",单击"提

交"。

返回接口列表,查看刚刚添加的接口,状态为"运行中"。

选择子网"Network_web_02:192.168.2.0/24(Subnet_web_02)",添加接口。

在左侧导航栏,选择"项目>网络>网络拓扑",进入网络拓扑页面,查看当前的网络拓扑。

由网络拓扑图可知,网络"Network_web_01"和"Network_web_02"通过路由器"Router_web"相连,

验证虚拟机实例"Instance_web_test-3"与"Instance_web_test-1"是否也可以互通。

登录OpenStack Dashboard。在左侧导航栏,选择"项目>计算>实例",进入虚拟机实例列表,分别单击

虚拟机实例名称"Instance_web_test-3"和"Instance_web_test-1",进入"控制台"页签,单击页面上

方的"点击此处只显示控制台",再次进行互Ping,测试是否互通。

由图可知可以互通。

结论:

  1. 不同网络间的虚拟机实例可以通过连接同一个路由器进行互通。

此刻创建的instance 无法访问外网,配置外部网络,让虚拟机能访问外网

创建外部网络

这里的物理网络填写啥,取决于配置文件。

这里的外部网络地址,取决于网络配置,真实能上网的地址。

实现instance 访问外部网络了

管理浮动IP

在OpenStack 所在的虚拟机中,验证是否能够从外部Ping 通虚拟机实例"Instance_web_test-3"。

由图可知无法Ping 通。

结论:

1.虚拟机实例"Instance_web_test-3"的网络"Network_web_02"为OpenStack 系统内部网络,无法从

外部进行互通。若要实现从外部访问虚拟机实例,必须通过外部网络分配浮动IP 来访问,具体操作步骤

如下:

在左侧导航栏,选择"项目>网络>浮动IP",进入浮动IP 列表,单击页面上方的"分配IP 给项目"。

弹出分配浮动IP 对话框,"资源池"已默认选择外部网络"External",直接单击下方的"分配IP"。

返回浮动IP 列表,查看刚刚分配的浮动IP。

在左侧导航栏,选择"项目>计算>实例",进入虚拟机实例列表,单击待操作虚拟机实例

"Instance_web_test-3"所在行"Actions"列方框中的,在操作列表中选择"绑定浮动IP"。

弹出管理浮动IP 分配对话框,"IP 地址"选择刚刚分配的浮动IP,"待连接端口"已默认选择

"Instance_web_test-3:192.168.2.111",单击下方的"关联"。

返回虚拟机实例列表,查看虚拟机实例刚刚分配的浮动IP。

再次验证是否能够从外部Ping 通虚拟机实例"Instance_web_test-3"。

由图可知还是无法Ping 通。

再创建一个浮动IP,查看浮动IP 的状态为"Down",单击浮动IP"Actions"列的"关联"。

弹出管理浮动IP 分配对话框,在"IP Address"下方已自动选择当前浮动IP 地址,在"待连接的端口"下

方选择"Instance_web_test-1:192.168.1.106",单击下方的"关联"。

返回浮动IP 列表,查看浮动IP 的分配情况,状态变为"运行中",单击"Actions"列的"解除绑定"。

弹出如下确认信息提示框,单击"解除绑定"。

返回浮动IP 列表,勾选待释放的浮动IP,单击页面上方的"释放浮动IP"。

弹出如下确认信息提示框,单击"释放浮动IP"。

创建安全组

选择虚拟机实例"Instance_web_test-3"的"概览"页签,查看虚拟机实例当前应用的安全组。

由图可知,为"default"安全组。

在左侧导航栏,选择"项目>网络>安全组",进入安全组列表,单击安全组"default"所在行

"Actions"列的"管理规则"。

查看默认的安全组规则,如下图所示:

由图可知,虚拟机实例的默认安全组允许所有出口流量,但禁止所有除了来自内部的入口流量。由此可知,外部默认无法访问虚拟机实例"Instance_web_test-3",需要更改安全组规则。

单击左侧导航栏"项目>网络>安全组",返回安全组列表,单击页面上方的"创建安全组"。

弹出创建安全组对话框,输入安全组名称"SG_web",单击"创建安全组"。

自动跳转到安全组规则列表,单击页面上方的"添加规则",添加安全组规则。

弹出添加规则对话框,"规则"选择"所有ICMP 规则","方向"选择"入口","远程"选择

"CIDR","CIDR"选择"0.0.0.0/0",单击"添加"。

返回安全组规则列表,查看刚刚添加的安全组规则。

添加TCP 规则如下图所示:

返回安全组规则列表,查看安全组规则列表。

在左侧导航栏,选择"项目>计算>实例",进入虚拟机实例列表,单击待操作虚拟机实例

"Instance_web_test-3"所在行"Actions"列方框中的,在操作列表中选择"编辑安全组"。

弹出编辑虚拟机实例对话框,在"安全组"页签,单击右侧默认安全组"default"后面的,移除默认

安全组,单击左侧安全组"SG_web"后面的,添加之前创建的安全组,单击下方的"保存"。

返回虚拟机实例列表,单击虚拟机实例名称"Instance_web_test-3",重复步骤1,再次查看虚拟机实例

应用的安全组规则。

再次验证是否能够从外部Ping 通虚拟机实例"Instance_web_test-3"的浮动IP。

由图可知,外部可以Ping 通虚拟机实例的浮动IP。

使用SSH 登录虚拟机实例"Instance_web_test-3",验证是否成功(cirros 用户密码为"gocubsgo")。

执行下hostname 看下主机名

由图可知虚拟机实例"Instance_web_test-3"登录成功。

OpenStack CLI 操作

创建网络

登录到controller,执行以下命令,导入用户admin 的环境变量。

bash 复制代码
# 加载环境变量配置文件
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
bash 复制代码
# 创建规格
openstack flavor create --vcpus 1 --ram 128 --disk 1 Flavor_cli

执行以下命令,创建网络"Network_cli_01",设置为"Shared"。

bash 复制代码
# 创建网络
openstack network create --share Network_cli_01

执行以下命令,查看网络列表。

bash 复制代码
# 列出所有网络
openstack network list

执行以下命令,创建网络"Network_cli_01"的子网"Subnet_cli_01",配置要求如下:

⚫ 网络地址:"192.168.3.0/24"。

⚫ 子网地址池:"192.168.3.100~192.168.3.200"。

⚫ 网关地址:"192.168.3.1"。

bash 复制代码
# 创建子网
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

执行以下命令,查看网络子网列表。

bash 复制代码
# 列出所有子网
openstack subnet list

执行以下命令,查看网络"Network_cli_01"的网口列表。

bash 复制代码
# 列出所有port
openstack port list --network Network_cli_01 --long

执行以下命令,创建网络"Network_cli_02"和网络子网"Subnet_cli_02",子网配置要求如下,其他与

网络"Network_cli_01"和网络子网"Subnet_cli_01"保持一致:

⚫ 网络地址:"192.168.4.0/24"。

⚫ 子网地址池:"192.168.4.100~192.168.4.200"。

⚫ 网关地址:"192.168.4.1"。

bash 复制代码
# 创建网络
openstack network create --share Network_cli_02
bash 复制代码
# 创建子网
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

执行以下命令,查看网络和网络子网列表。

bash 复制代码
# 列出所有网络
openstack network list
bash 复制代码
# 列出所有子网
openstack subnet list

验证:虚拟机实例相互访问

执行以下命令,发放2 个虚拟机实例"Instance_cli_test",配置要求如下:

⚫ 虚拟机实例名称:Instance_cli_test。

⚫ 数量:2。

⚫ 选择启动源:Image。

⚫ 分配镜像:Img_cli。

⚫ 分配规格:Flavor_cli。

⚫ 分配网络:Network_cli_01。

⚫ 其他保持默认。

bash 复制代码
# 创建虚拟机实例
openstack server create --image Img_cli --flavor Flavor_cli --network Network_cli_01 --min 2 --max 2 Instance_cli_test

执行以下命令,查看虚拟机实例列表。

bash 复制代码
# 列出所有虚拟机实例
openstack server list

验证虚拟机实例"Instance_web_cli-1"与"Instance_cli_cli-2"是否可以相互Ping 通。

执行以下命令,发放虚拟机实例"Instance_cli_test-3",配置要求如下:

⚫ 虚拟机实例名称:Instance_cli_test-3。

⚫ 选择启动源:Image。

⚫ 分配镜像:Img_cli。

⚫ 分配规格:Flavor_cli。

⚫ 分配网络:Network_cli_02。

⚫ 其他保持默认。

bash 复制代码
# 创建虚拟机实例
openstack server create --image Img_cli --flavor Flavor_cli --network Network_cli_02 Instance_cli_test-3

验证虚拟机实例"Instance_cli_test-1"与"Instance_cli_test-3"是否可以相互Ping 通。

创建路由器

执行以下命令,创建路由器"Router_cli"。

bash 复制代码
# 创建路由器
openstack router create --project admin Router_cli

执行以下命令,查看路由器列表。

bash 复制代码
# 列出所有路由器
openstack router list

配置路由器"Router_cli"的外部网络为"External"。

bash 复制代码
# 设置/修改路由器
openstack router set --external-gateway External Router_cli

执行以下命令,分别添加子网"Subnet_cli_01"和"Subnet_cli_02"在路由器"Router_cli"上的接口。

bash 复制代码
# 添加路由器
openstack router add subnet Router_cli Subnet_cli_01
bash 复制代码
# 添加路由器
openstack router add subnet Router_cli Subnet_cli_02

执行以下命令,查看路由器"Router_cli"的接口信息。

bash 复制代码
# 查看路由器
openstack router show Router_cli | grep interfaces_info

再次验证虚拟机实例"Instance_web_test-1"与"Instance_web_test-3"是否可以相互Ping 通。

管理浮动IP

验证是否能够从外部Ping 通虚拟机实例"Instance_cli_test-3"。

执行以下命令,查看待分配虚拟机实例"Instance_cli_test-3"的网口。

bash 复制代码
# 列出所有port
openstack port list --server Instance_cli_test-3

记录待分配虚拟机实例"Instance_cli_test-3"的网口ID。

执行以下命令,为虚拟机实例"Instance_cli_test-3"的网口创建并分配外部网络"External"的浮动IP。

bash 复制代码
# ip浮动IP
openstack floating ip create --port PORT_ID External

执行以下命令,查看浮动IP 列表,并查看其网口状态。

bash 复制代码
# ip浮动IP
openstack floating ip list --long

重复步骤1,验证是否能够从外部Ping 通虚拟机实例"Instance_web_test-3"。

执行以下命令,重新创建一个浮动IP,并查看其网口状态。

bash 复制代码
# ip浮动IP
openstack floating ip create External
bash 复制代码
# ip浮动IP
openstack floating ip list --long

记录刚刚创建的浮动IP 地址。

执行以下命令,为虚拟机实例"Instance_cli_test-1"分配浮动IP。

bash 复制代码
# 添加虚拟机实例
openstack server add floating ip Instance_cli_test-1 FLOATING_IP

执行以下命令,为虚拟机实例"Instance_cli_test-1" 解分配浮动IP。

bash 复制代码
# 移除虚拟机实例
openstack server remove floating ip Instance_cli_test-1 FLOATING_IP

执行以下命令,释放全部已解分配的浮动IP。

bash 复制代码
# ip浮动IP
openstack floating ip delete FLOATING_IP

执行以下命令,查看浮动IP 列表。

bash 复制代码
# ip浮动IP
openstack floating ip list

创建安全组

执行以下命令,查看虚拟机实例"Instance_cli_test-3"当前应用的安全组。

bash 复制代码
# 查看虚拟机实例
openstack server show Instance_cli_test-3

记录虚拟机实例"Instance_cli_test-3"的安全组名称和项目ID。

执行以下命令,查看虚拟机实例"Instance_cli_test-3"应用的安全组ID。

bash 复制代码
# group安全组
openstack security group list --project PROJECT_ID

记录虚拟机实例"Instance_cli_test-3"的安全组ID。

执行以下命令,查看虚拟机实例"Instance_cli_test-3"的安全组的规则ID。

bash 复制代码
# group安全组
openstack security group rule list | grep SECURITY_GROUP_ID

记录虚拟机实例"Instance_cli_test-3"的安全组的规则ID。

执行以下命令,查看虚拟机实例"Instance_cli_test-3"的安全组的规则的详细信息(以下以第一条规则为

例进行查看)。

bash 复制代码
# group安全组
openstack security group rule show SECURITY_GROUP_RULE_ID

执行以下命令,创建安全组"SG_cli"。

bash 复制代码
# group安全组
openstack security group create SG_cli

执行以下命令,查看安全组列表。

bash 复制代码
# group安全组
openstack security group list

记录安全组"SG_cli"的ID。

执行以下命令,添加安全组"SG_cli"的ICMP 规则,要求配置如下:

⚫ 规则:All ICMP。

⚫ 方向:Ingress。

⚫ 远端:CIDR。

⚫ CIDR:0.0.0.0/0。

bash 复制代码
# group安全组
openstack security group rule create --protocol icmp --ingress --remote-ip 0.0.0.0/0 SG_cli

执行以下命令,添加安全组"SG_cli"的TCP 规则,要求配置如下:

⚫ 规则:All TCP。

⚫ 方向:Ingress。

⚫ 远端:CIDR。

⚫ CIDR:0.0.0.0/0。

bash 复制代码
# group安全组
openstack security group rule create --protocol tcp --ingress --remote-ip 0.0.0.0/0 SG_cli

执行以下命令,查看安全组"SG_cli"的规则列表。

bash 复制代码
# group安全组
openstack security group rule list | grep SECURITY_GROUP_ID

执行以下命令,为虚拟机实例移除安全组"default"。

bash 复制代码
# 移除虚拟机实例
openstack server remove security group Instance_cli_test-3 default

执行以下命令,为虚拟机实例添加安全组"SG_cli"。

bash 复制代码
# 添加虚拟机实例
openstack server add security group Instance_cli_test-3 SG_cli

执行以下命令,再次查看虚拟机实例"Instance_cli_test-3"当前应用的安全组。

bash 复制代码
# 查看虚拟机实例
openstack server show Instance_cli_test-3 | grep security_groups

再次验证是否能够从外部Ping 通虚拟机实例"Instance_cli_test-3"。

使用SSH 登录虚拟机实例"Instance_cli_test-3",验证是否成功。

相关推荐
为思念酝酿的痛1 小时前
传输层协议UDP
linux·网络·udp
szarron1 小时前
HTOOL‑SA12 + HT06 近场探头组合实操|手持设备工位 EMI 预兼容排查完整流程
运维·服务器·开发语言·网络·射频工程·频谱仪
杨云龙UP1 小时前
DB2 HADR 主备架构活动日志参数优化操作手册
linux·运维·服务器·数据库·db2·db2 hadr·日志参数调整
我是大猴子1 小时前
MyBatis‑Plus & MyBatis‑Flex 区别
java·服务器·数据库
csdn_aspnet2 小时前
如何从电脑主机拷东西到VWmare虚拟机
linux·运维·服务器·windows·vmware·虚拟机
码农幻想梦2 小时前
“找不到 www.bilibili.com 的服务器 IP 地址”解决办法
运维·服务器·tcp/ip
gf13211112 小时前
python_调用远程服务器上的openclaw
服务器·python·php
czt_java2 小时前
网络核心初识:OSI七层、TCP/IP模型与数据传输全过程
网络·tcp/ip·php
那年窗外下的雪.2 小时前
AIDC 学习日志|第 25 天|设备输出反推、MAC Flapping 与 EAD 撤销
前端·网络·git·学习·macos