盘他!openstack名称空间、L3代理、neutron路由器和FWaas

前言

一:Linux网络名称空间

1.1:概述

  • 在介绍DHCP服务时提到的linux网络名称空间( Network Namespace简称 netns)是 linux提供的一种内核级别的网络环境隔离方法, Namespace也可以翻译称为命名空间或者叫名字空间。当前linux支持6种不同类型的名称空间,网络名称空间是其中一种,在二层网络上, VLAN可以将一个物理交换机分割几个独立的虚拟交换机。类似地,在三层网络上, Linux网络名称空间可以将一个物理三层网络分割成几个独立的虚拟三层网络。作为一种资源虚拟机隔离机制。
  • 在Linux中,网络空间可以被认为是隔离的拥有单独网络栈(网络接口、路由、 iptables等)的环境,它经常来隔离网络资源(设备和服务),只有拥有同样网络名称空间的设备才批次访问。它还能提供了在玩过名称空间内运行进程的功能,后台进程可以运行不同名称内的相同端口上,用户还可以虚拟出一块网卡
  • 可以创建一个完全隔离的全新网络环境,包括独立的网络接口、路由表、ARP表,IP地址表、 iptables或 ebtables等,与网络有关的组件都是独立的。

1.2:常用命令

  • 通常情况下可以使用ip netns add命令添加新的网络名称空间,使用ip netns list命令查看所有的网络名称空间。

  • 执行以下命令进入指定的网络名称空间。ip netns exec netns 名称 命令

    可以在指定的虚拟环境中运行任何命令,例如以下命令ip nents exec net001 bash

  • 又如,为虚拟网络环境 netns的Eth0接口增加IP地址:lp netns exec netns0 ip address add 10.0.1.1/24 eth0

1.3:VETH对

  • 网络名称空间内部通信没有问题,但是被隔离的网络名称空间之间要进行通信,就必须采用特定方法,即VETH对。
  • VETH对是一种成对出现的网络设备,他们像一根虚拟的网络线,可用于连接两个名称空间,向VETH对一端输入的数据将自动转发到另外一端。例如创建两个网络名称空间的 netns1和 netns2并使他们之间通信,可以执行以下步骤
  • 1)创建两个网络名称空间
    • iP netns add netns 1
      ip netns add netns 2
  • 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虚拟接口就分别出现在两个网络名称空间中,两个空间就打通了,其中的设备可以相互访问。

1.4:Linux网络名称空间实现DHCP服务隔离

  • Neutron通过网络名称空间为每个网络提供独立的DHCP和路由服务,从而允许项目创建重叠的网络,如果没有这种隔离机制,网络就不能重叠,这样就失去了很多灵活性
  • 每个 dnsmasq进程都位于独立的网络名称空间,命名为 qdhcp-XXX
  • 以创建flat网络为例 Neutron自动新建该网络对应的网桥 brqfxxx,以及DHCP的Tap设备tapxx。物理主机本身也有一个网络名称空间,称为root,拥有一个回环设备( Loopback Device)如果DHCP的Tap虚拟接口放置到 qdhcp-XX名称空间,该Tap虚拟接口将无法直接与root名称空间中网桥设备 brqxxx连接。
  • 为此, Neutron使用VETH对来解决这个问题,添加VETH对 tapXXX与 ns-XXX让 qdhcp-x>连接到 brqxxx

1.5:Linux网络名称空间实现路由器

  • Neutron允许在不同的网络中的子网的CIDR和IP地址重叠,具有相同的IP地址的2个虚拟机也不会产生冲突,这是由于 Neutron的路由器通过 Linux网络名称空间实现的,每个路由器有自己的独立的路由表

二:neutron路由器

  • Neutron路由器是一个三层的(L3)网络的抽象,其模拟物理路由器,为用户提供路由、NAT等服务,在 OpenStack网络中,不用子网之间的通信需要路由器,项目网络与外部网络之间的通信更需要路由器。
  • Neutron提供虚拟路由器,也支持物理路由器。例如,两个隔离的VLAN网络之间需要实现通信,可以通过物理路由器实现,由物理路由器提供相应的路由表,确保两个子网之间的通信,将两VLAN网络中的虚拟机默认网关分别设置为路由器的接口A和B的IP地址。VLAN中的虚拟机要与VLANB中的虚拟机通信时,数据包将通过VLANA中的物理网卡到达路由器,由物理路由器转发到VLANB中的物理网卡,再到目的的虚拟机
  • mark
  • Neutron的虚拟路由器使用软件模拟物理路由器,路由实现机制相同。 Neutron的路由服务由L3代理提供。

三:L3代理

