Neutron 的设计目标是实现“网络即服务”,为了达到这一目标,在设计上遵循了基于“软件定义网络”实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网络相关的技术
涉及的linux网络技术如下:
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 中的资源之间彼此不可
以neutron的gre模式为例,简化示意如下
一、命名空间
在 Linux 中,命名空间(namespace)可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。
可以用ip netns list命令来查看已经存在的名字空间。
ip net list
qdhcp开头的名字空间是dhcp服务器使用的,qrouter开头的则是router服务使用的。 可以通过 ip netns exec namespaceid command 来在指定的网络名字空
间中执行网络命令,例如
ip netns exec qdhcp-3bb9ca55-d2e5-45eb-b782-e4de1f60014a ip addr
可以看到,dhcp服务的网络命名空间只有有一个网络接口"aa08fc00-39",它通过"tapa08fc00-39"连接到br-int上。
1.1DHCP服务
dhcp服务是通过dnsmasq进程(轻量级服务器,可以提供dns、dhcp、tftp等服务)来实现的,该进程绑定到dhcp名字空间中的br-int的接口上。可以查看相关的进程
例如查询”qdhcp-3bb9ca55-d2e5-45eb-b782-e4de1f60014a“的服务进程
ps -ef |grep 3bb9ca55-d2e5-45eb-b782-e4de1f60014a
此dhcp服务,主要是给租户私有网络提供dhcp服务,在openstack的dashboard显示如下:
2.1 路由服务
router是提供跨 subnet 的互联功能的。比如用户的内部网络中主机想要访问外部互联网的地址,就需要router来转发(因此,所有跟外部网络的流量都必须经过router)。目前router的实现是通过iptables进行的。
同样的,router服务也运行在自己的名字空间中,可以通过如下命令查看:
ip netns exec qrouter-014e0e10-47fc-469f-9883-3a5130fc79e6 ip addr
可以看出,该名字空间中包括两个网络接口。
第一个接口 qr-d1a40252-8b(192.168.1.1/24)跟 br-int 上的接口相连。即任何从 br-int 来的找 192.168.1.0/24 (租户的私有网段)的网包都会到达这个接口。