CloudStack作为一个虚拟化平台,提供了计算资源、网络资源和存储资源的虚拟化管理和使用。在网络虚拟化上,vRouter起到了至关紧要的作用。几乎所有虚拟网络功能,都是vRouter来实现的,比如:IPAM (DHCP)、DNS、NAT、Source NAT、防火墙、端口转发、负载均衡、VPN等等。也有些功能可以借助外部设备来实现。
每个来宾网络(客户网络)对应至少一个vRouter,当启动某个网络的第一台客户虚拟机时,vRouter会自动创建出来,若一个客户网络长时间不存在启动的虚拟机,该网络的vRouter会自动关闭。
2 操作系统CloudStack的vRouter虚拟机使用了Debian 6.0操作系统 2.6.32内核,为了节省开销,仅安装系统所需的程序包,如:xen、vmware和kvm工具,haproxy、iptables、ipsec等网络包,使用最新版本jre保证安全和速度。默认情况下,只打开了3922端口,且只能通过hypervisor服务器ssh上去。
3 vRouter网卡介绍vRouter有三个网络,分别是外网,来宾网络(客户网络)和链路本地网络。
外网的作用是提供一个外网访问CloudStack内部环境的门户;来宾网络保证外部访问通过vRouter中转后能够到达内部的虚拟机,也为客户虚拟机提供了DHCP和DNS功能;链路本地网络用于内部的一些通信。
4 vRouter提供的主要功能介绍:CloudStack提供了丰富的网络功能,配置起来却极其容易,只需要从UI简单点击就可以完成,这些功能都是通过vRouter实现的。
点击【网络】,选择网络,然后点击【IP地址】,选择外网IP。然后就可以进行这些网络功能的配置了。
默认情况下,vRouter拒绝外网的一切访问,所以启动任何网络功能,都需要先配置防火墙。点击【防火墙】,可以添加外部访问权限。比如下面配置:
源CIDR: 0.0.0.0/24
协议: TCP
起始端口: 500
结束端口: 800
意思是允许所有公网IP,通过TCP协议访问vRouter该IP下的500-800端口。
该功能是通过Linux iptables实现,UI配置后,vRouter内部加入相应的ip包过滤规则,使得这些访问得到允许。
端口转发功能,可以让外网直接连接到内网某个虚拟机的指定端口。比如:
点击【端口转发】,添加新的规则:
专用端口: 22
公用端口: 622
协议: TCP
指定虚机: i-2-188-VM
则可以通过ssh该公网IP的622端口,直接ssh连接到内部环境虚拟机i-2-188-VM上。
该功能也是通过iptables实现。前面提过vRouter可以同时连接外网和客户网络,从UI上添加一条端口转发规则,vRouter的iptables同时添加该转发规则,从而实现了端口转发功能。
负载均衡功能,可以把外网的访问,分布到多台装有相同服务的内网虚拟机上,扩展服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。比如:
点击【负载均衡】,添加如下规则:
名称: 测试1
公用端口: 522
专用端口: 22
算法: 轮询算法
然后添加2台虚拟机(linux可以ssh访问22端口)进去,这样,通过ssh访问该IP地址的522端口,可以轮询访问到2台虚拟机。
负载均衡功能是通过haproxy实现,UI上添加规则的同时,会修改vRouter内部haproxy的配置文件。
CloudStack提供了虚拟专用网络(Virtual Private Network)功能,可以帮助远程用户、公司分支机构、商业伙伴及供应商同公司的内部网建立可信的安全连接,并保证数据的安全传输。
点击【网络】,选择网络,然后点击【IP地址】,选择外网IP;
点击启动VPN按键;确认点击“是”;
这样该外网IP的VPN就启动了,可以看到,除了详细信息、配置,多出来一个VPN标签,里面记录了IP地址、共享密钥等信息。然后添加该连接的用户,就可以通过这个VPN连接访问内网的虚机了。
CloudStack的VPN功能使用了IPSec技术,当启动VPN服务后,管理服务器会去启动vRouter内的IPSec服务,并进行相关的配置,上文所提到的外网IP实际就是vRouter的IP地址,所有VPN连接都是以vRouter为中转连到内部环境虚拟机的。
客户虚拟机的DNS DHCP Server,都是vRouter内部的Dnsmasq工具实现的。当vRouter创建、启动或者有新虚拟机创建时,系统会动态从数据库加载Dnsmasq配置信息。
5 vRouter相关的全局配置router.check.interval | 报告冗余路由器状态的间隔时间(秒) |
router.cpu.mhz | 虚拟路由器的缺省CPU速度(MHz) |
router.extra.public.nics | 为虚拟路由器指定额外的公用网卡(最高5) |
router.stats.interval | 报告路由器统计间隔时间(秒) |
router.template.id | 模板的缺省ID |