分享

OpenStack 网络常用知识

 yi321yi 2020-08-11

在OpenStack的学习道路上,折在网络大坑的人不在少数。从网络的物理设备到网络的逻辑配置,甚至架构都要熟悉。比如要知道简单的VLAN、Flat、DHCP、Bridge(Linux bridge或者ovs)、NAT以及路由,甚至是SDN等技术。本文梳理了一些常用的相关知识。

OpenStack 网络相关概念

bridge:网桥,Linux中用于表示一个能连接不同网络设备的虚拟设备,linux中传统实现的网桥类似一个hub设备,而ovs管理的网桥一般类似交换机。

br-int:bridge-integration,综合网桥,常用于表示实现主要内部网络功能的网桥。

br-ex:bridge-external,外部网桥,通常表示负责跟外部网络通信的网桥。

GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式。在openstack中一般是基于L3的gre,即original pkt/GRE/IP/Ethernet

VETH:虚拟ethernet接口,通常以pair的方式出现,一端发出的网包,会被另一端接收,可以形成两个网桥之间的通道。

qvb:neutron veth, Linux Bridge-side

qvo:neutron veth, OVS-side

TAP设备:模拟一个二层的网络设备,可以接受和发送二层网包。

TUN设备:模拟一个三层的网络设备,可以接受和发送三层网包。

iptables:Linux 上常见的实现安全策略的防火墙软件。

Vlan:虚拟 Lan,同一个物理 Lan 下用标签实现隔离,可用标号为1-4094。

VXLAN:一套利用 UDP 协议作为底层传输协议的 Overlay 实现。一般认为作为 VLan 技术的延伸或替代者。

namespace:用来实现隔离的一套机制,不同 namespace 中的资源之间彼此不可见。

OpenStack中根据权限不同网络可分为几种?

Provider network:管理员创建的和物理网络有直接映射关系的虚拟网络。

Tenant network:租户普通用户创建的网络,物理网络对创建者透明,其配置由Neutron根据管理员在系统中的配置决定。

OpenStack中根据网络类型不同网络可分为几种?

Flat network:基于不使用 VLAN 的物理网络实现的虚拟网络。每个物理网络最多只能实现一个虚拟网络。

local network(本地网络):一个只允许在本服务器内通信的虚拟网络,不进行跨服务器的通信。主要用于单节点上测试。

VLAN network(虚拟局域网) :基于物理 VLAN 网络实现的虚拟网络。共享同一个物理网络的多个 VLAN 网络是相互隔离的,甚至可以使用重叠的 IP 地址空间。每个支持 VLAN network 的物理网络可以被视为一个分离的 VLAN trunk,它使用一组独占的 VLAN ID。有效的 VLAN ID 范围是 1 到 4094。

GRE network (通用路由封装网络):一个使用 GRE 封装网络包的虚拟网络。GRE 封装的数据包基于 IP 路由表来进行路由,因此 GRE network 不和具体的物理网络绑定。

VXLAN network(虚拟可扩展网络):基于 VXLAN 实现的虚拟网络。同 GRE network 一样, VXLAN network 中 IP 包的路由也基于 IP 路由表,也不和具体的物理网络绑定。

OpenStack中计算节点的集成桥(br-int)的作用是什么?

集成桥(br-int)对来自和运行在计算节点上的实例的流量执行 VLAN 标记和取消标记。

数据包从实例的 n/w 接口发出使用虚拟接口 qvo 通过 Linux 桥(qbr)。qvb 接口是用来连接 Linux 桥的,qvo 接口是用来连接集成桥的。集成桥上的 qvo 端口有一个内部 VLAN 标签,这个标签是用于当数据包到达集成桥的时候贴到数据包头部的。

OpenStack中外部OVS桥(br-ex)的作用是什么?

外部OVS网桥转发来往网络的流量,以允许外部访问实例。br-ex 连接物理接口比如 eth2,这样用户网络的浮动 IP 数据从物理网络接收并路由到用户网络端口。

OpenStack中计算节点的隧道桥(br-tun)的作用是什么?

隧道桥(br-tun)根据 OpenFlow 规则将 VLAN 标记的流量从集成网桥转换为隧道 ID。

隧道桥允许不同网络的实例彼此进行通信。隧道有利于封装在非安全网络上传输的流量,它支持两层网络,即 GRE 和 VXLAN。

OpenStack中网络流向是怎样的,都经过网络控制器吗?

这里分几个场景,简单描述下(采用ovs-vlan模式):

场景一:相同物理机上的虚拟机互相访问

vm1和vm2在同一个宿主机上同一个项目下同一个子网时,两个虚机之间的流量是不需要经过交换机的,直接通过ovs的br-int桥就可以做转发了。

场景二:不同物理机上的虚拟机互相访问

vm1和vm2在同一个宿主机上同一个项目下同一个子网时,两个虚拟机之间的流量是需要通过物理交换机进行转发的

vm的流量首先经过tap网卡到qbr桥上,qbr桥是linux-bridge桥,曾经的ovs不支持安全组的实现所以openstack只能加一个qbr桥在上面通过iptables来实现安全组,(mitaka版本中已经没有了因为ovs已经可以通过openflow来实现了),通过veth口将br-int和qbr桥连接起来,流量到br-int上,br-int上有对应的ovs规则转发到br-eth0上,,br-eth0 中的 flow rules。从 patch port 进入的数据帧,将内部 local_id 修改为vlan_id,再从 eth0 端口发出。通过交换机到达另外一个计算机节点。

eth0收到包后通过ovs规则将流量转到br-int,br-int将vlan_id转换为对应的local_id,然后通过veth口发给qbr,通过qbr后转vm的tap的网卡经过内核转发到vm的网卡。

场景三:访问外部网络  

需要经过网络节点,由网络节点的qroute做三层转发,也可以直接使用物理交换机。不同子网的通信,虚机会将流量丢给默认网关然后到达网络节点的qrouter通过qrouter的三层转发通讯。

OpenStack网络中如何显示交换机的所有Flow入口?

可以使用命令 ovs-ofctl dump-flows 来查看交换机的 flow 入口。

假设我们想显示 OVS 集成桥(br-int)的所有 flow 入口,可以使用如下命令:

ovs-ofctl dump-flows br-int

OpenStack网络中OpenFlow规则的作用是什么?

OpenFlow 规则是一种机制,这种机制定义了一个数据包如何从源到达目的地。OpenFlow 规则存储在 flow 表中。flow 表是 OpenFlow 交换机的一部分。

当一个数据包到达交换机就会被第一个 flow 表检查,如果不匹配 flow 表中的任何入口,那这个数据包就会被丢弃或者转发到其他 flow 表中。

以上内容综合自twt社区和网络,更深入的学习还需要到OpenStack官网学习,疑难问题求解或技术交流,欢迎到twt社区

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多