在云里面,虚机是虚拟出来的,容器是虚拟出来的,存储是虚拟出来的,网络也是虚拟出来的。
很多人不明白,网络是怎么虚拟出来的?都虚拟了什么?
本文大致讲一下云内的网络是什么样的。
注:本文是针对IT人的科普文章,读者最好有一定的网络基础知识,比如最好知道这些术语:交换机、路由器、网关、负载均衡。 注:本文只是帮助建立起最基本的概念,所以无意说太多。
让人懵懂的云网络
一、云网络里都有啥
我们先从最能直观感受的VPC来说,然后说说里面的子网和其它。
1、VPC:用户拥有的网络
VPC(Virtual Private Cloud)的正规叫法是“虚拟私有云”,但更多被人们称为“虚拟私有网络”或“虚拟网络”。
之所以这么叫,是因为VPC给了用户一个完整独占的网络(Network),然后在这个网络上,用户创建子网、VM、存储等虚拟资源,才形成一个私有的云。
不同的VPC在网络上是完全隔离的,他们可以使用同样的IP段,而不用担心IP冲突的问题。
创建VPC很容易,比如在AWS,点击“创建VPC”就可以了。

在AWS创建一个VPC
在某云平台,创建VPC的设置界面为:
在某平台创建VPC
可以看到,里面要填的网段地址,是所有可能的私网IP网段,虽然都在一个云里,你完全不用考虑别人是不是已经占用了什么网段。你只需要考虑的是:如果你申请了多个VPC,而且又要它们互通,那就要规划一下,不要让它们有IP冲突。
创建VPC时要选择的“地域
”,就是人们常说的Region
,是指一朵云内的某个地域(通常是不同物理地点,比如北京、上海、深圳、杭州等地)。
一朵云里可以有若干个Region,不同Region的物理资源(计算、存储、网络)是完全独立和不共享的。
一个Region里面可以创建多个VPC。
一个VPC内又可创建多个子网(Subnet)。
一个子网内,可以有多个虚机(VM)。
在一些云平台里,如果你不创建VPC而是直接申请虚机,云平台会自动给你创建VPC及子网。
2、子网:虚机的栖息地
子网(Subnet)独占VPC中的一个IP地址段,和同一VPC中其他子网不共享。
虚机(VM)总是位于某个子网,并从中获得IP地址。一个子网内的多个VM可以分布在多台宿主机上。
创建子网很简单,选择所在的“可用区
”,定义IP段(即CIDR)和网关地址就可以了。
创建子网
这里面又出现一个新概念:可用区
,这就是人们常说的AZ
(Available Zone)。
可以简单将AZ理解为机房,即一个Region有多个机房,每个机房就是一个AZ。不同AZ使用不同的电力和制冷,使用独立的计算、存储和网络资源(但网络是互通的)。这样,即便一个AZ不可用了,另一个还是可用的。
一个子网内的不同虚机,可以在一个AZ中,也可以在不同的AZ中。
下图示意了Region、AZ、VPC、子网的简单逻辑关系。
Region、AZ、VPC、Subnet的关系
子网内的VM缺省是可以互相通信的,原因是它们都接在虚拟交换机
(vSwitch
)上。
具体而言,VM通过虚拟网卡(vNIC)和虚拟网线(veth pair)接在vSwitch的虚拟端口(vPort)上。
在有的云平台上(比如阿里云),并不向用户展示子网的概念,而是直接用虚拟交换机指代子网。
VPC、子网、vSwitch和VM的简单逻辑关系示意如下:
VPC、子网、vSwitch及VM
vSwitch是由OVS
(Open vSwitch)技术实现的,OVS是分布式技术,分布在多台宿主机上。
OVS提供分布式虚拟交换机功能
注:本文主要介绍的是VM,对于容器,可以和VM一样,获得独立的同子网IP,也可以规划新的IP段,本文不再深入介绍,可参考文末链接17。
子网内部的通信就是二层通信,如果要和子网外部通信,就需要虚拟路由器
(vRouter
)了。
3、虚拟路由器:子网和外部通信的途径
在同一子网内的VM,都是在二层通信的。当子网内VM需要访问其他子网(同一VPC或是不同VPC)的VM,或者访问外部网络,就需要三层互通。
虚拟路由器
(vRouter
)就是干这事的,还记得创建子网时要填的那个“网关地址”吧,“网关地址”就是vRouter的一个接口地址。
创建VPC时,云平台会自动给你一个vRouter
,不用专门去创建这个。
和vSwitch一样,vRouter也是通过虚机实现的;而且和OVS一样,vRouter也有分布式解决方案,叫DVR(Distributed Virtual Router)。
VPC由于是虚拟私有网,所以VPC之间天生就是互相隔离的,想让两个VPC互通,需要在它们之间建立“对等连接
”,然后就能互通了。当然,前提是两个VPC的地址空间没有重叠。
通常情况下,“
对等连接
”不能跨Region,如果一个VPC要连接不同Region的另一个VPC,要在云平台中配置“云连接
”来实现,这个我们后面会讲。
比如在某平台,建立“对等连接
”,选择要互通的VPC即可;
创建VPC示意
虚拟路由器示意
刚才说的都是互通,下面我们看看怎么隔离。
4、网络ACL和安全组:云原生的安全控制
云网络内置了两种比较简单灵活的安全控制方法,一种是针对子网的网络ACL
,一种是针对虚机的安全组
。两者的控制位置和方法略有不同,可以组合使用。
比如可以对某子网建立如下网络ACL
规则,拒绝所有对TCP 445端口的入站访问,也即,没有任何流量可以访问该子网内任一VM的TCP 445端口。
拒绝所有445端口的TCP入站连接
从逻辑拓扑上讲,网络ACL
位于路由器和子网之间。
网络ACL的逻辑示意
另一种隔离机制是安全组
。
用户可以建多个安全组,每个VM可以选择划入多个安全组,然后该VM就受这些安全组策略的保护了。
将某VM实例绑定到某安全组上
安全组
(Security Groups
)可以指定具体的入向和出向流量规则,如下图所示。
新建安全组规则
一个安全组里的VM,可以不在一个子网里,也可以不在一个VPC中,如下图所示。
安全组逻辑示意
简单地说,网络ACL是针对子网的,安全组是针对虚机的。
安全组以前多使用Linux bridge中的iptables实现,现在多使用OVS的流表技术实现。
在有的云平台中,将网络ACL和安全组合二为一提供给用户,不再区分这两种概念。
5、微隔离:更精细更通用的隔离
微隔离
(Micro-Segmentation)是更细粒度的网络隔离技术,能够对物理机、虚拟机、容器之间东西流量进行隔离。它的原理是安装agent,然后通过主机防火墙(如iptables)进行控制。对于物理机和虚拟机,这很容易做到,对于容器,agent以k8s网络插件的形式出现,实现对各容器的网络转发和控制。
微隔离主要分为策略控制中心和策略执行单元,前者是大脑,下发策略,后者执行策略。前者实现可视化和集中管理能力,按角色、业务功能等多维度的标签对需要隔离对象进行分组,后者执行流量监测和隔离。
不过,要了解一点,微隔离并不是云厂商提供的服务,也并不是云原生的,通常是第三方实现的。
6、vFW和vLB:虚拟防火墙和虚拟负载均衡
有人说,都有了网络ACL了,还需要虚拟防火墙
(vFW
)吗?
网络ACL是针对子网的保护;vFW是针对VPC的保护,保护的层面不一样。
而且,专业性不同。网络ACL是无状态的,不能跟踪网络协议的状态,仅仅用于放行或拦截IP/端口,不能做到比较高级和专业的应用层防护。而vFW可以做到和传统防火墙一样强大的功能。
vFW通常是用虚机实现的,出于性能考虑,可以用硬件防火墙替代vFW,将硬件下挂在VxLAN网关(此网关也可以用硬件)下使用。
有的厂商将自己的网络ACL称为vFW,要注意区分开来。
虚拟负载均衡
(vLB
)也是用虚机实现的,提供第四层负载均衡,通常底层使用LVS(Linux Virtual Server)技术。
此外,云原生中还有第七层的LB,通常是API网关干这事(比如通过Nginx)。
下图是在云内创建vLB的图示:
vLB的创建示例
增加vFW和vLB后,云网络的示意图为:
增加vFW和vLB后的VPC逻辑示意
7、网关:通往外部世界
网关
(Gateway
)可以实现子网和外部网络的连接。
网关有多种,比如NAT网关、互联网网关、专线网关、VPN网关等。
NAT网关
(NGW
) 用于没有公共IP的VM访问互联网,互联网网关
(IGW
) 用于有公共 IP 的VM访问互联网。
以NAT网关为例,用户在控制台创建“NAT网关”并给网关绑定一个EIP
(弹性公网IP
),然后,做一下NAT设置,就可以让子网内的VM连接互联网了。
NAT网关实例示意
网关可以用虚机实现。出于性能考虑,有些厂商会用硬件网络设备实现,比如L3GW
(Layer 3 Gateway),或者在服务器上安装智能网卡(SmartNIC
或称FAC
,function accelerate card)实现。
8、云连接:把云网络和企业DC连起来
云连接
(Cloud Connect)不仅提供跨Region的VPC连接,更提供云上和云下的连接,比如公有云和企业DC的连接。
常见的云连接有两种形式:VPN
、云专线
(Direct Connect);前者走互联网,后者走物理专线;前者通过VPN网关,后者通过专线网关。
企业如果有私有云,可以通过云连接,让公有云和私有云打通形成混合云。
下图是本文所介绍网络组件的集合图示。
含云连接的云网络示意图
其中,Region1和Region2通过云专线建立连接;Region1通过云专线,Region2通过VPN,和企业的DC建立连接。
二、虚拟网络背后的技术
虚拟网络的背后,有很多技术,本文主要介绍SDN
技术和VxLAN
技术。
1、SDN
传统的网络设备是分布式和去中心化的,每台设备可以通过自主学习和人工配置,可以知道如何转发数据包,而不需要一个集中式的控制设备。
我原以为网络就应该是这样的,但当我弄明白SDN之后,大吃一惊,居然还能从分布式又走回集中式?这大概就是否定之否定吧。
SDN像是控制各网络设备的大脑,它去命令各设备如何转发数据包,而不再需要各设备自己学习。这个大脑的实体就是SDN控制器。
SDN为什么要把分布式改为集中式呢?我觉得,搞软件的人实在懒得去一台一台设备登录上去搞配置了,太麻烦,要想真正地自动化,要想真正地全局统筹,就得用软件集中管理。
所以,SDN这个词本身就是软件定义网络(Software Defined Network),用软件的方式把大量复杂难搞的硬件网络设备安排地明明白白。
在虚拟网络里,vSwitch和vRouter这些设备,通常都不用登录上去敲命令(虽然也可以这么做),而是通过云平台配置。云平台通过API和SDN控制器交互,SDN控制器计算并下发转发表到vSwitch和vRouter,完成配置。
SDN原理示意
说到这里,还要介绍一下常见的Overlay概念,所谓Overlay,是在传统的物理网络(Underlay)基础之上,构建出一个虚拟的逻辑网络。从技术上讲,Overlay的二层数据包封装在物理网络的三层报文中传输,到达目的地之后再解封装得到Overlay的二层报文。实际上,这就是一种“L2 over L3”的隧道封装技术。这方面的协议比较多,主要有VxLAN
(L2 over UDP)、NVGRE
(L2 over GRE)、STT
(L2 over TCP)等,但VxLAN占明显优势。
总之,当你看到或听到“逻辑网络
”、“业务网络
”,你应该知道这说的就是Overlay
,当你看到或听到“物理网络
”、“底层网络
”时,就知道这说的是Underlay
。
2、VxLAN
VxLAN
(Virtual eXtensible Local Area Network,虚拟可扩展局域网)是实现Overlay
网络的主流技术,正是通过VxLAN,才实现了VPC(包括子网)的完美隔离。
大体而言,就是VM之间交互的数据包,在离开vSwitch时会加上封装,形成隧道,不同子网带有不同的隧道号标识
。解隧道封装的时候,看到隧道号不对,就会抛弃,这样不同子网内的虚拟机无法进行直接通信(除非做了路由),这就实现了隔离。
VxLAN不仅解决了隔离的问题,还解决了传统二层技术(如VLAN)难以解决的大规模二层互连的问题,由于通过三层传输,虚机的部署和迁移就不受二层物理网络限制了。
VxLAN是怎么将L2 over在L3之上呢,答案是:将以太网帧封装在UDP包中。
VxLAN的包结构
如上图所示,Overlay的二层数据帧被封装在三层的IP包中(精确的说,是四层的UDP报文中),封装的头部是VxLAN Header,里面的主要内容就是24bit的VNI(VxLAN ID),每个子网都有一个VNI,这样即便是同一台主机上的两台VM,即便处于同一IP段,只要他们在不同的子网,就无法通信,因为子网的OVS看见不同的VNI就会抛弃掉。
做封装和解封装的端点被称为VTEP,它同时也就是VxLAN隧道的起点和终点。VTEP通常是由OVS实现的,子网中VM向外发出的二层报文,会由OVS进行封装,做成UDP包发出;同时OVS会在UDP特定端口监听,收到VxLAN报文后,如果VNI正确,则去掉封装,将封装前的二层报文转发给相应的VM。
对于裸金属(云管理的物理机)而言,由于它没有OVS,它的Overlay通信要通过VxLAN网关(承担VTEP功能)实现,或者可以在物理机上插一块智能网卡,由智能网卡做VTEP。
VTEP有软件和硬件两种,前面讲的OVS就是软件VTEP,也有用硬件交换机做VTEP的。如果VTEP由软件完成,这种Overlay就叫Host Overlay;如果由硬件设备完成,就叫Network Overlay;如果都有,就叫混合Overlay。
对于Host Overlay而言,物理交换机网络中的Leaf和Spine仅进行IP报文的高速转发,不处理VxLAN报文。
Overlay和Underlay示意
上图中,VM1和VM2要通信的话(无论是否在同一子网),由OVS封装成VxLAN报文,由leaf和spine交换机进行物理传输;对于在同一台宿主机上的VM3和VM4,如果它们在同一VPC的同一子网,OVS就直接转发了(不走VxLAN);如果是同一VPC的不同子网,也不用走VxLAN,由vRouter和OVS转发;但如果在不同VPC,就也要走VxLAN,因为不同VPC的隔离就是靠VxLAN实现的。
三、结语
如果你从来没接触过云网络,现在应该有一个大致的了解了。
简单地讲,就是软件工程师们,在物理网络之上,用纯软件的方式,又做了一个虚拟的网络。
这样,软件工程师摸的最少的网络硬件,也可以随心所欲地用软件定义了。
文|卫剑钒