一、VMware虚拟机网络模式

Vmware虚拟机有三种网络模式:Bridged (桥接模式)NAT (网络地址转换模式)Host-Only (仅主机模式)。下面分别总结下这三种网络模式:

1. Bridged (桥接模式)
将虚拟机的虚拟网络适配器与主机的物理网络适配器进行交接,虚拟机中的虚拟网络适配器可通过主机中的物理网络适配器直接访问到外部网络。这就好像在局域网中添加了一台新的、独立的服务器一样。因此,虚拟机也会占用局域网中的一个IP地址,并且可以和其他终端进行相互访问。桥接模式网络连接支持有线和无线主机网络适配器。如果想把虚拟机当做一台完全独立的服务器,并且允许它和其他终端一样的进行网络通信,那么桥接模式通常是虚拟机访问网络的最简单途径。

桥接模式就是将主机网卡与虚拟的网卡利用虚拟网桥进行通信。类似于把物理主机虚拟为一个交换机,所有桥接设置的虚拟机连接到这个交换机的一个接口上,物理主机也同样插在这个交换机当中,所以所有桥接下的网卡与网卡都是交换模式的,相互可以访问而不干扰。在桥接模式下,虚拟机IP地址需要与主机在同一网段,如果需要联网,则网关与DNS需要与主机网卡一致。

2. NAT (网络地址转换模式)
使用NAT模式网络连接时,VMware会在主机上建立单独的专用网络,用以在主机和虚拟机之间相互通信。虚拟机向外部网络发送的请求数据”包裹”,都会交由NAT网络适配器加上”特殊标记”并以主机的名义转发出去,外部网络返回的响应数据”包裹”,也是先由主机接收,然后交由NAT网络适配器根据”特殊标记”进行识别并转发给对应的虚拟机。因此,虚拟机在外部网络中不必具有自己的IP地址。从外部网络来看,虚拟机和主机在共享一个IP地址,默认情况下,外部网络终端也无法访问到虚拟机。此外,在一台主机上只允许有一个NAT模式的虚拟网络。因此,同一台主机上的多个采用NAT模式网络连接的虚拟机也是可以相互访问的。如果网络IP资源紧张,此时使用NAT模式是最好的选择。NAT模式借助虚拟NAT设备和虚拟DHCP服务器,使得虚拟机可以联网。

在NAT模式中,主机网卡直接与虚拟机设备相连,然后虚拟NAT设备与虚拟DHCP服务器一起连接在虚拟交换机VMnet8上,这样就实现了虚拟机联网。那么为什么需要虚拟网卡VMware Network Adapter VMnet8呢?VMware Network Adapter VMnet8虚拟网卡主要是为了实现主机与虚拟机之间的通信。

3. Host-Only (仅主机模式)
仅主机模式,是一种比NAT模式更加封闭的的网络连接模式,它将创建完全包含在主机中的专用网络。仅主机模式的虚拟网络适配器仅对主机可见,并在虚拟机和主机系统之间提供网络连接。相对于NAT模式而言,仅主机模式不具备NAT功能,因此在默认情况下,使用仅主机模式网络连接的虚拟机无法连接到Internet(在主机上安装合适的路由或代理软件,或者在Windows系统的主机上使用Internet连接共享功能,仍然可以让虚拟机连接到Internet或其他网络)。在同一台主机上可以创建多个仅主机模式的虚拟网络,如果多个虚拟机处于同一个仅主机模式网络中,那么它们之间是可以相互通信的;如果它们处于不同的仅主机模式网络,则默认情况下无法进行相互通信(可通过在它们之间设置路由器来实现相互通信)。

Host-Only模式其实就是NAT模式去除了虚拟NAT设备,然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机通信。 Host-Only模式将虚拟机与外网隔开,使得虚拟机成为一个独立的系统,只与主机相互通信。

二、 KVM虚拟机网络模式 

Libvirt虚拟网络是使用虚拟网络交换机的概念。虚拟网络交换机是在主机物理机器服务器上运行的软件结构,虚拟机(客户机)通过它连接到该物理主机服务器。客户机的网络流量通过这个交换机被引导:

Linux主机物理机服务器将虚拟网络交换机表示为网络接口。当libvirtd守护进程(libvirtd)首次安装并启动时,表示虚拟网络交换机的默认网络接口是virbr0。

这个virbr0接口可以通过ip命令 (ip addr show virbr0),像其他任何接口一样用命令查看。

