目录

  1. 概述
  2. 涉及Linux网络技术
  3. 基本概念
    1. 网络
    2. 子网
    3. 端口
    4. 抽象系统架构
      1. TODO
    5. 网络命名空间
    6. dhcp服务
    7. router服务
      1. TODO
  4. GRE模式
    1. TODO
    2. 计算节点
      1. qbr
      2. br-int
      3. br-tun
        1. TODO
    3. 网络节点
      1. br-tun
      2. br-ex
  5. VLAN模式
    1. TODO
    2. 计算节点
      1. TODO
      2. br-int
      3. br-eth1
    3. 网络节点
      1. br-eth1
      2. br-int
        1. TODO
      3. br-ex
      4. VXLAN模式
        1. 计算节点
          1. br-int

概述

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
2
3
ip netns
qdhcp-xxxx-xxxx-xxxx-xxxx
qrouter-xxxx-xxxx-xxxx-xxxx

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。

注意,它们的名称除了前缀外,后面的ID都是一样的,表示位于同一个虚拟机网络到物理机网络的连接上。

之所以TAP设备A没有直接连接到网桥br-int上,是因为OpenStack需要通过iptables实现security group的安全策略功能。目前OpenvSwitch并不支持应用iptables规则的TAP设备。

因为qbr的存在主要是为了辅助iptables来实现security group功能。有时也被称为安全网桥。

br-int

一个典型的br-int的端口如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
ovs-vsctl show 
Bridge br-int
Port "qvo-xxx"
tag: 1
Interface: "qvo-xxx"
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port br-int
Interface br-int
type: internal

其中:

  • 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
2
3
ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=1000s, table=0, n_packets=200, n_bytes=2100, idle_age=13, priority=1 actions=NORMAL

br-tun

一个典型的br-tun上的端口类似:

1
2
3
4
5
6
7
8
9
10
11
12
13
ovs-vsctl show 
Bridge br-tun
Port "gre-1"
Interface: "gre-1"
type: gre
options: {in_key=flow, local_ip="10.0.0.101", out_key=flow, remote_ip="10.0.0.100"}
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port br-tun
Interface br-tun
type: internal

其中:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
ovs-vsctl show 
Bridge br-tun
Port "gre-2"
Interface: "gre-2"
type: gre
options: {in_key=flow, local_ip="10.0.0.100", out_key=flow, remote_ip="10.0.0.101"}
Port patch-int
Interface patch-int
type: patch
options: {peer=patch-tun}
Port br-tun
Interface br-tun
type: internal

Compute节点上发往GRE隧道的网包最终抵达Network节点上的br-tun,该网桥的规则包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
```

这些规则跟Compute节点上br-tun的规则相似,完成tunnel跟VLAN之间的转换。

### br-int
```bash
ovs-vsctl show
Bridge br-int
Port "qr-xxx"
tag: 1
Interface: "qvo-xxx"
type: internal
Port patch-tun
Interface patch-tun
type: patch
options: {peer=patch-int}
Port "tap-xxx"
tag: 1
Interface "tap-xxx"
type: internal

该集成网桥上挂载了很多进程来提供网络服务,包括路由器、DHCP服务器等。这些进程不同的租户可能都需要,彼此的地址空间可能冲突,也可能跟物理网络的地址空间冲突,因此都运行在独立的网络命名空间中。规则跟Compute节点的br-int规则一致,表现为一个正常的交换机。

1
2
3
ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=1000s, table=0, n_packets=200, n_bytes=2100, idle_age=13, priority=1 actions=NORMAL

br-ex

1
2
3
4
5
6
7
8
9
10
ovs-vsctl show 
Bridge br-ex
Port "eth1"
Interface: "eth1"
Port br-ex
Interface br-ex
type: internal
Port "qg-xxxx"
Interface "qg-xxxx"
type: internal

br-ex上直接连接到外部物理网络,一般情况下网关在物理网络中已经存在,直接转发即可。

1
2
3
ovs-ofctl dump-flows br-ex
NXST_FLOW reply (xid=0x4):
cookie=0x0, duration=1000s, table=0, n_packets=200, n_bytes=2100, idle_age=13, priority=1 actions=NORMAL

如果对外部网络的网关地址配置到了br-ex(br-ex作为一个网关)。

1
ip addr add 172.24.4.225/28 dev br-ex

需要将内部虚拟机发出的流量进行SNAT,之后发出。

1
2
3
iptables -A FORWARD -d 172.24.4.224/28 -j ACCEPT
iptables -A FORWARD -s 172.24.4.224/28 -j ACCEPT
iptables -t nat -I POSTROUTING 1 -s 172.24.4.224/28 -j MASQUERADE

VLAN模式

VLAN模式下的系统架构和GRE模式下类似。

TODO

需要注意的是,在VLAN模式下,VLAN tag的转换需要在br-int和br-ethx两个网桥上进行相互配合。即br-int负责从int-br-ethx过来的包(带外部VLAN tag)转换为内部VLAN,而br-ethx负责从phy-br-ethx过来的包(带内部VLAN)转化为外部的VLAN。

计算节点

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
2
3
4
19:12:08.198164 IP 10.88.188.2 > 10.88.188.161: ICMP echo request, id 36561, seq 41, length 64
19:12:08.198258 IP 10.88.188.2 > 10.0.0.20: ICMP echo request, id 36561, seq 41, length 64
19:12:08.199952 IP 10.0.0.20 > 10.88.188.2: ICMP echo reply, id 36561, seq 41, length 64
19:12:08.200084 IP 10.88.188.161 > 10.88.188.2: ICMP echo reply, id 36561, seq 41, length 64
1
2
3
4
5
ip netns exec qrouter-3405c17d-82f2-4b23-96fd-ff2828c94acc iptables -t nat -vnL neutron-l3-agent-float-snat
Chain neutron-l3-agent-float-snat (1 references)
pkts bytes target prot opt in out source destination
1 84 SNAT all -- * * 10.0.0.20 0.0.0.0/0 to:10.88.188.161