Implementation of an FPGA-Based IP Reassembly Module 摘要:为了更好地支持网络安全,IP碎片重组是IDS/IPS中一个必不可少的操作。由于采用软件实现IP碎片重组的速度很低,很难达到高速接口的线速处理要求,所以在高速IDS/IPS上应采用硬件处理的机制。本文实现了一个基于Altera FPGA的IP碎片重组模块,可解决IDS/IPS处理IP碎片重组遇到的性能瓶颈问题,同时提供了一种IP碎片攻击的预警机制,其特点是可以根据设备资源的使用情况,提供不同程度的警报信息。借助于QuatusII综合布线工具,经面向硬件电路的仿真验证,本文的方法可实现OC-48接口(2.5Gb/s)上线速分组的IP碎片重组,并具有硬件开销小,可扩展性好的特点。 关键词: IP碎片;FPGA;RLDRAM控制器;最大传输单元; Abstract:In order to secure the network, IP reassembly is needed on every IDS/IPS. Because the software-implementation could not run at a high speed, the processing of IP reassembly should be implemented in hardware. In this paper, we implemented an FPGA-based IP reassembly module. It solved the bottleneck problem that most IDS/IPS had met, and it also provided a mechanism to be aware of the attacks that had been launched by hackers using the vulnerability of IP fragmentation and reassembly. The design was verified on an Altera FPGA using QuatusII to synthesize and floor plan. It can achieve a throughput of 2.5Gb/s. And it is characterized as low cost and high scalability. Keyword: IP fragment; FPGA; RLDRAM controller; MTU; Hole 1 引言 由于链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值,如以太网的MTU是1500字节。IP分组的理论长度可达64KB,如果IP层要发送的数据报文的长度超过了链路的MTU,那么IP层就要对数据报文进行分片操作,使每一片的长度都小于或等于MTU。在报文的接收端,需要对分片的报文重组。 IP碎片一直存在于各种类型的网络中,对网络设备和终端有着不可忽视的负面影响[1]。路由器需要耗费控制通路的资源来处理IP分片和重组,对于终端,IP分片和重组不是在网卡的专用硬件上完成的,而是由操作系统完成的,每个报文的处理都要产生中断,内存拷贝,耗费大量的CPU周期。攻击者利用上述特征,将攻击流量进行分片后向攻击目标发送,导致目标主机因处理IP碎片能力耗尽而出现拒绝服务。为解决这一问题,不少IDS/IPS软件都已经实现了IP碎片重组的功能,如Snort[2](使用frag2预处理模块),但当面临大量的分片报文时,系统的吞吐率仅能达到几十Mb/s。此外,攻击者还针对系统内核在重组过程中存在的漏洞,向目标主机发动攻击,造成系统崩溃或者更严重程度的拒绝服务,著名的攻击有:ping o’death,jolt2,teardrop[3],这对IP碎片重组的工作提出了严峻的挑战。 本文采用RFC815中的重组算法实现的基于FPGA的IP碎片重组模块能够提供对OC-48接口流量的支持,具有硬件开销小,可扩展性好的特点,并提供了一种针对IP碎片攻击的预警机制,能够抵抗常见的IP碎片攻击,可作为构成先进网络安全设备的重要组件。 2 IP报文的分片与重组操作的关键技术 IP报文头部有3个字段用于分片与重组:ID字段,Flag字段和偏移字段。ID字段用于标识特定数据报文的分片,依据IP报文的源地址、目的地址、协议号和ID字段,可以确定每个分片所属的原始数据报文。Flag字段由3个比特组成。比特0保留,比特1表示“不分片”(DF),比特2表示“更多分片”(MF)。偏移字段表示该报文在原始报文内分片的位置,以8字节为单位计算。在重组过程中,当某个数据报文的所有分片都到达以后,将分片按照顺序组合起来,形成一个更长的完整报文,交给上层协议处理。 在使用软件处理IP碎片重组时,每到达一个报文,就要产生一次系统中断,两次内存拷贝,为了维护重组信息,还要多次读写存储器。对于1Gb/s的接口,1500字节报文的到达间隔是12us,一般的操作系统无法达到这样的性能。目前,很多商用硬件网络安全设备都实现了IP碎片重组的功能,但是其速率最高也仅能支持到1Gb/s,而其设计方案并没有公开。 本文提出的IP碎片重组设计方案,使用少量的片上内存以及高速的短延迟DRAM(RLDRAM),采用灵活的硬件控制机制,可支持2.5Gb/s的接口流量,并具有良好的抗攻击特性。 3 设计方案 重组模块的设计如图1所示,主要由7个模块和3个表构成:主控模块,Checksum模块,哈希模块,老化模块,洞描述符控制器,读写控制模块,RLDRAM控制器;内存块信息表,重组信息表,洞描述符表。下面分别介绍各模块的设计及表的构造。 图 1 IP碎片重组模块设计图 3.1 重组信息表 重组信息表的表项记录了重组报文的必要信息,其结构如图2所示。协议号、源地址、目的地址、ID分别记录IP报文的对应域;锁定表示该表项被设定为锁定状态,不能被其他模块写入;块头指针指向重组报文所在的内存块链表头,块尾指针指向当前该重组报文最后一个分片所在内存块;有效位表示该表项是否有效,0为无效,1为有效;计时器用来对重组过程计时,每收到一个分片,将计时器初始化重新计时;洞计数记录重组报文过程中出现的洞的个数。已超时表示该报文重组超时。重组信息表有1K个表项,支持1K个IP报文同时重组。使用的内存大小为:126×1K=126Kb。 图2 重组信息表的表项 3.2 内存块信息表 内存块信息表的表项记录了每个内存块连接的信息,其存储的下一内存块指针用来将内存块连接起来形成链表。每个内存块大小为4KB,为了支持1K个64KB的最长IP报文,一共有16K个内存块,所以指针长度为14位,使用的内存大小为:14×16K=224Kb,外部存器的需求是16K×4KB=64MB。 3.3 洞描述符表 在RFC815中,对重组过程中出现的“洞(hole)”做了解释,比如对于没有分片到达的情况,其洞描述符为0000ffff(0-64K),当偏移字段为0xB9(185),长度为1500字节的报文到达时,原来的洞描述符变为了两个新的洞描述符:0000-05C7(0-1479),0B90-ffff(2960-64K),洞描述符记录着尚未到达的字节的偏移位置。 洞描述符表的表项如图3所示,记录了重组报文过程中洞的位置,前向指针和后向指针分别记录前一个洞描述符和后一个洞描述的地址;每个重组报文最多可以出现6个洞,所以洞描述符表共有6K个表项,使用的内存大小为:58×6K=348Kb。 为了实现对表项的快速访问,上述3个表全部使用FPGA上的片内存储器实现。 3.4 主控模块 主控模块接收哈希模块送来的地址,访问重组信息表,并根据报文头部的信息确定下一步的操作。可能的操作如表1所示[4]。其中,有效位表示重组信息表的有效位。