KVM中的四种简单网络模型,分别如下:
桥接模型:在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。
NAT模型:在路由模式中,会出现虚拟机可以访问其他主机,但是其他主机的报文无法到达虚拟机,而NAT模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在docker环境中经常被使用。
路由模型:相当于虚拟机连接到一台路由器上,由路由器(物理网卡),统一转发,但是不会改变源地址。
隔离模型:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上。

1. 桥接模式
在使用桥接模式时,所有虚拟机都好像与主机物理机器在同一个子网内。同一物理网络中的所有其他物理机器都知道这些虚拟机,并可以访问这些虚拟机。桥接操作在OSI网络模型的第2层。 在中间件 (如hypervisor) 中可以使用多个物理接口,通过绑定把他们连接在一起,然后把它添加的网桥,同时虚拟机也被添加到这个网桥,绑定操作有多种模式,只有少数这些模式可以与虚拟客机正在使用的桥接器配合使用。

2. NAT模式
默认情况下,KVM虚拟网络交换机以NAT模式运行。也就是说NAT方式是KVM安装后的默认方式, 它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。它们使用IP伪装而不是SNAT(Source-NAT)或DNAT(Destination-NAT)。IP伪装使得连接的guest虚拟机可以使用主机物理机器IP地址与任何外部网络进行通信。(可以使用命令 "virsh net-list --all" 列出linux宿主机当前KVM的所有网络模式, 命令结果中的default网络(virbr0上)是宿主机安装kvm虚拟机自动安装的) 默认情况下,虚拟网络交换机在NAT模式下运行时,放置在主机物理机外部的计算机无法与其中的guest虚拟机进行通信,如下图所示:

DNS和DHCP 
IP地址可以通过DHCP分配给客户机。为此,可以将地址池分配给虚拟网络交换机。Libvirt使用这个dnsmasq程序。dnsmasq的一个实例是由libvirt为每个需要它的虚拟网络交换机自动配置和启动的。

KVM默认网络配置是NAT方式, libvirtd守护进程(libvirtd)第一次被安装时,它将包含配置在NAT模式下的初始虚拟网络交换机。使用此配置,以便安装的guest虚拟机可以通过主机物理机与外部网络进行通信。下图显示了这个默认配置libvirtd:

3. 路由模式
当使用路由模式时,虚拟交换机连接到连接到主机物理机器的物理LAN,在不使用NAT的情况下来回传输流量。虚拟交换机可以检查所有流量,并使用网络数据包中包含的信息来做出路由决策。使用此模式时,所有虚拟机都位于其自己的子网中,通过虚拟交换机进行路由。这种情况并不总是理想的,因为物理网络上的其他主机物理机器不通过手工配置的路由信息是没法发现这些虚拟机,并且不能访问虚拟机。路由模式在OSI网络模型的第三层运行。

4. 隔离模式
使用隔离模式时,连接到虚拟交换机的虚拟机可以相互通信,也可以与主机物理机通信,但其通信不会传到主机物理机外,也不能从主机物理机外部接收通信。在这种模式下使用dnsmasq对于诸如DHCP的基本功能是必需的。但是,即使该网络与任何物理网络隔离,DNS名称仍然被解析的。因此,DNS名称能解析但ICMP回应请求(ping)命令失败这种情况可能会出现。

三、OpenStack虚拟机网络模式

网络是OpenStack虚拟化部署中最容易出问题的,也是其结构中难以理清的部分。下面根据自己的理解,谈一谈OpenStack的虚拟网络、网络拓扑和网络流,以供参考,如有误述,敬请指出。

1. OpenStack中nova-network插件的作用

OpenStack 虚拟化平台中有两种类型的物理节点: 控制节点和计算节点。控制节点包括网络控制、调度管理、api服务、存储卷管理、数据库管理、身份管理和镜像管理等,计算节点主要提供nova-compute服务。控制节点的服务可以分开部署在多个节点上,而提供nova-network服务的节点称为网络控制器。

OpenStack的网络由nova-network(网络控制器)管理,它会创建虚拟网络,使主机之间以及与外部网络互相访问。OpenStack的API服务器通过消息队列分发nova-network提供的命令,这些命令之后会被nova-network处理,主要的操作有:分配ip地址、配置虚拟网络和通信。

