浅谈在IXP2400中以IPSec实现安全网关的一种方案

时间:2023-06-21

  “Internet 协议安全性 (IPSec)”是一种开放标准的框架结构,通过使用加密的安全服务以确保在 Internet 协议 (IP) 网络上进行保密而安全的通讯。Microsoft? Windows? 2000、Windows XP 和 Windows Server 2003 家族实施 IPSec 是基于“Internet 工程任务组 (IETF)”IPSec 工作组开发的标准。IPSEC是一套比较完整成体系的VPN技术,它规定了一系列的协议标准。如果不深入探究IPSEC的过于详细的内容,我们对于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]:

  (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体系设计与算法无关,因而可以为不同的通信对等体选择不同的安全算法。为维护这些动态存在的安全策略,在实现IPSec时,需要定义相应的安全策略数据库(SPD),其中的每1条记录就是1条安全策略。

  为正确处理具有IPSec功能的IP包,IPSec通信对等体需要将经协商一致后所采用的安全协议、工作模式、加密/算法、密钥等信息与所建立的链路结合起来,才能为不同的数据流提供不同的安全保护。其实现方法就是在IPSec通信对等体间建立安全关联(SA)。SA是通信对等体之间为进行安全通信而协商的一种约定。

3  IPSec在IXP2400中的实现

3.1  程序设计

  网络应用程序中,网络信息的处理通常包含在以下2个逻辑层面中[5]:

  (1)数据层面:负责高速处理、转发数据包。因所有要处理的数据包都必须通过该层面,故其性能直接影响到整个程序的性能。

  (2)控制层面:主要处理协议信息,并负责创建、配置及更新各种表和数据集,供数据层面查找使用。如处理含路由信息的RIP、OSPF包,然后更新IPv4转发表,供数据层面使用。

  在IXP2400中,将数据层面分为快速通道和慢速通道。快速通道主要由各微引擎构成,完成绝大多数包的正常处理,如IP包转发等;慢速通道主要由XScale构成,处理少数需复杂处理的包,如异常包、包分段等。每个微引擎的流水线又可由若干流水线级构成,这些流水线级是顺序执行的。如某个流水线级的功能对所处理的包并不要求,则在执行到该流水线级时必须进入等待,当线程下获得运行时再执行下一流水线级;如有数个微引擎在并行执行同一任务,则必须考虑微引擎间的执行顺序。可见,将少数包要求的复杂处理任务交给XScale,能有效减少微引擎不必要的等待时间,加快数据的处理速度。

  通常,将快速通道处理任务按逻辑划分为若干功能块,在可编程的微引擎中,每一块实现称为一个微功能块(microblock)。而将运行在XScale中的微功能块对应的慢速通道处理部分称为组件(Core Component),完成相应微功能块的配置、初试化及维护共享数据结构,并处理微功能块发送的异常包或信息。此外,各种路由协议也运行在XScale中,处理各种协议信息。这样实现了数据层面和控制层面的分离,两层面间可用标准API通信。

  将所有任务放在一个IXP2400中实现,可能满足不了线速要求,因而通常将任务分配到2个IXP2400来实现。这样对于需要较多指令的微功能块,可指定多个微引擎并行运行,适当增加每个微引擎的执行时间。

3.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);                    //丢弃包的处理

  }

上一篇:利用FPGA实现DES加密算法的动态配置
下一篇:北斗星高GPS航迹测量系统设计方案

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料