协议无关的有状态VNF的设计与实现
2018-10-17苟建国吕高锋邱为好孙志刚
苟建国,吕高锋,邱为好,孙志刚
(国防科技大学 计算机学院,长沙 410073)
1 引 言
MiddleBox在数据中心、运营商和企业网中起着重要的作用.主要承担网络性能、监控等任务,实际应用的MiddleBox有,起地址转换作用的地址转换器(NAT)、负载均衡器和起安全作用的网络入侵检测系统(NIDS)与网络入侵防护系统(NIPS).然而,现在的MiddleBox大多是基于定制的ASICs实现的.这些ASIC的功能在设计时就已经确定,而基于ASIC开发的MiddleBox若需要添加新的功能,就需要选取新的ASIC.若市场上没有ASIC支持新的功能,就需要重新定制ASIC,而ASIC的开发周期相对较长,这就降低了MiddleBox的市场竞争力.且由于使用定制的ASIC,MiddleBox功能的扩展性较差.因为网络中使用的MiddleBox由不同的厂商开发,使用的标准和协议各不相同,导致很难统一管理这些MiddleBox,这样无形加大了网络维护人员的工作难度.
为了解决上面提出的问题,可以考虑使用网络功能虚拟化,通过软件来实现原来基于硬件的MiddleBox的功能,并且这些MiddleBox运行在通用的硬件上(如X86服务器),这样避免了专有硬件的开发,提高了MiddleBox的通用性.网络功能的实现可以使用多种语言,如有使用基于C语言的Click组件进行MiddleBox开发的,而本文中使用P4语言,主要是由于使用P4语言可以编写协议无关的数据包处理器,这是由P4语言的运行机制所决定的,这就为MiddleBox支持协议无关提供了可能.且使用P4语言开发,代码简短,并支持代码重用,可以提高开发效率.
在MiddleBox的研究中,为实现虚拟化,很多研究都选择将MiddleBox部署在虚拟机中,而本文中使用更加轻量级的Docker,以提高物理主机资源的利用率,同时方便MiddleBox移植.
为验证方案的可行性,本文使用P4语言实现了一个部署于Docker中运行的限速器,该限速器是协议无关的,并对功能进行了测试.
2 相关研究
近年来,MiddleBox的研究是一个比较热的方向.主要针对MiddleBox的可编程性、可扩展性进行研究.
在xOMB[1]中,设计实现了一个运行在通用服务器和操作系统上的,具有扩展功能的MiddleBox.它使用可编程的流水线来进行网络包处理,这些流水线由xOMB自身提供的模块和用户自定义的C++模块为实现某一功能而构建,对功能的添加就是对处理流水线的重新构造和添加.每一个功能(如负载均衡交换、NAT)对应一个处理流水线.每个处理流水线对应一个功能模块的组成序列.然而在xOMB中,不能将多个网络功能应用于同一个处理流水线.
OpenBox[2]解耦了MiddleBox的控制平面和数据平面,将MiddleBox数据平面数据处理的过程划分为不同的阶段,并对不同的MiddleBox的处理阶段进行统一,实现了一个统一的流水处理过程.但它的数据平面工作在特有的硬件上,仍然存在基于硬件实现MiddleBox的缺点.
ClickOS[3]中实现了一个高性能的虚拟化的软件MiddleBox平台,并实现了防火墙、NAT和负载均衡三个MiddleBox,每个MiddleBox部署在一个对应的虚拟机中,虽然他对虚拟机中的系统进行了裁剪,对通信接口进行了简化,但这种方式的部署所花费的代价仍然很大,不如部署在更加轻量级的Docker[4]中,故本文实现的VNF部署于Docker中.
OpenState[5]使用扩展有限状态机的方法实现了交换机有状态数据平面编程抽象,这种有限状态机的方法同样可用在MiddleBox的开发中,对于数据包的处理可以通过查看状态表来确定处理的动作.这种方法的难点在于确定问题的有限状态.有状态方法的另一个问题是将状态和网络功能关联在一起,将状态关联于一个单独的网络功能实例限制了其弹性、灵活性以及应对多路径路由、软件更新等应用的能力[6].
SPDA[7]也实现了有状态的数据平面的转发,它的出发点主要是OpenFlow[8]的工作方式为match-action,不能实现复杂的网络应用,故采用match-state-action的模式来实现有状态的数据平面的数据转发.由于P4语言的工作方式和OpenFlow的相似,故也可以采用这种模式来实现网络功能.
图1 解析协议状态图Fig.1 State graph of parsing the protocol
AVANT-GUARD[9]针对软件定义网络(SDN)控制平面和数据平面分离存在的denial-of-service (Dos) 攻击进行分析,提出了connection migration 和actuating triggers方法,这些方法的实质还是使用了状态的转换.
另一个相关工作是P4可编程包处理语言,使用P4[10-13]语言可设计协议无关的数据包处理器,而对于MiddleBox来说,实现协议无关是其一个重要的目标.故本文采用P4语言来实现MiddleBox功能.P4中提供了基本的数据包的处理,但是对于复杂功能的VNF的开发实现相对比较困难,故使用扩展有限状态机的方法来实现VNF的复杂功能.
为了实现MiddleBox的可扩展性、可编程性,本文使用P4语言实现了一个有状态的VNF——限速器,扩展了P4语言的match-action工作模式为match-state-action模式,为实现复杂MiddleBox数据平面的数据转发提供了方法.并将实现的VNF部署于容器Docker中,方便VNF的移植,且提高了物理主机的资源利用率.与其它MiddleBox相比,本系统实现了协议无关、可重配置,同时部署于Docker容器中,有较高资源利用率,且方便系统移植.
3 系统设计
在数据中心中,通过构建虚拟网络功能,使原本运行于特定硬件的网络功能运行于通用硬件设备上,解耦了网络功能和硬件的关联.下面详细阐述系统设计.
图2 限速器状态转换图Fig.2 State transition graph of the speed limiter
3.1 协议无关
由于网络技术的不断发展,数据中心中所支持的协议也不断增多,若针对特定的协议集进行协议相关的设计,当增加新协议的支持时,就要对系统进行升级或重新设计,可扩展性较差.所以本文中设计协议无关的虚拟网络功能.
选用P4语言进行系统的开发,是因为P4语言可实现协议无关数据包处理器.P4语言的构成主要分为五个部分,即头部、解析器、表、动作和流控制程序.解析器采用了有限状态机的设计思想.如图1所示,每一个节点可以看成是一种状态,当要增加一个新协议时,假如为VXLAN协议,只需增加一个状态,也就是增加一个解析器,在图中就是实心圆圈的节点.在P4解析器解析数据包之前,解析器并不知道该数据包使用哪种协议,只有当解析器解析完数据包后,才确定其采用何种协议.在解析过程中,提取数据包头的数据字段,数据字段的抽取可根据需求提取,同时又定义了大量的match-action表,执行匹配操作.通过这两点实现协议无关.
3.2 扩展有限状态机设计
在P4语言中,虽然使用match+action可以实现一般的数据平面的数据的处理,但是对于一些复杂的网络功能(有状态的防火墙、负载均衡、NAT等)就不太容易实现,因为在P4中没有相关的状态模块,故引入了扩展有限状态机方法,实现网络功能状态的转换.
扩展有限状态机(EFSM)是一种常用的软件形式规格说明,由多个状态及状态之间的迁移构成.一个EFSM规格说明可以用—个六元组(S0,S,V,I,O,T)来表示.其中:S0是初始状态,S是状态的集合,V是变量的集合,I是输入值的集合,O是输出值的集合,T是迁移的集合.T中每个迁移t又可表示成一个五元组
,其中:head(t)是迁移t的初始状态,tail(t)是其结束状态;event(t)为迁移t上的输入事件;condition(t)为迁移t执行的前提条件;action(t)为一系列的操作动作,表明当event(t)事件出现时,若condition(t)成立,则迁移t从head(t)状态变迁到tail(t)状态,并执行action(t)中的相应语句.例如,本文实现的VNF实例——限速器,它的状态转换如图2所示,限速器包含三个状态,GREEN、YELLOW和RED.当传输速率小于阈值threshold1,限速匹配项的状态就是GREEN状态,当速率在阈值threshold1和threshold2之间的事件发生时,状态由GREEN变为YELLOW,并执行动作action2().在YELLOW状态下产生速率大于threshold2事件,则匹配项状态变为RED,并执行action3().匹配项从状态RED到YELLOW,再到GREEN的转换同GREEN到YELLOW和RED的状态变化.
为方便状态管理,系统分两个不同的表(状态表和扩展有限状态机表),状态表主要用于查询匹配项的当前状态,扩展有限状态机表主要用于匹配项状态的转换查询,根据匹配项当前状态和触发事件确定该匹配项的下一状态和执行的动作.
在处理数据包的过程中,主要步骤可以分为以下三步:
1)状态查询
状态查询主要查询状态表,根据关键字进行匹配,查询该匹配的状态.
2)状态转换
根据状态查询阶段查询到的状态,结合触发的事件,查询扩展有限状态机表,确定匹配项的要执行的动作和下一个状态.
3)状态更新
重写状态表,替换匹配项的旧状态成新状态.
例如,本文实现的限速器,实现了状态表和扩展有限状态机表,如图3所示.假设当前来了一个源IP地址为1.1.1.1的数据包,查询状态表,可得到该IP地址的对应的状态为GREEN,若此时速率计数器中的速率在阈值threshold1和threshold2之间,查询扩展有限状态机表,确定该数据包执行action2动作,并更新状态表中源IP地址为1.1.1.1的状态为YELLOW.
图3 包处理状态转换Fig.3 State transition of Packet processing
3.3 Docker部署
传统的虚拟化技术对物理主机的资源利用率无法达到物理主机的水平.且传统的虚拟化技术配置文件不灵活,难以进行自动化创建、部署.而与之相对应的一个概念是容器.容器的思想就是把一个进程(包括其所有子进程)独立打成一个包,而不影响在系统中运行的其他进程.容器是基于共享Linux内核的一种虚拟化技术.容器中的进程所运行的环境是独立于物理主机操作系统的,当容器启动的时,也仅是通过进程间的调度,而不需要引导整个系统,从而提高了效率.Docker则是一种更轻量级的虚拟化容器技术,具有易使用、方便移植、可跨平台等优势.同时,Docker能够进行快速、标准化封装应用程序并自动化部署整个运行环境.
虚拟主机技术能使得一台物理主机同时运行多个操作系统,且操作系统的类型不同,物理主机系统称为 Host OS,而在虚拟机中安装的操作系统则称为Guest OS.每个Guest OS都有自己的计算、存储和网络组件,这些可以通过硬件虚拟化而来,或者Host OS通过把 Guest OS的指令翻译成物理机指令来实现.从理论上来说,Guest OS可以是任何一种操作系统,与底层的Host OS无关.
容器则是可以看成是一种轻量级的操作系统,它运行在物理主机系统之上,直接使用物理主机的CPU指令,而不需要像虚拟机那样要对指令进行翻译.故容器相比于虚拟机开销较小,并且能够提供很好的隔离性.经过实验测试,在启动Docker不加载额外软件时,即只使用基本的系统镜像,所占用的内存仅有几兆,甚至更少.因为Docker对于内存的消耗主要是由于加载应用程序,而不像虚拟机那样需要额外提供给一些系统级的服务.因此,对于一台服务器来说,Docker能比虚拟机提供更多隔离的容器供用户使用,这样就大大提高了物理主机的利用效率.
表1 虚拟机和容器在性能上的比较Table 1 Comparison of performance of virtual machines and containers
虚拟机与容器在性能、隔离性、安全性、网络和存储上的不同之处如表1所示.本文使用Docker容器进行VNF虚拟化部署.
Docker制作特定软件镜像主要有以下两种方法:
1)直接在基础镜像上安装软件,然后使用Docker命令将其封装成一个新的镜像;
2)使用Dockerfile文件,拉取进出系统镜像后,让镜像根据Dockerfile文件的内容自己编译安装.
两种方法各有优缺点:
第一种方法的优点是所有操作与真实操作一台虚拟机一样,无需重新学习其它新内容;缺点是在部署这些镜像时,可能会由于所处环境的不同而需要重新修改部分内容.
表2 direct方式计量器Table 2 Direct meter
第二种方法则只需要在部署时编写Dockerfile文件,然后让系统自己去拉取数据,这样能够减少所需下载的内容,且由于镜像完全是按照Dockerfile文件的内容来制作的,所以能够减少人为的误操作;但其缺点要学习配置Dockerfile文件.
表3 static方式计量器Table 3 Static meter
文中使用第2种方法来部署限速器,主要步骤如下:
1)下载基础系统镜像;
2)使用Dockerfile的内建指令下载安装软件,包括P4的开发运行环境;
3)使用Dockerfile内建指令加载对应的配置文件.
4 系统实现
本文使用P4语言实现了一个VNF——限速器,限速器是有状态的协议无关的,部署于Docker中运行,Docker运行在Ubuntu16.04系统,电脑是联想Y470,CPU是Intel(R) Core(TM) i5-2450M (2.50 GHz),内存是8.00GB.下面将详细描述系统实现.
4.1 编程环境
系统是在P4的开发环境下实现的,其中包括前端编译器p4c-bmv2和一个模拟器behavioral-model.限速器的核心代码编写于meter.p4这个文件中,使用前端编译器p4c-bmv2将meter.p4文件编译成meter.json文件,使用模拟器behavioral-model加载配置文件meter.json到simple_switch模型中,就形成了一个限速器.
P4程序的开发就是模型和配置文件的开发,模型是系统运行的大框架,配置文件只是对这个模型进行配置,形成具体功能的部件.由于限速器和交换机的功能模型类似,故使用了P4开发环境提供simple_switch模型.在后续复杂VNF的开发中,可能会使用更加复杂的模型,故定制模型的开发也是一个研究方向.
4.2 限速功能的实现
限速功能的实现主要采用P4语言的meter组件,该组件可以对match-action表的中的匹配项的速率进行统计.在meter组件中,有两种工作方式,一种是direct,一种是static.
在direct方式中,对匹配表中的每一项都有一个计量器来记录该匹配的交换速率,且速率是自动更新的,不用单独去调用函数执行.该计量器根据设定的速率阈值返回一个2bit的二进制数,其中00表示为GREEN,01表示为YELLOW,10表示为RED.如表2所示,表中根据数据包的源IP地址进行匹配,在表中列出了三个匹配项,对于direct方式,会为这三个匹配项分别分配一个计量器,来统计该匹配项的交换速率.
而在static方式中,计量器只能在match-action表中的action中通过调用函数execute_meter 函数来执行计量器的速率的更新,且不同的表不能调用同一个计量器.该计量器的是根据动作的参数来分配计量器.如表3所示,计量器是以static方式工作,对于源地址为1.1.1.1和2.2.2.2的匹配项,其动作参数同为aa,故只分配meter[1]计量器对两个匹配项一起进行统计速率.
在限速器中,使用meter的这两种方式实现了限速器端口限速和源IP地址限速.这两种限速在实际的网络中有着广泛的应用,起到保护网络带宽和网络安全的作用.系统的架构如图4所示,系统运行于容器Docker中,使用P4语言官方提供的交换模型,这里的交换模型包含处理数据包的各个功能执行部件,有报头解析、报文缓冲调度队列、报文的match-action执行等.而我们所做的事情是编写P4文件,来定义要解析报文的格式、match-action表结构,文中实现了限速功能.将定义好的P4配置文件使用软件p4c转换成json文件,再将json文件加载到交换模型,就形成了限速器.最后将限速器部署于容器Docker中运行.
图4 系统结构图Fig.4 Architecture of system
图5 端口限速,GREEN通过Fig.5 Port speed limit,GREEN pass
图6 端口限速,GREEN和YELLOW通过Fig.6 Port speed limit,GREEN and YELLOW pass
图7 地址限速,GREEN通过Fig.7 Address speed limit,GREEN pass
图8 地址限速,GREEN和YELLOW通过Fig.8 Address speed limit,GREEN and YELLOW pass
图9 混合限速,GREEN通过Fig.9 Mixed speed limit,GREEN pass
图10 混合限速,GREEN和YELLOW通过Fig.10 Mixed speed limit,GREEN and YELLOW pass
当前的限速只是对报文进行简单的丢弃,在后续的工作中,将加入数据流的缓冲和整形,使限速更加友好.
5 系统测试
本文实现的限速器主要有端口限速和根据源IP地址限速,其中源IP地址可以是一个网段.
5.1 端口限速
构建一个发包器向虚拟网口veth1发送源IP地址为1.1.1.1的报文,发送速率分别为1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.在虚拟网口veth3进行流量监测.
①设定虚拟网口veth1的限速阈值threshold1=8MB/s,threshod2=12MB/s,配置的规则为在GREEN状态下通过,YELLOW状态和RED状态下丢弃.测试结果如图5所示,最大速率为8MB/s.
②设定虚拟网口veth1的限速阈值threshold1=8MB/s,threshod2=12MB/s,配置的规则为在GREEN状态和YELLOW状态下通过,在RED状态下丢弃.测试结果如图6所示,最大速率为12MB/s.
5.2 源IP地址限速
发包器向虚拟网口veth1发送源IP地址为1.1.1.1的报文,速率分别为1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.
①设定根据源IP地址限速的阈值threshold3=6MB/s,threshold4=14MB/s,配置的规则为在GREEN状态下通过,YELLOW状态和RED状态下丢弃.测试结果如图7所示,最大速率为6MB/s.
②设定根据源IP地址限速的阈值threshold3=6MB/s,threshold4=14MB/s,配置的规则为在GREEN状态和YELLOW状态下通过,在RED状态下丢弃.测试结果如图8所示,最大速率为14MB/s.
5.3 混合限速
发包器向虚拟网口veth1发送源IP地址为1.1.1.1的报文,速率分别为1MB/s、5MB/s、10MB/s、15MB/s、20MB/s.
①设定虚拟网口veth1的限速阈值threshold1=8MB/s,threshod2=12MB/s,设定根据源IP地址限速的阈值threshold3=6MB/s,threshold4=14MB/s,配置的规则为在GREEN状态下通过,YELLOW状态和RED状态下丢弃.测试结果如图9所示,最大速率为6MB/s.
②设定虚拟网口veth1的限速阈值threshold1=8MB/s,threshod2=12MB/s,设定根据源IP地址限速的阈值threshold3=6MB/s,threshold4=14MB/s,配置的规则为在GREEN状态和YELLOW状态下通过,在RED状态下丢弃.测试结果如图10所示,最大速率为12MB/s.
6 总结和展望
无论是数据中心、企业网或是运营商,对于MiddleBox都要求可灵活配置、方便管理、支持协议扩展,而目前市场上大多数都是基于硬件的MiddleBox,不能很好的满足应用需求.所以,本文提出了一种基于P4语言设计实现的有状态的虚拟网络功能(VNF).该VNF是协议无关的,支持协议的扩展.同时,网络功能设备的一些控制功能(如端口的状态、端口的速率等)可以从VNF的控制平面卸载到数据平面,这样既可以提高控制的效率,又可以减少控制平面和数据平面的频繁通信.数据流在数据平面处理的过程中,都是从一个处理模块到另一个模块进行处理,每次处理的结果都可以看成是数据流的一个处理状态,特别是有些流的处理是根据其他流的状态进行触发的,故记录数据流的状态以及状态的转换显得非常重要.然而P4语言的工作方式为match-action模式,无法实现复杂的网络功能,故在VNF实现中采用扩展有限状态机的方法,用于实现数据流状态的转换.通过这种扩展有限状态机的方法可实现那些根据流状态进行行为转发的网络功能(如防火墙、负载均衡器、限速器和ddos防御等).但在P4语言中,所实现的字段匹配大都是报文头部的字段匹配,对于负载的处理较少,故对于一些报文负载检测的功能(如深度报文检测)无法在数据平面直接实现,可将其提交到控制平面进行处理,或是扩展P4语言的方法类库,以支持报文负载的处理.我们将设计好的VNF部署在轻量级容器Docker中,因为使用Docker可以使得物理主机的资源利用效率更高,且部署于Docker当中,方便VNF的移植.
在后续的工作中,我们将设计实现更多的VNF,将其作为一个个模块,建立一个软件定义的MiddleBox平台.用户在平台上根据自身的需求对VNF进行定制.如用户需要防火墙和入侵检测两个功能,那他就可以使用这两个功能的VNF模块进行定制,在平台上统一管理.若后期需要增加一个NAT功能,只需在原来的基础上再增添一个NAT模块.当然,构建这样的MiddleBox平台,就要考虑不同VNF Docker之间的通信等问题.