这里要注意区分以下两个概念:控制节点和网络控制器
-> 在最简单情况下,所有服务都部署在一个主机,这就是all-in-one;
-> 稍微复杂点,除了nova-compute外所有服务都部署在一个主机,这个主机进行各种控制管理,因此也就是控制节点;
-> 多数情况下 (比如为了高可用性),需要把各种管理服务分别部署在不同主机(比如分别提供数据库集群服务、消息队列、镜像管理、网络控制等),这个时候网络控制器(运行nova-network)只是控制节点群中的一部分。

2. OpenStack中network的2种ip、3种管理模式

Nova有固定IP浮动IP的概念。固定IP被分发到创建的实例不再改变,浮动IP是一些可以和实例动态绑定和释放的IP地址。
Nova支持3种类型的网络,对应3种"网络管理"类型:Flat管理模式FlatDHCP管理模式VLAN管理模式。OpenStack虚拟机默认使用VLAN摸式。这3种类型的网络管理模式,可以在一个ОpenStack部署里面共存,可以在不同节点不一样,可以进行多种配置实现高可用性。
Flat (扁平): 所有实例桥接到同一个虚拟网络,需要手动设置网桥。
FlatDHCP: 与Flat (扁平)管理模式类似,这种网络所有实例桥接到同一个虚拟网络,扁平拓扑。不同的是,正如名字的区别,实例的ip提供dhcp获取 (nova-network节点提供dhcp服务),而且可以自动帮助建立网桥。
VLAN: 为每个项目提供受保护的网段 (虚拟LAN)。

3. OpenStack虚拟机3种网络模式的工作机制

1) Flat模式
-> 指定一个子网,规定虚拟机能使用的ip范围,也就是一个ip池 (分配ip不会超过这个范围,也就是配置里面的fixed_range,比如10.0.0.1/27,那么可用ip就有32个;这个网络是可以改变的,比如配置好节点nova.conf和interfaces后,nova-manage network delete 10.0.0.1/27 1 32;nova-manage network create192.168.1.0/24 1 255);
-> 创建实例时,从有效ip地址池接取一个IP,为虚拟机实例分配,然后在虚拟机启动时候注入虚拟机镜像 (文件系统);
-> 必须手动配置好网桥 (br100),所有的系统实例都是和同一个网桥连接;网 桥与连到网桥的实例组成一个虚拟网络,nova-network所在的节点作为默认网关。比如flat_interface=eth1;eth1的ip为 10.0.0.1,其它网络ip在10.0.0.1/27内。flat interface-->br100-->flat network;
-> 此后,网络控制器 (nova-network节点) 对虚拟机实例进行NAT转换,实现与外部的通信。网络配置保存在/etc/network/interfaces文件。

2) Flat DHCP模式
与Flat模式一样,从ip池取出ip分配给虚拟机实例,所有的实例都在计算节点中和一个网桥相关。不过,在这个模式里,控制节点做了更多一些的配置,尝试和以太网设备(默认为eth0)建立网桥,通过dhcp自动为实例分配flat网络的固定ip,可以回收释放ip。
-> 网络控制器(运行nova-network服务的节点)运行dusmasq作为DHCP服务器监听这个网桥;
-> 实例做一次dhcp discover操作,发送请求;
-> 网络控制器把从一个指定的子网中获得的IP地址响应给虚拟机实例;
-> 实例通过网络控制器与外部实现互相访问。

3) VLAN网络模式
OpenStack的默认网络管理模式,没有设置--network_manager=nova.network.manager。FlatDHCPManager或者FlatManager的时候默认为vlan。为了实现多台机器的安装,VLAN网络模式需要一个支持VLAN标签(IEEE 802.1Q)的交换机 (switch)。在这个模式里,为每个项目创建了VLAN和网桥。所有属于某个项目的实例都会连接到同一个VLAN,必要的时候会创建Linux网桥和VLAN。每个项目获得一些只能从VLAN内部访问的私有IP地址,即私网网段。每个项目拥有它自己的VLAN,Linux网桥还有子网。被网络管理员所指定的子网都会在需要的时候动态地分配给一个项目。
-> 网络控制器上的DHCP服务器为所有的VLAN所启动,从被分配到项目的子网中获取IP地址并传输到虚拟机实例;
-> 为了实现用户获得项目的实例,访问私网网段,需要创建一个特殊的VPN实例 (代码名为cloudpipe,用了创建整数、key和vpn访问实例);
-> 计算节点为用户生成了证明书和key,使得用户可以访问VPN,同时计算节点自动启动VPN;
-> vpn访问。

