原创 基于netfilter的Linux抗DDoS硬件防火墙的研究与设计

2009-9-20 16:54 1297 4 4 分类: 测试测量
作者:    时间:2007-11-02    来源: 
 
       引 言

近年来Linux得到了迅速发展,特别在网络安全领域Linux被广泛的运用,其中就包括防火墙的设计和开发。Linux2.4以后的内核都采用了一种称为netfilter架构的防火墙机制,netfilter提供了一个抽象、通用化的框架,该框架定义的一个子功能的实现就是包过滤子系统。netfilter比以前任何一版Linux内核的防火墙子系统都要完善强大。本文就介绍了在netfilter基础之上Linux硬件防火墙的设计与开发。


1 原 理


1.1 netfilter框架


netfilter是Linux2.4以后版本内核提供的防火墙内核级框架,IPv4协议栈为了实现对netfilter架构的支持,在IP packet在IPv4协议栈上的游历路线之中,仔细选择了5个参考点。在这5个参考点上,各引入了一行对NF_HOOK()宏函数的一个相应的调用。因此一个数据包在通过netfilter框架时,它将经过如图1所示的流程。从图中可以看到netfilter框架定义的5个钩子函数,分别为:



xsj074413w-1.jpg

(1) NF_IP_PRE_ROUTING


(2) NF_IP_LOCAL_IN


(3) NF_IP_FORWARD


(4) NF_IP_POST_ROUTING


(5) NF_IP_LOCAL_OUT


数据包从左边进入系统,进行IP校验以后,经过第一个钩子函数NF_IP_PRE_ROUTING(1)进行处理;然后进入路由代码,其决定该数据包是需要转发还是发给本机;若该数据包是发给本机的,则该数据经过钩子函数NF_IP_LOCAL_IN(2)处理以后传递给上层协议;若该数据包应该被转发则它被NF_IP_FORWARD(3)处理;经过转发的数据包经过最后一个钩子函数NF_IP_POST_ROUTING(4)处理以后,再传输到网络上。


本地产生的数据经钩子函数NF_IP_LOCAL_OUT(5)处理后,进行路由选择处理。然后,经过NF_IP_POST_ROUTING(4)处理,再发送到网络上。


1.2 DoS攻击原理


DoS(Denial of Service,拒绝服务攻击)是近年来非常流行的网络攻击方式。它利用合理的服务请求来占用过多的服务资源,致使服务器超载,无法响应其它的请求。DDoS(Distributed Denial of Service,分布式拒绝服务)是拒绝服务DoS攻击的加强形式,攻击者可以控制大量分布于Internet各处的傀儡机对目标发动DoS攻击。由于DDoS攻击通常运用洪水和欺骗攻击,使得攻击的特征难以被掌握,从而很难防范。本文所设计的硬件防火墙就是专门防御DDoS的。DDoS攻击中最常见的就是SYN Flood攻击,下面简要的讲述一下SYN Flood攻击的原理。


在TCP协议中,服务器接收到一个SYN连接请求就为请求的客户端分配缓冲区并建立一个半开连接,存储连接状态,直到三次握手完成或者超时而释放连接。而SYN攻击就是在短时间内伪造源IP地址向目的主机发送大量的SYN包,使服务器端存储大量的半开连接而资源耗尽,从而不能提供服务。


1.3 SYN proxy防御技术


防御SYN Flood攻击的方法有很多,但其中最有效最根本的方法就是SYN proxy(SYN代理)了,下面分步骤简述一下该技术的防御原理。


(1) 防火墙截获外网客户端发向内网服务器所有SYN数据包。


Client———SYN———→Firewall


(2) 代替内网服务器向外网发SYN/ACK数据包。


Client→——SYN/ACK(cookie)———Firewall


该步骤利用SYN cookie技术将SYN包改造成SYN/ACK包发送给客户端,其中SYN/ACK包的SEQ(TCP包序列号)是根据源IP、目的IP、端口等信息用作者设计的算法算出来的,这个SEQ也就是所谓的cookie。由于SYN Flood攻击都是伪造的IP地址,所以向这些IP发送SYN/ACK不会返回ACK包,根据第三步可用看出这些伪造的IP发出的SYN包不能穿过防火墙到达服务器。


(3) 接到外网的合法ACK包,防火墙向内网发送SYN包。


Client———ACK———→Firewall———SYN———→Server


并不是说所有接受的ACK包都是合法的,因为也存在ACK攻击。所以这里我们对防火墙截获的ACK包做一个认证,用步骤二中同样的算法算出cookie,然后同ACK包中的ACKSEQ比较来判断该ACK包,是否合法。如果是合法的ACK包则构造一个SYN包发给服务器。如果不是合法的ACK包,ACK包被丢弃。


(4) 服务器应答SYN/ACK包


Firewall→———SYN/ACK———Server


(5) 防火墙应答ACK包


Firewall———ACK———→Server


防火墙收到服务器的SYN/ACK包,将其改造成ACK包发给服务器。这样一个TCP连接建立成功。


(6) 防火墙转发所有客户端与服务器端数据。


2 防火墙实现


由于我们设计的是硬件防火墙而不是基于主机的防火墙,需要防火墙在客户端和服务器端之间转发数据。因此我们首先要将该防火墙的网络模式设置为桥模式,然后在防火墙中插入两块网卡,这两块网卡就成了桥接设备,一块网卡为包的入口,另一块为出口,数据通过两个网卡被转发。


2.1 模块的设计


