OpenStack的实例在启动过程中能够从Neutron提供的DHCP服务自动获取IP地址。
DHCP代理( neutron-dhcp-agent) :为项目网络提供DHCP功能,提供元数据请求(Metadata request)服务。
DHCP驱动:用于管理DHCP服务器,默认为DNSmasq,这是有1个提供DHCP和DNS服务的开源软件,提供DNS缓存和DHCP服务功能。
DHCP代理调度器(Agent Scheduler) :负责DHCP代理与网络(Network) 的调度。
Neutron DHCP提供两类REST API接口: Agent Managerment Extension API和Agent Scheduler Extension API,这两类API都是extension API DHCP代理是核心组件,完成以下任务。
定期报告DHCP代理的网络状态,通过RPC报告给Neutron-server,然后通过Core Plugin报告给数据库并进行更新网络状态。
启动dnsmasq进程,检测gdhcp-xxx名称(Namespace)中的ns-xxx端口接收到DHCP DISCOVER请求,在启动dnsmasq进程的过程中,决定是否需要创建名称空间中的ns-xxx端口,是否需要配置名称空间中的iptables,是否需要刷新dnsmasq进程所需的配置文件。
创建网络(Network) 并在子网(subnet)上启用 DHCP时,网络节点上的DHCP代理会启动一个dnsmasq进程为网络提供DHCP服务。dnsmasq 与网络(network) 是一一对 应关系,一个dnsmasq进程可为同一网络中 所有启动DHCP的子网(Subnet) 提供服务
DHCP代理配置文件是/etc/neutron/dhcp_agent.ini
其中有重要的配置选项有二个。
[root@ct ~(keystone_ admin)]# grep -vE ‘#|$’ /etc/neutron/dhcp_ agent.ini
1、interface_driver:用来创建TAP设备的接口驱动,
2、 dhcp_driver:指定DHCP启动,默认值为neutron.agent.linux.dhcp.Dnsmasq 表示dnsmasq进程来实现DHCP服务
DHCP代理运行在网络节点上,DHCP 为项目网络提供DHCP服务IP地址动态配,另外还会提供源数据请求服务。工作机制如下:
通过DHCP获取IP地址过程如下。
(1)创建实例时,Neutron随机生成MAC并从配置数据中分配一个固定的IP地址,一起保存到dnsmasq的hosts文件中,让dnsmasq进程做好准备。
(2)与此同时,Nova-compute 会设置Mac地址。
(3)实例启动,发出DHCPDISCOVER广播,该广播消息在整个网络中都可以被收到。
(4)广播消息到达dnsmasq监听Tap接口。dnsmasq 收到后检查hosts文件,发现有对应项,它以DHCPOFFER消息将IP和网关IP发回到虚拟机实例
(5)虚拟机实例发回DHCPREQUEST消息确认接收DHCPOFFER
(6)dnsmasq发回确认消息DHCPACK,整个过程结束。
在介绍DHCP服务时提到的linux网络名称空间 (Network Namespace简称netns ) 是linux提供的一种内核级别的网络环境隔离方法,Namespace也可以翻译称为命名空间或者叫名字空间。
当前linux支持 6种不同类型的名称空间,网络名称空间是其中一种。
在二层网络上,VLAN可以将一个物理交换机分割成几个独立的虚拟交换机。
类似地,在三层网络上,Linux 网络名称空间可以将一个物理三层网络分割成几个独立的虚拟三层网络。作为一种资源虚拟机隔离机制。
1、在Linux中,网络空间可以被认为是隔离的拥有单独网络栈 (网络接口、路由、iptables等) 的环境,它经常用来隔离网络资源 (设备和服务),只有拥有同样网络名称空间的设备才能批次访问。
2、它还能提供了在名称空间内运行进程的功能,后台进程可以运行不同名称空间内的相同端口上,用户还可以虚拟出一块网卡。
3、可以创建一个完全给力的全新网络环境,包括独立的网络接口、路由表、ARP表,IP地址表、iptables 或ebtables 等,与网络有关的组件都是独立的。
4、网络名称空间内部通信没有问题,但是被隔离的网络名称空间之间要进行通信,就必须采用特定方法,即VETH对,VETH对是一种成对出现的网络设备,他们像一根虚拟的网络线,可用于连接两个名称空间,向VETH对一端输入的数据将自动转发到另外一端。
例如:创建两个网络名称空间的netns1和netns2并使他们之间通信,可以执行以下步骤
1、创建两个网络名称空间
ip netns add netns1
ip netns add netns2
2、创建一个 VETH对
ip link add veth1 type veth peer name veth2
创建的一对VETH虚拟接口类似管道 (pipe),发给veth1的数据包可以在veth2收到,发给veth2的数据包可以在veth1收到,相当于安装两个接口并用网线连接起来。
3、将上述两个VETH虛拟接口分别放置到两个网络名称空间中
ip link set veth1 netns netns1
ip link set veth2 netns netns2
这样两个VETH虚拟接口就分别出现在两个网络名称空间中,两个空间的网络就打通了,其中的设备可以相互访问。
2、linux网络名称空间实现DHCP服务隔离
Neutron通过网络名称空间为每个网络提供独立的DHCP和路由服务,从而允许项目创建重叠的网络,如果没有这种隔离机制,网络就不能重叠,这样就失去了很多灵活性
每个dnsmasq进程都位于独立的网络名称空间,命名为gdhcp-xxx
以创建flat网络为例,Neutron自动新建该网络对应的网桥brqfxxx,以及DHCP的Tap设备tapxxx。物理主机本身也有一个网络名称空间,称为root,拥有一个回环设备 (Loopback Device) 如果DHCP的Tap 虚拟接口放置到 gdhcp-xxx名称空间,该Tap虚拟接口将无法直接与root名称空间中网桥设备brgxxx连接。为此,Neutron 使用 VETH对来解决这个问题,添加VETH对tapxxx与ns-xxx让 gdhcp-xxx连接到 brqxxx。
3、Linux 网络名称空间实现路由器
Neutron允许在不同的网络中的子网的 CIDR 和 IP地址重叠,具有相同的IP地址的2个虚拟机也不会产生冲突,这是由于Neutron的路由器通过Linux网络名称空间实现的,每个路由器有自己的独立的路由表。
Neutron路由器是一个三层的 (L3) 的,其模拟物理路由器,为用户提供路由、NAT等服务,在OpenStack网络中,不同子网之间的通信需要路由器,项目网络与外部网络之间的通信更需要路由器。
Neutron提供虛拟路由器,也支持物理路由器。例如,两个隔离的VLAN网络之间需要实现通信,可以通过物理路由器实现,由物理路由器提供相应的IP路由表,确保两个IP子网之间的通信,将两个VLAN网络中的虚拟机默认网关分别设置为路由路由器的接口 A 和 B 的IP地址。VLAN中的虚拟机要与VLANB 中的虚拟机通信时,数据包将通过VLANA 中的物理网卡到达路由器,有物理路由器转发到VLAN B 中的物理网卡,在到目的的虚拟机。
路由器相当于默认网关
节点A和B是两个服务器,通过接口连接路由器,进行通信。
Neutron的虚拟路由器使用软件模拟物理路由器,路由实现机制相同。Neutron 的路由服务由L3代理提供。
L3代理提供的虚拟机路由器通过虚拟接口连接到子网,一个子网一个接口,该接口的地址是该子网的网关地址,虚拟机的IP地址栈如果发现数据包的目的IP地址不在本网段,则会将其发到路由器上对应其子网的虚拟机接口,然后,虚拟机路由器根据配置的路由规则和目的IP地址将包转发到目的端口发出。
L3代理会将每个路由器创建一个网络名称空间,通过VETH对于TAP相连,然后将网关IP配置在位于名称空间的VETH接口上,这样就能够提供路由,网络节点如果不支持linux名称空间,则只能运行一个虚拟路由器。
在云环境下用户可以按照自己的规划创建网络,不同的项目(租户) 的网络IP地址可能会重叠,为实现此功能,L3 代理使用 linux 网络名称空间来提供隔离的转发上下文,隔离不同的项目(租户)的网络,每个L3代理运行在一个名称空间中.
每个名称空间由: grouter- 命名
L3代理通过在iptables表中增加POSTROUTING链来实现源地址转换,既内网计算机访问外网时,发起访问的内网IP地址(源IP地址)转换为外网网关的IP地址。这种功能让虚拟机实例能够直接访问外网。不过外网计算机还不能直接访问虚拟机实例,因为实例没有外网IP地址,而目的地址转化就能解决这一问题。
项目(租户)网络连接到Neutron路由器,通常将路由器作为默认的网关,当路由器收到实例的数据包并将其转发到外网时。路由器会将数据包的源地址修改成自己的外网地址,确保数据包转发到外网,并能够从外网返回,路由器修改返回的数据包,并转发之间发起访问的实例。
Neutron 需要设置浮动IP地址支持从外网访问项目(租户)网络中的实例。每个浮动IP唯一对应一个路由器; 浮动IP到关联的端口,在到所在的子网,最后到包含改子网及外部子网路由器。创建浮动IP时。在Neutron分配IP地址后,通过RPC通知该浮动IP地址对应的路由器去设置该浮动IP对应的iptabels规则,从外网访问虚拟机实例时,目的IP地址为实例的浮动IP地址,因此必须由iptables将其转化成固定的IP地址,然后在将其路由到实例。L3 代理通过在iptables表中增加POSTROUTING链来实现地址转换。
浮动IP地址是提供静态NAT功能,建立外网IP地址与实例所在的项目(租户网络) IP地址的一对一映射, 浮动IP地址配置在路由器提供网关的外网接口上,而不是在实例中,路由器会根据通信的方向修改数据包的源或者是目的地址,这是通过在路由器上应用iptables的NAT规则实现的。
一旦设置浮动IP地址后,源地址转换就不在使用外网关的IP地址了,而是直接使用对应的浮动IP地址,虽然相关的NAT规则依然存在,但是neutron-l3-agent-float snat比neutron-l3-agent-snat更早执行。
安全组定义了那些进入的网络流量能被转发给虚拟机实例。安全组包含一些防火墙策略,称为安全组规则(Security Group rule) , 可以定义若干个安全组。每个安全组可以有若千调规则。可以给每个实例绑定若干个安全组。
安全组的原理是通过iptables.对是咧所在的计算机节点的网络流量进行过滤。安全组规则作用在实例的端口上,具体是在连接实例的计算节点上的linux网桥上实施。
FWaas(Firewall-as-a-Service) 是一种基于Neutron L3 Agent 的虚拟防火墙,是Neutron的一个高级服务。通过FWaas,OpenStack 可以将防火墙应用到项目(租户)、路由器、路由器端口和虚拟机端口、在子网边界上对三层和四层的流量进行过滤。
传统的网络中的防火墙一般在网关上,用来控制子网之间的访问。FWaaS的原理也是一样,在Neutron路由上应用防火墙规则,控制进出项目(租户)网络的数据。防火墙必须关联某个策略(Policy)。策略是规则(rule) 的集合,防火墙会按顺序因公策略中的每一条规则。规则是访问控制的规则,由源于目的子网IP、源目的端口、协议、允许(Allow)和拒绝(Deny) 动作组成。
安全组是最早的网络安全模块,其应用对象是虚拟网卡,在计算机节点上通过iptables规则控制进出实例虚拟网卡的流量。FWaaS的应用对象是虚拟路由器,可以在安全组之前控制从外部传入的流量,但是对于同一个子网内的流量不做限制。安全组保护的是实例,而FWaas保护的是子网,两者互为补充,通常部署FWaas和安全组来实现双重防护。
FWaas V1是传统方后墙方案,对路由器提供保护,将防火墙应用到路由器时,改路由器的所有内部端口受到保护,其中虚拟机2进出的数据流都会得到防火墙保护。
新的版本的FWaasV2提供了更具细粒度的安全服务,防火墙的概念防火墙组(firewall group)代替,一个防火墙 包括两项策略:入口策略(ingress policy)和出口(egress policy),防火墙组不在用于路由器级(路由器全部端口)而是路由器端口,注意,FWaas V2的配置仅提供命令行工具,不支持dashboard图形页面。