摘 要:讨论了在IXP2400上应用IPSec实现安全网关的一种方案,可为通过的业务流提供较强的安全性。
关键词:网络处理器; IXP2400;微引擎; IPSec
IPSec是一种基于IP层的通信安全机制,是目前唯一一种可为任何形式的通信提供安全保障的协议,因而实现具有IPSec功能的网关能保证IP层通信的安全。然而,用IPSec对数据包进行认证、加/解密处理等,都是比较耗费资源的工作,容易使具有IPSec功能的网关设备出现瓶颈问题;同时,基于ASIC研发具有这类复杂功能的新产品更为困难。因此,传统的网络解决方案已在处理速度和灵活性两方面受到挑战。具有通用CPU的灵活性和ASIC芯片的执行速度的可编程网络处理器的出现,为IPSec机制在线速网关设备的应用提供了新途径。
本文介绍了Intel的IXP2400网络处理器的特点、结构以及IPSec体系结构,讨论了在IXP2400中以IPSec实现安全网关的一种方案。
1 IXP2400的体系结构
网络处理器(Network Processor)是一种面向包结构处理的专用器件。IXP2400是Intel公司第二代高性能网络处理器之一,是在第一代网络处理器的基础上,实现了高性能的并行处理结构,从而能够实现复杂的算法、深入查看包内容、进行流量管理及以线速(2.4 Gb/s)转发包等;并首次采用Intel的超任务流水线技术,允许将1个包处理任务分解为多个易于衔接的、有序的子任务,并确保微引擎间通信的低时延。在体系结构上,具有以下特点:
(1)多处理单元结构,各单元独立运行,并以硬件实现多线程技术,线程间无任何需切换开销。
(2)以软件流水线的形式分派任务到各处理单元,各处理单元可并行操作。
(3)ALU采用优化过的指令,专用于数据包处理,1条指令能在1个时钟周期内完成。
(4)具有一些完成特殊功能的硬件单元,如CRC校验、Hash计算、甚至加/解密运算单元,用于加速专用处理。
IXP2400的体系结构如图1所示。
其主要功能部件如下[1]:
(1)XScale:32位的RISC高性能通用处理器,用于初始化、管理整个芯片,同时能执行高层网络处理任务,如复杂的算法处理、路由表维护等。
(2)Microengine(MEv2):8个相互独立的32 bit可编程微引擎,是处理数据的主要场所,各微引擎间用寄存器通信。每个微引擎主要包括:1个存放该微引擎运行程序的控制存储器、8个硬件支持的线程、数据通路和控制状态寄存器、1个ALU及1个CRC单元等。
(3)存储器控制器:用于控制访问片外RAM,包括SRAM、DRAM。SRAM主要用于存储各种控制信息,如路由表等;DRAM主要用作数据处理的缓冲区。
(4)Scratch:片内的16 KB通用存储器,存放各种经常需快速查找的数据。
(5)Hash:能对48 bit、64 bit或128 bit的数据作Hash运算,并生成索引。
此外,IXP2400中还采用了一些如硬件队列等技术来提高ALU的处理速度。
2 IPSec的工作原理
IPSec的安全服务是通过在IP层对所有数据流使用密码和安全协议联合实现的,能保证应用程序通信的安全性。它能应用于防火墙和路由器等网关设备,对上层应用是透明的。
IPSec利用2种通信安全协议[2]:认证头(AH)和封装安全载荷(ESP)。还有用于密钥交换和管理的Internet密钥交换协议(IKE)[2]和相应的认证/加密算法等协议组件。AH和ESP既可用于保护一个完整的IP包,也可以用来保护IP包中的上层数据。此外,还可以组合使用,实现不同的安全保护级别。AH和ESP使用2种工作模式[3]:传输模式和隧道模式。
由于IPSec体系设计与算法无关,因而可以为不同的通信对等体选择不同的安全算法。为维护这些动态存在的安全策略,在实现IPSec时,需要定义相应的安全策略数据库(SPD),其中的每1条记录就是1条安全策略。
为正确处理具有IPSec功能的IP包,IPSec通信对等体需要将经协商一致后所采用的安全协议、工作模式、加密/认证算法、密钥等信息与所建立的链路结合起来,才能为不同的数据流提供不同的安全保护。其实现方法就是在IPSec通信对等体间建立安全关联(SA)。SA是通信对等体之间为进行安全通信而协商的一种约定。SA可由1个三元组唯一标识,表示为<安全参数索引(SPI),目的IP,安全协议标识>。
为维护所有活动的SA参数,在实现IPSec时,需要定义相应的SA数据库(SAD)。IKE的主要功能就是在IPSec通信对等体间动态进行通信参数协商[4],并提供经认证的密钥信息,从而建立起SA,对其进行维护和管理。
3 IPSec在IXP2400中的实现
3.1 程序设计
网络应用程序中,网络信息的处理通常包含在以下2个逻辑层面中[5]:
(1)数据层面:负责高速处理、转发数据包。因所有要处理的数据包都必须通过该层面,故其性能直接影响到整个程序的性能。
(2)控制层面:主要处理协议信息,并负责创建、配置及更新各种表和数据集,供数据层面查找使用。如处理含路由信息的RIP、OSPF包,然后更新IPv4转发表,供数据层面使用。
网络处理器就是完成这2个层面的功能。
在IXP2400中,将数据层面分为快速通道和慢速通道。快速通道主要由各微引擎构成,完成绝大多数包的正常处理,如IP包转发等;慢速通道主要由XScale构成,处理少数需复杂处理的包,如异常包、包分段等。考虑到处理速度的要求,在快速通道中通常将处理任务以软件流水线形式分配到多个微引擎中实现,每个微引擎以编程方式实现所指定的任务。当一个微引擎完成其任务后,将包传到下一微引擎继续处理,直至完成整个任务。每个微引擎的流水线又可由若干流水线级构成,这些流水线级是顺序执行的。由于每个微引擎有8个线程并发(甚至有数个微引擎的线程在并行)执行相同任务,因而要按序正确处理数据包,就必须考虑各线程访问临界区代码的同步问题。为保证指令尽可能少,以达到线速要求,一种处理方法就是:在一个微引擎中让各线程顺序执行,并且每个线程顺序执行所有流水线级。如某个流水线级的功能对所处理的包并不要求,则在执行到该流水线级时必须进入等待,当线程下一次获得运行时再执行下一流水线级;如有数个微引擎在并行执行同一任务,则必须考虑微引擎间的执行顺序。可见,将少数包要求的复杂处理任务交给XScale,能有效减少微引擎不必要的等待时间,加快数据的处理速度。
对于控制层面,因所要处理信息复杂、广泛,涉及的指令范围广,数据层面中的快速通道是难以处理的,因而应放在XScale中实现[5]。
通常,将快速通道处理任务按逻辑划分为若干功能块,在可编程的微引擎中,每一块实现称为一个微功能块(microblock)。而将运行在XScale中的微功能块对应的慢速通道处理部分称为核心组件(Core Component),完成相应微功能块的配置、初试化及维护共享数据结构,并处理微功能块发送的异常包或信息。此外,各种路由协议也运行在XScale中,处理各种协议信息。这样实现了数据层面和控制层面的分离,两层面间可用标准API通信。
将所有任务放在一个IXP2400中实现,可能满足不了线速要求,因而通常将任务分配到2个IXP2400来实现。这样对于需要较多指令的微功能块,可指定多个微引擎并行运行,适当增加每个微引擎的执行时间。
3.2 系统功能
综上述分析,实现方案的系统框图如图2所示。
其中,接收微功能模块(Receive Microblock)和发送微功能模块(Transmit Microblock)用于数据包的接收和发送,发送队列(Transmit Queues )用于数据包的队列管理、调度,IP转发微功能模块(Forwarding Microblock)用于一般IP包的简单转发(包括路由通告等),核心组件是相关微功能块的慢速通道处理部分,如异常处理等;XScale中还运行嵌入式OS、各种协议及高层处理程序等。
IPSec处理微功能模块(Processing Microblock)是系统的主要部分,包括以下主要功能:协议核心、AH/ESP处理模块、SPD、SAD。其中,AH/ESP处理程序负责根据SA中定义的安全服务按照AH/ESP协议对数据包进行处理;SPD和SAD以适当的查找表结构存放在片外的SRAM中,但该微功能块中有各自的快速访问接口,供其查询数据使用(在XScale中也有访问这2个数据库的接口,以便维护其中的数据);协议核心主要是协调以上各部分的工作,解释获取的IP包等。
3.3 数据处理过程
IPSec模块是整个IPSec系统的核心,处理包的过程如下:
(1)线程摘取1个IP包,判断是否是经分段的,若是,该线程进入等待状态,下一线程开始运行。在所有分段到达并重组后,进入下一步处理。
(2)使用选择符检索SPD,若查找失败,抛弃包;若返回的动作是“抛弃”,抛弃该包。对于不包含IPSec头的包,若返回的是“绕过”,将包交给IP转发模块处理(若目的IP是本机,将其交到XScale中,由相应程序处理,否则转发到下一节点);若返回的是“应用”,进入(4)处理。对于包含IPSec头的包,若返回的是“应用”,且包的目的地是本机,则进入(3)处理;若目的地不是本机,则进入(4)处理。
(3)用检索SPD返回的三元组搜索SAD,若没有匹配的SA,则丢弃该包;否则,按SA中的定义进行处理,主要包括:
①重发检查:用序列号及溢出标志、重发窗口大小检查包是否有效。
②数据包验证:用指定的认证算法及密钥,验证数据包。若ESP没选择认证,则不做。
③解密:若是ESP协议包,则用指定的加密算法及密钥,解密数据包。
以上处理失败,则丢弃该数据包;若包中还有IPSec头,需选择新的选择符,重复(2)、(3)。
④重构IP包交给IP转发模块处理。
(4)用检索SPD返回的三元组搜索SAD,若没有匹配的SA,线程向XScale发出IKE的服务请求,由IKE服务程序与通信对等体协商建立相应的SA,并记入SAD。具备SA后,有序进行如下处理:
①根据SA中指定的安全协议及操作模式,调用对应的处理模块,为数据包生成协议头。
②若采用传输模式,只需将原IP头中的协议类型改为上一步中所用协议;若是隧道模式,则需要以隧道两端的IP作源、目的IP和上一步中所用协议,生成新的IP头,封装原IP包。
③对ESP协议,按SA中指定的加密算法和密钥,对包的相应部分加密。
④按SA中指定的认证算法,对包的相应部分进行认证。
⑤修改有关数据,重新计算校验和;若需要分段处理,将包交给XScale中处理。
(5)经以上处理后,将包安排到对应端口的队列中,经调度后由传送模块经重新添加MAC帧头后发送。
值得一提的是,在以上过程中,由于是多线程处理,因而在1个微引擎中,一个线程进入等待状态,另一个线程立刻运行,这一过程由编程者控制完成的。下面的程序段是数据处理过程的主要控制部分:
while(1){
dl_source(); //从接收线程取下包描述符
if(dlBufHandle= =0){ continue; }
Ethernet_validate(); // 验证这个包是一个有效的以太网头
Ethernet_strip_header(); //去掉以太网头
IPSec_process(); //IPSec处理
IPv4_five_tuple_class(); //进行IPv4 classifier的转发
If(dlNextBlock= =IX_DROP){ //clNextBlock全局变量,
//表示下一个
Goto drop; //跳转到丢弃包的处理模块
}
Ethernet_add_header(); //添加新的以太网头
D1_sink(); //将处理后的包描述符放入发送缓冲区中
Drop:
Dl_BufDrop(dlBufHandle); //丢弃包的处理
}
IPSec被认为是目前实现VPN的技术标准,在Internet的安全通信中发挥着重要作用。当前对网络通信不断提出了速度和安全的更高要求,以兼备通用CPU的灵活性和ASIC芯片执行速度的网络处理器为核心实现高速安全网络设备,是当前网络新技术的应用研究重点。
参考文献
[1] Intel Corp. Intel IXP2400 network processor hardware reference manual[DB/OL]. 2002.
[2] GONCALVES M. IPv6网络[M]. 黄锡伟,杨 震,译.北京:人民邮电出版社,2000: 251-275.
[3] DAVIS C R. IPSec VPN的安全实施[M]. 周永彬,冯登国,徐震,等译. 北京:清华大学出版社,2002:165-201.
[4] 王 健,李 涛,刘晓洁,等. IKE的研究及其在IPSec中的应用[J]. 通信技术,2003,144:128-129.
[5] Intel Corp. Intel IXA portability framework: developer′s manual[DB/OL]. 2002.