Linux2.6内核支持模块的运行,所以我们将防御策略用代码在模块中实现并加载到内核运行,这样可以避免代码调试时需要重新编译内核。


我们在图1中的(1)NF_IP_PRE_ROUTING处的钩子函数中实现我们的防御代码,并将该钩子函数在模块中注册,这样流经防火墙的所有包首先要通过我们防御策略的检验才能通过。


下面是防火墙模块的代码框架:



xsj074413w-2.jpg

2.2 SYN cookie算法


在整个防御策略的第二步也就是防火墙代替服务器向客户端发送带有cookie的SYN/ACK包,我们运用了SYN cookie技术。SYN cookie技术是指当防火墙收到一个SYN报文后,不转发到服务器,而是利用连接的信息生成一个cookie,并将这个cookie作为将要返回的SYN/ACK包的初始序列号。当客户端返回一个ACK报文时,根据报头信息计算cookie,与返回的确认序列号(初始的序列号加1)的前24位进行对比,如果相同,则是一个正常连接,然后构造SYN包发送至服务器。该技术实现的关键之处在于cookie的计算,cookie的计算应该做到包含本次连接的状态信息,而且攻击者不能伪造cookie。cookie的计算算法如下:


(1) 防火墙收到一个SYN包后,计算一个消息摘要mac:mac=MAC(A,k);


MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。


A为客户和服务器双方的IP地址和端口号以及参数t的串联组合:


A=SOURCE_IP|| SOURCE_PORT|| DST_IP|| DST_PORT|| t


k为服务器独有的密钥;


时间参数t为32比特长的时间计数器,每64秒加1;


(2) 生成cookie:


cookie=mac(0:24):表示取mac值的第0到24比特位;


(3) 设置将要返回的SYN+ACK报文的初始序列号,设置过程如下:


i.高24位用cookie代替;


ii.接下来的3比特位用客户要求的最大报文长度MMS代替;


iii.最后5比特位为t mod 32。


客户端收到来自防火墙SYN/ACK包后,返回一个ACK包,这个ACK包将带一个cookie(确认号为服务器发送过来的SYN/ACK包的初始序列号加1,所以不影响高24位),在服务器端重新计算cookie,与确认号的前24位比较,如果相同,则说明未被修改,连接合法。


2.3 性能优化


由于计算cookie有一定的运算量,增加了防火墙CPU的负担,因此,在大规模SYN Flood攻击时如果单纯只用SYN cookie技术将很有可能导致防火墙因为CPU资源耗尽而不能正常工作。基于这点原因我们对以上的算法做了优化。


首先,并不是所有时侯都需要启动SYN cookie来进行对SYN包的筛选。我们通过检测单位时间内进入防火墙的包数来判断是否正在被攻击,在没有攻击的时候我们的防御策略根本不启动,这样可以提高无攻击情况下的网络运行效率。


然后,在攻击发生时,我们利用TCP协议的重传机制对流人防火墙的SYN包进行一次过滤,使得真正需要用SYN cookie 技术来处理的SYN包数大为减少,从而降低了防火墙的负担。


TCP协议的重传机制是指如果TCP连接的发起方在发出SYN包后一段时间内没有得到任何响应,它将接着发送第2次请求,也就是发送第2个SYN包,如果一段时间后仍然没有响应它将发送第3个SYN包。根据实验我们发现第2个SYN包和第1个SYN包的问隔时间为3 s左右,第3个SYN包和第2个SYN包的间隔时间为6 s左右。


如果是SYN Flood攻击,SYN包是由攻击程序伪造IP地址发出的,攻击程序只管将SYN包发出而不会考虑是否得到服务器响应,因此在连接超时时,不会产生第2个SYN包或是第3个SYN包。根据这个原理,当流入防火墙的SYN包数多到一定程度时,我们启用丢包策略。我们将所有流人防火墙的SYN包做一个记录,放在“IP跟踪表”中,下次SYN包到达时我们通过检验源IP是否在“IP跟踪表”中来判断这个IP是否能重传SYN包;我们将能够返回ACK包,并通过SYN cookie算法检验合格的IP地址加人到“合法地址表”,这样下次该IP请求连接时的SYN包可以直接通过,无需通过SYN cookie的检验。丢包防护策略的逻辑图如图2所示:



xsj074413w-3.jpg

3 实 验


网络拓扑结构图如图3所示。



xsj074413w-4.jpg

我们利用傀儡机1-n同时开多个线程向服务器1的80端口(Web服务端口)发起SYN Flood攻击,然后用客户机访问服务器1的Web页面,实验证明,在攻击状态下客户机的Web页面仍能够打开,说明防火墙发挥了作用。


我们运用的防火墙的配置:CPU为P42.8G,内存512 M。图4为攻击状态下防火墙CPU占用率分布图,经过分析我们发现在经典的SYN Flood攻击状态下,即使百兆带宽被占满,防火墙的CPU也没有被耗尽,防火墙仍能够正常工作。这说明我们设计的内核级防火墙在工作效率上有一定的优越性。



xsj074413w-5.jpg

4 结 论


基于Linux2.6内核开发的用于防护DDoS攻击的硬件防火墙,工作在Linux系统内核网络协议栈的底层,随内核工作而工作,从原理上解决了SYN洪水攻击,无论哪种攻击工具进行SYN洪水攻击,主动防御拒绝服务系统都能抵御。真正的做到了内核主动防御的防护效果,达到了预期的目的。


show_label.gif标签:  netfilter  Linux  硬件防火墙

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条