Windows Azure虚拟网络
对于很多公有云的用户来说,一个需要解决的问题是如何让公有云里面的资源和服务与自己已有的服务器或者应用对接,这些已有的服务可能运行在自己的机房,也可能托管在IDC服务商那里,还有可能运行在其他公有云平台上。目前主流的公有云平台提供的解决方案都是采用VPC(Virtual Private Cloud)或者VDC(Virtual DataCenter)的方式。VPC是对用户运行在公有云上的资源而言的,让一个公有云区域看起来就像自己私有的云一样。用户自己的资源可以相互访问,而与其他用户的资源则是隔离的,无法互访,从而实现安全性,另外用户可以从外部将自己的PC或者本地局域网连入这个VPC。用户的应用可以跨越局域网和公有云,即能获得公有云的好处,又不需要迁移已有的业务。
实现VPC的方式有很多种,这属于网络虚拟化的范畴,也是目前SDN的热点。传统的方案多用VLAN。VLAN由网络设备直接支持,成熟可靠,但VLAN有数量上的的限制(最多4096个)。于是包括思科、华为之类的网络设备厂商开发了新的标准,使VLAN可以突破该限制,并且更灵活,更可靠。而另一方面,以VMware、微软等虚拟化厂商以及一些新兴的网络虚拟化企业开始着重于完全依赖软件实现网络隔离,这些技术不依赖于网络设备,甚至对网络拓扑没有要求,也是未来的发展重点。无论采用哪种技术,VPC的技术要求至少包括:
- 逻辑可定义:用户可以自行创建、管理VPC,可以定义哪些资源属于自己的VPC;
- 云中的互通性:同一个VPC内的资源具备网络连通性,至少支持3层IP协议,能支持2层协议更好;
- 远程互通性:用户可以将远程的资源通过安全的方式接入到云中的VPC中,实现端到端安全性;
- 隔离性:不同VPC的用户资源不具备连通性,任何网络报文均不可达,用户无法从自己的VPC或者公共区域向另一个用户的VPC发起嗅探和攻击。
而进一步的VPC要求包括:
- VPC可以跨越多个云数据中心
- 提供更加灵活的网络配置,包括自定义网络拓扑、自定义路由、自定义网关、自定义防火墙甚至自定义网络设备(交换机、路由器、负载均衡器等)。
说了这么多,我们看下Windows Azure的VPC是如何实现的。如下图所示
Windows Azure上的虚拟网络服务(Virtual Network)就是实现VPC的技术。目前的版本具备如下的能力:
- 用户可以自定义虚拟网络,在每个虚拟网络内,可以自定义网段、每个网段的IP地址段(只能是9, 172, 192.168打头的IP);
- 在部署IaaS虚拟机、PaaS云服务时,用户可以选择将虚拟机部署到用户指定的虚拟网络,从而具备目标的IP地址范围,以及相应的网络权限;
- 同一虚拟网络内的资源使用内网IP进行互访。不同虚拟网络的资源使用公网IP进行互访;
- 站点到站点互通:用户可以通过远程VPN设备(可以是VPN硬件,也可以是一台Windows Server Enterprise服务器)将远程的局域网连入指定的虚拟网络,实现3层网络互通;
- 点到站点互通:用户可以通过Windows PC的VPN客户端,连人指定的虚拟网络,实现3层网络互通。
在虚拟网络出现以前,Windows Azure还还提供一个叫Virtual Connect的软件,可以实现点到点互通。
另外,为了设计合理的网络,我们也需要了解虚拟网络的局限性,这具体包括:
- 同一个虚拟机无法同时加入两个网络,因为虚拟机只能有一个网卡;
- 无法控制2层网络,如MAC地址;
- 不支持广播、多播;
- 不支持IPv6
- 对虚拟机只能指定子网,不能指定IP;
- 不支持让多个远程站点同时接入一个虚拟网络
- 多个虚拟网络不能对接,虚拟网络间的通讯需要走公网IP;
- 虚拟网络不能跨区域
- 虚拟网络一旦被使用就无法灵活调整,所以部署前要提前规划好。
创建虚拟网络
首先,从门户的左侧选择网络,然后点击右侧的创建按钮
输入网络基本信息,包括名称、区域和地缘组。地缘组的用途,是限制资源的范围。尽管Azure的每个区域都已经限定了地理范围,但实际上一个区域内微软可能部署了多个数据中心,这些数据中心在物理上可能相隔几公里,也可能是挨在一起。大部分情况下,物理数据中心对用户是透明的,用户无需关注。但某些场景下,一些服务的作用范围必须集中在一个更小的范围,比如一个数据中心、一个机房、甚至是紧密相连的一组机柜。地缘组的作用,就是保证同一地缘组内的左右资源都部署在紧密相连的物理设备上,确保网络延迟最小、带宽最大,且虚拟网络可以正常运作。我们为地缘组指定一个名称即可。
下一步是配置DNS和VPN。DNS可以不填,使用Azure提供的DNS。VPN部分我们选择点到站点,这样待会儿便于测试。不过,需要注意的是,虚拟网络本身不收费,而VPN是按小时和按连接收费的。无论是免费账号还是付费账户,在选择VPN前要先评估下自己有多少配额。不确定的话就不选,这样虚拟网络就完全是云内部的。
选择了VPN后,下一步是设置VPN客户端的IP地址范围。这个可以根据情况指定,注意一个虚拟网络最多有256个VPN客户端
接下来是设置云端虚拟网络的网络地址。我们可以任意划分多个子网,每个子网可以指定不同的IP地址段。IP地址可以是10、192.168或者172.16打头。这里我们定义了3个子网,分别是DbFarm,WebFarm,VMFarm. 最后还要添加一个网关子网
全部配置完成后,可以看到一个简单的网络拓扑。
此时左侧方框中提示尚未配置网关。于是我们点击页面底部的创建网关按钮
这个过程大概需要10几分钟。在此过程中,我们可以继续下一步,开始准备VPN证书,尝试配置VPN客户端。虚拟网络使用的是X509证书。其方式是服务端有一个根证书,然后每个客户端有一个证书跟根证书关联。客户端证书是由根证书创建的。
我们可以采用Visual Studio自带的Makecert工具创建证书。在程序中找到Visual studio自带的Developer Command Prompt,并以管理员权限运行。如果没有该工具,wWindows用户可以去网络上搜索makecert.exe并下载。Linux用户可以用openssl生成证书。
在命令行中运行:
makecert -sky exchange -r -n "CN=<RootCertificateName>" -pe -a sha1 -len 2048 -ss My
生成根证书,注意要把上面的<RootCertificateName>替换为自己定义名字。
然后再次运行:
makecert.exe -n "CN=<CertificateName>" -pe -sky exchange -m 96 -ss My -in "<RootCertificateName>" -is my -a sha1
生成客户端证书。要把<RootCertificateName>和<CertificateName>替换。
如果有多个客户端,可以让客户端共享客户端证书,或者为每个客户端生成一个单独的证书。生成后需要把证书连同私钥导出,然后导入到其他客户端上。本机则不需要。
证书生成后,可以查看证书。查看方式是进入IE浏览器选项->内容->证书
前两个证书就是刚才生成的,分别是服务端和客户端。选择服务端证书,点击下面的Export/导出,进行证书导出。导出时,按照向导缺省项即可。
接下来要进行服务端证书的上传。回到Azure页面,我们发现刚才的创建网关已经成功。
我们点击右侧的上载证书进行证书的上载。要注意,尽管提示要上传客户端证书,我们还是要上传根证书
上传后,我们发现页面有了些变化,右侧多了新的链接。我们根据本机系统类型下载VPN程序包,64位的选AMD64即可。
下载后运行安装程序,进行VPN客户端的配置。Linux的如何配置我还没有尝试过,有条件的朋友可以试下
安装后在网络连接中就会出现新的VPN图标了。点击即可连接
连接成功后,查看本机VPN IP,发现是之前指定的地址段。大功告成
等待一会儿后,Azure页面也会更新,显示有一个客户端连接,并且显示流入流出的数据量。
不过此时云端没有任何资源可以连接,没法进一步测试
另外,还需要注意的是,一旦开始连接,Azure就开始按时间计费。同时,从Azure流出的流量也会算网络流量费。所以,不用的时候要及时断开连接
部署虚拟机到虚拟网络
部署虚拟机到虚拟网络十分简单,在部署时选择该虚拟网络即可。此时可以选择目标子网
部署完成后,查看下虚拟机的内部IP地址(10.0.2子网的),然后从客户端直接打开远程桌面即可访问该地址,不再需要通过外网以及端口映射
可见,采用了虚拟网络后,客户端和Azure端的虚拟机不再存在防火墙、负载均衡、NAT,可以直接通过内网IP访问。
部署云服务到虚拟网络
部署云服务到虚拟网络要稍微复杂些。我们以GuestBook这个应用为例,这个应用有一个WebRole和一个WorkerRole。我们希望WebRole能够部署到虚拟网络的WebFarm这个子网,而WorkerRole部署到DBFarm这个子网。目前这种指定没有图形化的配置工具,只能手动修改配置文件。
打开该应用的cscfg文件,在末尾的</ServiceConfiguration>之前添加如下内容:
<NetworkConfiguration> <VirtualNetworkSite name="MyNet" /> <AddressAssignments> <InstanceAddress roleName="GuestBook_WebRole"> <Subnets> <Subnet name="WebFarm" /> </Subnets> </InstanceAddress> <InstanceAddress roleName="GuestBook_WorkerRole"> <Subnets> <Subnet name="DBFarm" /> </Subnets> </InstanceAddress> </AddressAssignments> </NetworkConfiguration>
这段配置表示该云服务将部署到MyNet这个虚拟网络,其中两个Role分别部署到一个子网。
然后进入Azure门户,创建一个云服务。创建时,选择虚拟网络MyNet对应的地缘组,而不要选择区域。
之后,就可以发布云服务了。可以用Visual Studio发布,或者用命令行等工具都可以。
发布完成后,从VPN客户端就可以随意连接云服务里所有的虚拟机了,不需要定义端点,也不需要使用VIP。那么问题是,怎么看这些虚拟机的内部IP呢?
很简单,进入虚拟网络的管理页面,所有的可连接的资源一目了然。
虚拟网络详解
下面,我们来进一步了解下虚拟网络,以及它和Azure网络的关系。
下面一张图,是我们部署了虚拟机、云服务并配置了VPN后的一个完整拓扑,它包括了4个子网,2个云服务,2个对外的VIP,以及数个虚拟机。
虚拟网络有如下的一些原则:
- 所有虚拟网络内的虚拟机都可以通过IP互访,无论是哪个子网;
- 虚拟网络外的资源要访问虚拟网络,必须通过VIP,内部被访问的端口必须被定义为Input端点。可以认为虚拟网络边界上有一个防火墙,而内部没有;
- Input端点总是和负载均衡器关联,并且提供NAT能力,从而让发往VIP的请求转发给内部IP;
- IaaS虚拟机是一种特殊的(或者退化的)云服务,有时我们看不到虚拟机对应的云服务,但实际上这个云服务是存在的。有时候我们删掉了虚拟机,会发现多了一个空的云服务,这个实际上就是之前已存在的。Azure使用同样的机制管理云服务和虚拟机。
有了虚拟网络,我们就可以灵活的规划网络拓扑,实现类似于传统应用部署的分层架构,让安全性要求高的资源隐藏在虚拟网络内,只能在内部访问,而把需要提供Web服务的资源部署在单独的子网里,提供对外端口。