3.1:概述

  • 在 Neutron中L3代理( neutron-l3 agent)具有相当重要的地位。他不仅提供虚拟机路由器,而且通过 iptables提供地址转换(SNAT、DNAT)、浮动地址( Floating IP)和安全组( security group)功能,L3代理利用Linux IP栈、路由和 iptables来实现内部网络中不同网络的虚拟机实例之间的通信,以及虚拟机实例和外部网络之间的网络流量路由和转发,L3代理可以部署在控制节点或者网络节点上

3.2:涉及的概念解释

  • 1、路由
    • L3代理提供的虚拟机路由器通过虚拟接口连接到子网,一个子网一个接口,该接口的地址是该子网的网关地址,虚拟机的IP地址栈如果发现数据包的目的IP地址不在本网段,则会将其发到路由器上对应其子网的虚拟机接口,然后,虚拟机路由器根据配置的路由规则和目的IP地址将包转发到目的端口发出。
    • L3代理会将每个路由器创建一个网络名称空间,通过VETH对与TAP相连,然后将网关IP配置在位于名称空间的VETH接口上,这样就能够提供路由,网络节点如果不支持Linux名称空间,则只能运行一个虚拟路由器。
  • 2、通过网络名称空间支持网络重叠
    • 在云环境下用户可以按照自己的规划创建网络,不同的项目(租户)的网络IP地址可能会重叠,为实现此功能,L3代理使用Linux网络名称空间来提供隔离的转发上下文,隔离不同的项目(租户)的网络,每个L3代理运行在一个名称空间中。每个名称空间由gqrouter-命名
  • 3、源地址转换( Source Network Address translation,SNAT)
    • L3代理通过在 iptables表中增加 POSTROUTING链来实现源地址转换,即内网计算机访问外网时,发起访问的内网IP地址(源IP地址)转换为外网网关的IP地址。这种功能让虚拟机实例能够直接访问外网。不过外网计算机还不能直接访问虚拟机实例,因为实例没有外网IP地址,而目的地址转化就能解决这一问题。
    • 项目(租户)网络连接到 Neutron路由器,通常将路由器作为默认的网关,当路由器收到实例的数据包并将其转发到外网时。路由器会将数据包的源地址修改成自己的外网地址,确保数据包转发到外网,并能够从外网返回,路由器修改返回的数据包,并转发之间发起访问的实例。
  • 4、目的地址转换( Destination Network Address translation dnat)与浮动IP地址
    • 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更早执行。
    • 例如:查看名称空间列表并指定iptables中的nat规则

mark

  • 5、安全组(Security Group)
    • 安全组定义了哪些进入的网络流量能被转发给虚拟机实例。安全组包含一些防火墙策略,称为安全组规则( Security Group rule),可以定义若干个安全组。每个安全组可以有若千调规则。可以给每个实例绑定若干个安全组。
    • 安全组的原理是通过 iptables对所在的计算机节点的网络流量进行过滤。安全组规则作用在实例的端口上,具体是在连接实例的计算节点上的Linux网桥上实施。

四:FWaas

4.1:概述

  • FWaas( Firewall-as-a-Service是一种基于 Neutron l3 Agent的虚拟防火墙,是 Neutron的个高级服务。通过他, OpenStack可以将防火墙应用到项目(租户)、路由器、路由器端口和虚拟机端口、在子网边界上对三层和四层的流量进行过滤。
  • 传统的网络中的防火墙一般在网关上,用来控制子网之间的访问。FWaas的原理也是样,在 Neutron路由上应用防火墙规则,控制进出项目(租户)网络的数据。防火墙必须关联某个策略( Policy)。策略是规则(πule)的集合,防火墙会按顺序因公策略中的每一条规则。规则是访问控制的规则,由源于目的子网IP、源目的端口、协议、允许(Allow)和拒绝(Deny)动作组成。
  • 安全组是最早的网络安全模块,其应用对象是虚拟网卡,在计算机节点上通过 iptables规则控制进出实例虚拟网卡的流量。FWaas的应用对象是虚拟路由器,可以在安全组之前控制从外部传入的流量,但是对于同一个子网内的流量不做限制。安全组保护的是实例,而FWaas保护的是子网,两者互为补充,通常部署FWaas和安全组来实现双重防护。

4.2:两个版本:FWaas V1与 FWaas V2

  • FWaas V1是传统方后墙方案,对路由器提供保护,将防火墙应用到路由器时,该路由器的所有内部端口受到保护,其中虚拟机2进出的数据流都会得到防火墙保护
  • 新的版本的 FWaas v2提供了更具细粒度的安全服务,防火墙的概念防火墙组( firewall group)代替,一个防火墙包括两项策略:入口策略( ingress policy)和出口( egress policy)。
  • 防火墙组不在用于路由器级(路由器全部端口)而是路由器端口,注意, FWaas v2的配置仅提供命令行工具,不支持 dashboard图形页面。
    mark
原创文章 172 获赞 97 访问量 5万+

猜你喜欢

转载自blog.csdn.net/CN_TangZheng/article/details/104675633