Flat与vLAN的比较
-> 在两种Flat模式里,网络控制器扮演默认网关的角色,实例都被分配了公共的IP地址 (扁平式结构,都在一个桥接网络里)。
-> vLAN模式功能丰富,很适合提供给企业内部部署使用。但是,需要支持vLAN的switches来连接,而且相对比较复杂,在小范围实验中常采用FlatDHCP模式。

4. 简单总结下FlatDHCP模式 (注意Flat模式与之类似,只是少了dhcp的部分而已,就略过了)
可以有多种部署方式,比如为了实现高可用,可以使用多网卡、外部网关、multi_host 等方法。这里介绍基本部署方式 (一个控制节点,或一个网络控制器)。

1) 网卡与节点
由于网卡和节点数的不同,可以简单分为:单节点 (all-in-one) 单网卡、单节点多网卡、多节点单网卡、多节点多网卡。

单节点的情况下,网络控制器 (运行nova-network) 与计算 (运行nova-compute,或者更确切的说,运行虚拟机实例) 部署在一个主机。这样就不需要控制节点与计算节点之间的通信,也就少了很多网络概念,这也是入门者常用的方式。

多节点时,网络控制器与计算节点分别在不同主机,普通部署方式下 (不是multi_host),只有nova-network控制网络,而它仅仅在控制节点运行。因此,所有计算节点的实例都需要通过控制节点来与外网通信。

单网卡时,网卡需要作为public网络的接口使用,也需要作为flat网络的接口,因此需要处于混杂模式。不过建立的网络与双网卡类似,都分为flat网络和public网络。使用单网卡,需要在nova.conf中使public_interface和flat_interface都为eth0。

2) 网络流
如上面分析,在普通部署方式下,只有一个控制节点(或网络控制器),dhcp和外网访问都需要经过它。

dhcp时:
-> 网络控制器(运行nova-network服务的节点)一直运行dusmasq作为DHCP服务器监听网桥(br100);
-> 实例做一次dhcp discover操作,发送请求;
-> 网络控制器把从一个指定的子网中获得的IP地址响应给虚拟机实例。

实例访问外网时:
-> 实例经过所在主机的flat_interface(这是一个flat网络),连接到nova-network所在的主机(控制节点);
-> 网络控制器对外出网络流进行转发。

外网访问实例时
-> 网络控制器对floating ip进行nat;
-> 通过flat网络将流入数据路由给对应的实例。

下图1、图2可以比较单网卡和双网卡的网络流(traffic)情况,图2、图3可以比较单节点和多节点的网络流。

图1:双网卡多节点OpenStack网络流

图2:单网卡多节点OpenStack网络流

图3:单网卡单节点OpenStack网络流

3) 多节点时控制节点和计算节点的工作原理

控制节点
-> 在主机上创建一个网桥(br100),把网关ip赋给这个桥;如果已经有ip,会自动把这个ip赋给网桥作为网关,并修复网关;
-> 建立dhcp server,监听这个网桥;并在数据库记录ip的分配和释放,从而判定虚拟机释放正常关闭dhcp;
-> 监听到ip请求时,从ip池取出ip,响应这个ip给实例;
-> 建立iptables规则,限制和开放与外网的通信或与其它服务的访问。

计算节点
-> 在主机上建立一个对应控制节点的网桥(br100),把其上实例(虚拟机)桥接到一个网络(br100所在的网络);
-> 此后,这个桥、控制节点的桥和实例的虚拟网卡都在同一虚拟网络,通过控制节点对外访问。

可见,这种多节点方式有以下特点:
-> 所有实例与外网通信都经过网络控制器,这也就是SPoF(单故障点);
-> 控制节点提供dhcp服务、nat、建立子网,作为虚拟网络的网关;
-> 计算节点可以没有外网ip,同其上的实例一样,可以把控制节点作为网关对外访问;
-> 实例与外网通信太多,会造成控制节点网络的堵塞或者高负载。

5. VLAN模式的特点
VLAN模式的目的是为每个项目提供受保护的网段,具有以下特点:
-> NAT实现public ip;
-> 除了public NAT外没有其它途径进入每个lan;
-> 受限的流出网络,project-admin可以控制;
-> 受限的项目之间的访问,同样project-admin可以控制;
-> 所以实例和api的连接通过vpn;

下面是vLAN模式下OpenStack网络结构 (这里借用OpenStack官方文档里的图做一了解)