计算,存储,网络,安全,是构建任何大型数据中心都绕不过去的四个问题。云也不例外。在这个风起云涌的云时代,各厂商赛马般发布层出不穷的新技术,着实让我们目不暇接。很多人昨天刚玩过Xen,今天看到Redhat宣称KVM是其新的战略方向,又忍不住把KVM拿来折腾一番。大家习惯性地把注意力都放在了“计算”上,积累了不少“服务器虚拟化”的经验,却不知不觉冷落了其余三个方面。国外同行们热议Software Defined Network(SDN)和OpenFlow这些因为云而瞬间火爆的技术时,我们还卯足了劲儿一头扎进服务器虚拟化中不愿出来。
Open vSwitch的目标,是做一个具有产品级质量的多层虚拟交换机。通过可编程扩展,可以实现大规模网络的自动化(配置、管理、维护)。它支持现有标准管理接口和协议(比如netFlow,sFlow,SPAN,RSPAN,CLI,LACP,802.1ag等,熟悉物理网络维护的管理员可以毫不费力地通过Open vSwitch转向虚拟网络管理)。
同类产品VMware的vDS(vSphere Distributed VirtualSwitch),Cisco的Nexus 1000V都是收费的。更重要的是,虽然免费,其产品质量却深得信赖。在2010年Open vSwitch 1.0.0发布之前,Citrix就宣布在XenServer中将其作为默认组件。
图一:Open vSwitch示意图
官网的描述精准而抽象,来点通俗的,Open vSwitch是一个由Nicira Networks主导的开源项目,通过运行在虚拟化平台上的虚拟交换机,为本台物理机上的VM提供二层网络接入, 跟云中的其它物理交换机一样工作在Layer 2层。Open vSwitch充分考虑了在不同虚拟化平台间的移植性,采用平台无关的C语言开发。
1:
Linux Kernel自带的桥接模块就可以很好的解决这一问题。原理上讲,正确配置桥接,并把VM的virtual nic连接在桥接器上就OK啦。很多虚拟化平台的早期解决方案也是如此,自动配置并以向用户透明的方式提供虚拟机接入。
Open vSwitch在WHY-OVS这篇文章中,第一句话就高度赞扬了Linux bridge:
“We love the existing network stack in Linux. It is robust, flexible, and feature rich. Linux already contains an in-kernel L2 switch (the Linux bridge) which can be used by VMs for inter-VM communication. So, it is reasonable to ask why there is a need for a new network switch.”
2:
如果没有网络虚拟化技术的支持,管理员只能看到被桥接的物理网卡,其上川流不息地跑着n台VM的数据包。仅凭物理交换机支持,管理员无法区分这些包属于哪个OS哪个用户,只能望云兴叹乎?简单列举常见的几种需求,Open vSwitch现有版本很好地解决了这些需求。
需求一:网络隔离。物理网络管理员早已习惯了把不同的用户组放在不同的VLAN中,例如研发部门、销售部门、财务部门,做到二层网络隔离。Open vSwitch通过在host上虚拟出一个软件交换机,等于在物理交换机上级联了一台新的交换机,所有VM通过级联交换机接入,让管理员能够像配置物理交换机一样把同一台host上的众多VM分配到不同VLAN中去;
需求二:QoS配置。在共享同一个物理网卡的众多VM中,我们期望给每台VM配置不同的速度和带宽,以保证核心业务VM的网络性能。通过在Open vSwitch端口上,给各个VM配置QoS,可以实现物理交换机的traffic queuing和traffic shaping功能。
---前两项是必选!
需求三:流量监控,Netflow,sFlow。物理交换机通过xxFlow技术对数据包采样,记录关键域,发往Analyzer处理。进而实现包括网络监控、应用软件监控、用户监控、网络规划、安全分析、会计和结算、以及网络流量数据库分析和挖掘在内的各项操作。例如,NetFlow流量统计可以采集的数据非常丰富,包括:数据流时戳、源IP地址和目的IP地址、 源端口号和目的端口号、输入接口号和输出接口号、下一跳IP地址、信息流中的总字节数、信息流中的数据包数量、信息流中的第一个和最后一个数据包时戳、源AS和目的AS,及前置掩码序号等。
xxFlow因其方便、快捷、动态、高效的特点,为越来越多的网管人员所接受,成为互联网安全管理的重要手段,特别是在较大网络的管理中,更能体现出其独特优势。
没错,有了Open vSwitch,作为网管的你,可以把xxFlow的强大淋漓尽致地应用在VM上!
需求四:数据包分析,Packet Mirror。物理交换机的一大卖点,当对某一端口的数据包感兴趣时(for trouble shooting , etc),可以配置各种span(SPAN, RSPAN, ERSPAN),把该端口的数据包复制转发到指定端口,通过抓包工具进行分析。Open vSwitch官网列出了对SPAN, RSPAN, and GRE-tunneled mirrors的支持。
Nicira把对Openflow的支持引入了Open vSwitch。引入以下模块:
· ovs-openflowd --- OpenFlow交换机;
· ovs-controller --- OpenFlow控制器;
· ovs-ofctl --- Open Flow 的命令行配置接口;
· ovs-pki --- 创建和管理公钥框架;
· tcpdump的补丁 --- 解析OpenFlow的消息;
==我们对vlan的支持还没有做到,其实在安全方面也是可以做的
Sflow:
1.下面先来关注几个问题:
(1) Sflow是什么呢? 与sflow相应的有一个Netflow。 sFlow和Netflow聽起來很相似,但在骨子裡卻不一樣。Netflow會針對所有流經的網路封包去取得其特徵,包含Source IP
address、Destination IP address、Source
port for UDP or TCP, 0 for other protocols、Destination
port for UDP or TCP, type and code for ICMP, or 0 for other protocols、IP protocol、Ingress interface (SNMP ifIndex)、IP Type of Service這些資訊。
由於Netflow會對所有流經的封包進行處理,若網路流量極大時,Netflow所提供的資料量亦會隨之增加,若資料量太大,後端分析引擎可能會不堪負荷,進而影響資料判讀時的正確性。
sFlow的作法和Netflow不同,sFlow以取樣的方式取出資料的摘要,使用者可以自訂其取樣大小及取樣週期,即使流經大量網路流量,但sFlow經取樣後的資料相對於Netflow而言會大量的減少,如此一來就可以兼顧資料正確性並確保後端分析引擎處理能力。
在實務上,sFlow較常運用於高速網路的環境,也是因為其具有此特性的關係。sFlow提供的資料格式在之後實作的階段會加以展示,在此不多作說明。
在實作時,會遭遇到許多的困難,這是因為sFlow僅在部分設備上提供,也不像Netflow,在Linux中可使用nfdump套件來產生符合其格式的流量。
(2) 是不是open
vswitch支持了sflow就不支持了netflow?不是,在其官方的介绍里(上文的官方图片),可以看到也是支持netflow的。目前我的做法是,使用sflowtool将sflow转换为netflow。
2.配置实例:
目标: 流量导出,并可以使用snort,tcpdump对流量进行监控和分析。
配置图如下所示:
在208服务器上安装xen和openvswitch,并启动两个虚拟机VM1,VM2。不在赘述。
(1)
配置sflow流量导出
#!/bin/sh COLLECTOR_IP=172.16.18.18 COLLECTOR_PORT=6343 AGENT_IP=eth1 HEADER_BYTES=128 SAMPLING_N=2 POLLING_SECS=1 ovs-vsctl – |
这是配置sflow的一个脚本,现在解释其中的意思:
COLLECTOR_IP是指进行流量监控的机器,本次实例中是指172.16.18.18
COLLECTOR_PORT=6343 是指把流量发到COLLECTOR_IP的6343端口
AGENT_IP=eth1是指把流量从本地的eth1端口发出去
并指定每1秒poolling一次,每次的取样频率为64(即,每隔64个Packet取样一次)。
(2)
转换sflow
现在让VM1(ip:x.x.x241) ping VM2(ip: x.x.x242)
执行上面那个脚本,在18.18机器上用snort会看到206发到18.18的包,而不会看到241和242之间通信的数据包。因为241和242通信的数据被sflow封装起来之后再发给18.18.如果想看到这个数据,需要将sflow转换为snort和tcpdump的格式,具体命令如下:
$sflowtool 或者 $sflowtool |
(3)
sflowtool的使用:
-f可以转发到另一台机器上
$sflowtool –p 6343 –t –f x.x.x.x/6343 |
-c可以将sflow转换为netflow
其他的使用信息,参见 man sflowtool