目录
概述
Neutron是OpenStack项目中负责提供网络服务的组件,它基于软件定义网络的思想,实现了网络虚拟化下的资源管理。
涉及Linux网络技术
- bridge:网桥,Linux中表示一个能连接不同网络设备的虚拟设备,Linux中传统实现的网桥类似一个hub设备,而ovs管理的网桥一般类似交换机。
- br-int:bridge-integration,综合网桥,常用于表示实现主要内部网络功能的网桥。
- br-ex:bridge-external,外部网桥,通常表示负责和外部网络通信的网桥。
- GRE:General Routing Encapsulation,一种通过封装来实现隧道的方式,在OpenStack中一般是基于L3的GRE,即original pkt/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中的资源之间彼此不可见。
基本概念
Neutron下面管理下面的实体:
- 网络:隔离的L2域,可以是虚拟、逻辑或交换。
- 子网:隔离的L3域,IP地址块。其中每一个机器都有一个IP,同一个子网的主机彼此L3可见。
- 端口:网络上虚拟、逻辑或交换端口。所有这些实体都是虚拟的,拥有自动生成的唯一标识ID,支持CRUD功能,并在数据库中跟踪记录状态。
网络
隔离的L2广播域,一般是创建它的用户所有。用户可以拥有多个网络。网络是最基础的,子网和端口都需要关联到网络上。
网络上可以有多个子网。用一个网络上的主机一般可以通过交换机或路由器连通起来。
子网
隔离的L3域,子网代表了一组分配了IP的虚拟机。每个子网必须有一个CIDR和关联到一个网络。IP可以从CIDR或者用户指定池中选取。
子网可能会有一个网关、一组DNS和主机路由。不同子网之间L3是互相不可见的,必须通过一个三层网关(即路由器)经过L3进行通信。
端口
可以进出流量的端口,往往绑定上若干MAC地址和IP地址,以进行寻址。一般为虚拟交换机上的虚拟接口。
虚拟机挂载网卡到端口上,通过端口访问网络。当端口有IP的时候,意味着它属于某个子网。
抽象系统架构
TODO
在启用DVR特性(J版本以后支持)之前,所有流量(东西向、南北向)都需要经过网络节点的转发。DVR特性则允许东西流量和带有Floating IP的南北流量不经过网络节点的转发,直接从计算节点的外部网络出去。
网络命名空间
在Linux中,网络命名空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络命名空间经常用来隔离网络设备和服务,只有拥有同样网络命名空间的设备,才能看到彼此。
1 | ip netns |
qdhcp开头的命名空间时dhcp服务使用的,qrouter开头的则是router服务使用的。可以通过ip netns exec [namespace] [command],在指定网络命名空间中执行网络命令。
1 |
dhcp服务
dhcp服务是通过dnsmasq进程(轻量级服务器,可以提供dns、dhcp、tftp等服务)来实现的,该进程绑定到dhcp命名空间中的br-int的接口上。可以查看相关进程。
1 |
router服务
router是提供跨subnet(子网)的互联功能的。用户的内部网络中主机想要访问外部互联网的地址,就需要router来转发(因此,所有跟外部网络的流量都必须经过router)。目前router的实现是通过iptables进行的。
TODO
GRE模式
TODO
在OpenStack中,所有网络有关的逻辑管理均在Network节点中实现,例如DNS、DHCP以及路由等。Compute节点上只需要对所部署的虚拟机提供基本的网络功能支持,包括隔离不同租户的虚拟机和进行一些基本的安全策略管理(Security Group)。
计算节点
以抽象系统架构的图表为例,Compute节点上包括两台虚拟机VM1和VM2,分别经过一个网桥(如qbr-xxx)连接到br-int网桥上。br-int网桥再经过br-tun网桥(物理网络是GRE实现)连接到物理主机外部网络。
对于物理网络通过VLAN来隔离的情况,则一般会存在一个br-eth网桥,替代br-tun网桥。
qbr
在VM1中,虚拟机的网卡实际上接到了物理机的一个TAP设备(即A,常见名称如tap-xxx)上,A则进一步通过VETH pair(A-B)连接到网桥qbr-xxx的端口vnet0(端口B)上,之后再通过veth pair(C-D)连接到br-int网桥上。一般C的名称为qvb-xxx,而D的名称为qvo-xxx。
br-int
一个典型的br-int的端口如下所示:
1 | ovs-vsctl show |
其中:
- br-int为内部端口。
- patch-tun(即端口E,端口号为1)连接到br-tun上,实现到外部网络的隧道。
- qvo-xxx(即端口D,端口号为2)带有tag 1,说明这个口是一个1号VLAN的access口。从虚拟机发出的从该端口到达br-int的网包将自动带上VLAN tag 1,而其他带有VLAN tag 1的网包则可以去掉VLAN Tag后从该端口发出(即VLAN access端口)。这个VLAN tag是用来实现不同网络相互隔离的,比如租户创建一个网络,则会被分配一个唯一的VLAN tag。
br-in在GRE模式中作为一个NORMAL交换机使用,因此有效规则只有一条正常转发。如果两个在同一个主机上的VM属于同一个tenant的(同一个VLAN tag),则它们之间的通信只需要经过br-int即可。
1 | ovs-ofctl dump-flows br-int |
br-tun
一个典型的br-tun上的端口类似:
1 | ovs-vsctl show |
其中:
- patch-int(即端口F,端口号为1)是连接到br-int上的veth pair的端口。
- gre-1端口(即端口G,端口号为2)对应VM到外面的隧道。gre-1端口是虚拟gre端口,当网包发送到这个端口的时候,会经过内核封包,然后从10.0.0.101发送到10.0.0.100,即从本地的物理网卡(10.0.0.101)发出。
br-tun将带有VLAN tag的VM跟外部通信的流量转换到对应的gre隧道,上面要实现主要的转换逻辑,规则要复杂,一般通过多张表来实现。
典型的转发规则为:
TODO
网络节点
br-tun
1 | ovs-vsctl show |
Compute节点上发往GRE隧道的网包最终抵达Network节点上的br-tun,该网桥的规则包括:
1 | ``` |
该集成网桥上挂载了很多进程来提供网络服务,包括路由器、DHCP服务器等。这些进程不同的租户可能都需要,彼此的地址空间可能冲突,也可能跟物理网络的地址空间冲突,因此都运行在独立的网络命名空间中。规则跟Compute节点的br-int规则一致,表现为一个正常的交换机。
1 | ovs-ofctl dump-flows br-int |
br-ex
1 | ovs-vsctl show |
br-ex上直接连接到外部物理网络,一般情况下网关在物理网络中已经存在,直接转发即可。
1 | ovs-ofctl dump-flows br-ex |
如果对外部网络的网关地址配置到了br-ex(br-ex作为一个网关)。
1 | ip addr add 172.24.4.225/28 dev br-ex |
需要将内部虚拟机发出的流量进行SNAT,之后发出。
1 | iptables -A FORWARD -d 172.24.4.224/28 -j ACCEPT |
VLAN模式
VLAN模式下的系统架构和GRE模式下类似。
TODO
计算节点
TODO
1 | ovs-vsctl show |
类似GRE模式下,br-int负责租户隔离,br-eth1负责跟计算节点外的网络通信。在VLAN模式下,租户的流量隔离是通过vlan来进行的,因此此时包括两种VLAN,虚拟机在计算节点内带有VLAN Tag的Local VLAN和在计算节点之外物理网络上隔离不同租户的VLAN。
br-int和br-eth1分别从端口int-br-eth1和phy-别人-二天后1上到达的网包进行VLAN Tag的处理。此处有两个网,分别带有两个VLAN Tag(内部Tag1对应外部Tag101,内部Tag2对应外部Tag102)。其中安全组策略仍然在qbr相关的iptables上实现。
br-int
与GRE模式不同的是,br-int完成从br-eth1上过来流量(从int-br-eth1到达)的VLAN Tag转换,可能的规则为。
1 | ovs-ofctl dump-flows br-int |
br-eth1
br-eth1上负责从br-int上过来的流量(从phy-br-eth1到达),实现Local VLAN到外部VLAN的转换。
1 | ovs-ofctl dump-flows br-eth1 |
网络节点
类似GRE模式下,br-eth1收到到达的网包,int-br-eth1和phy-br-eth1上分别进行VLAN转换,保证到达br-int上的网包都是带有内部VLAN Tag,到达br-eth1上的都是带有外部VLAN Tag。br-ex则完成到OpenStack以外网络的连接。查看网桥信息,包括三个网桥br-eth1、br-int和br-ex。
br-eth1
br-eth1主要负责把物理网络上外部VLAN Tag转化为Local VLAN。
1 | ovs-ofctl dump-flows br-eth1 |
br-int
br-in上面挂载了大量的agent来提供各种网络服务,另外负责对发往br-eth1的流量,实现Local VLAN转化为外部VLAN。
1 | ovs-ofctl dump-flows br-int |
dnsmasq负责提供DHCP服务,绑定到某个特定的命名空间上,每个需要DHCP服务的租户网络有自己专属隔离的DHCP服务。
路由是L3 Agent来实现的,每个子网在br-int上有一个端口(qr-YYY和qr-ZZZ,已配置IP,分别是各自内部子网的网关),L3 Agent绑定到上面。要访问外部的公共网络,需要通过L3 Agent发出,而不是经过int-br-ex到phy-br-ex(实际上并没有网包从这个veth pair运输)。如果,使用外部可见的Floating IP,L3 Agent仍然需要通过iptables来进行NAT。
每个L3 Agent或dnsmasq都在各自独立的命名空间中。下图,其中同一租户的两个子网都是用了同一个路由器。
TODO
对于子网使用不同路由器的情况,多个路由器会在自己独立的命名空间中。
br-ex
br-ex要做的事情很简单,只需要正常转发即可。
1 | ovs-ofctl dump-flows br-ex |
VXLAN模式
VXLAN模式下,网络的架构和GRE模式类似,不同的是,不同节点之间通过VXLAN隧道互通,即虚拟化层采用的是VXLAN协议。
其中,节点网络配置如下所示,注意网络接口需要IP地址,因为隧道协议需要底下的三层转发来支持。
控制节点
- eth0:192.168.100.10/24作为管理网络(同时也是公共网络)
- eth1:10.0.100.10/24作为数据网络接口。
计算节点
- eth0:192.168.100.20/24作为管理网络(同时也是公共网络)
- eth1:10.0.100.20/24作为数据网络接口。
计算节点
主要包括两个网桥:集成网桥br-int和隧道网桥br-tun。
1 | ovs-vsctl show |
安全网桥可以通过brctl show命令看到,该网桥主要绑定控制组的iptables规则,跟转发无直接关系。
1 | brctl show |
br-int
集成网桥br-int规则比较简单,作为一个正常的二层交换机使用。无论下面虚拟化层是哪种技术实现,集成网桥是看不到的,只知道根据VLAN和MAC地址进行转发。
所连接口除了从安全网桥过来的qvo-xxx(每个虚拟机都会有一个),就是一个往外的patch-tun接口,连接到br-tun。
其中,qvo-xxx接口上会为每个网络分配一个内部VLAN号。
1 | 19:12:08.198164 IP 10.88.188.2 > 10.88.188.161: ICMP echo request, id 36561, seq 41, length 64 |
1 | ip netns exec qrouter-3405c17d-82f2-4b23-96fd-ff2828c94acc iptables -t nat -vnL neutron-l3-agent-float-snat |