抵御拒绝服务攻击的方法

文档序号:7665180阅读:180来源:国知局
专利名称:抵御拒绝服务攻击的方法
技术领域
本发明涉及一种在网关设备上抵御拒绝服务攻击的方法,特别涉及基于 netfilter和syn-cookie实现防御syn flooding攻击的方法。
背景技术
拒绝服务攻击(Denial of Service, DoS)是目前比较有效而又非常难于防御 的一种网络攻击方式,它的目的就是使服务器不能够为正常访问的用户提供服 务。所以,DoS对一些紧密依靠互联网开展业务的企业和组织带来了致命的威胁。
Syn flooding是最为有效和流行的一种DoS攻击形式。它利用TCP三次握手 协议的缺陷,向目标主机发送大量的伪造源地址的SYN连接请求,消耗目标主 机的资源,从而不能够为正常用户提供服务。
Syn flooding由于其发起攻击简单、难以防范,且攻击效果明显,是目前危 害最大的DOS/DDOS攻击之一。Syn flooding攻击发起时,攻击者会以每秒数万 至数十万个的速度向被攻击服务器发送伪造的TCP syn包,这些攻击包到达服务 器后会迅速占满其半开连接队列,导致后续正常连接无法建立起来。新版本的 linux在半开连接队列的维护上作了一些改进,新到的连接请求会挤掉队列里最 "老"的一个连接请求,而占据队列里的一个位置,这样当攻击结束之后,立即 可以接收新的连接,而不必等待半开连接超时。但是这种方法并不能抵御syn flooding攻击,因为攻击进行时,伪造的syn包流量非常大,正常连接请求的syn 包即使能够抢占半开连接队列中的一个位置,也会在其完成TCP三次握手前被 伪造的syn包挤出队列,正常连接同样无法建立起来。
如果被攻击的服务器部署在一个网关设备所保护的网络之内,并且该网关设 备启用了状态检测包过滤或NAT功能——事实上这种情况非常常见,那么该网 关设备也会受到攻击的影响。状态检测和NAT都需要维护一个连接表,syn flooding攻击时,系统要为每一个syn包建立一个表项,很显然,即使该网关设 备有很高的性能,能支持百万连接,其连接表也会在数秒内被耗尽。 一旦连接表被耗尽,后续连接将无法建立,这样一来不单是被攻击的服务器无法访问,所有 需要通过该网关设备的访问和服务都将无法进行。所以,防火墙这类网关设备对 防御syn flooding攻击的需求,显得比服务器更为重要。
目前,linux内核里已实现了 syn-cookie,其基本思想是,任何一个syn包到 来时,先不为其分配任何资源,而是立即回应一个syn/ack包,该包中的TCP序 列号利用原syn包的特征字段和一个密钥使用一定的加密算法或散列算法算得, 这个序列号就是一个cookie。如果前面提到的这个syn包是一个正常访问的开始, 那么客户端收到syn/ack后会回应一个ack包,并以cookie+l作为该ack包的ack 值,服务器收到ack包后会验证cookie的正确性,如果正确,则接受该连接,否 则丢弃。而如果syn包是攻击者伪造的,那么它将收不到回应的syn/ack,即使 它再次伪造一个ack包,到达服务器后也无法通过cookie的验证,只会被静静的 丢弃。通过这种验证机制,syn-cookie可以从大量的syn包中挑出正常的连接并 为其服务,而阻拦住伪造的连接。但是,linux内核里的syn-cookie其设计上只 是保护了 li皿x系统本身,对于通过它转发的syn flooding攻击,或者说当它作为 一个网关时对于内部网服务器所遭受的synflooding攻击,它却无能为力。
Netfilter是linux下的一个包过滤工具,为大多数linux平台防火墙设备所采 用,netfilter支持状态检测和NAT,使用这两种功能时需要维护一个连接表,任 何一个TCP包(不仅仅是TCP包)只要不是巳知连接的一部分,都要在连接表 中为其创建一个表项。Netfilter的这一特点使得它在syn flooding攻击进行时会 成为重要的受害者。
随着网络技术的发展,带有状态检测和NAT功能的网关设备被广泛使用, 而一旦攻击爆发,不单单是被攻击者失效,网关也会因为不堪重负而失效, 一旦 网关失效,整个内部网与外部的连接将被中断。本发明正是在这样一种情况下产 生的,旨在网关设备上实现syn flooding攻击防御,保护网关本身和内部网络。

发明内容
本发明的目的是提供一种基于netfilter和syn-cookie抵御拒绝服务攻击如syn flooding攻击的方法。
5实现本发明目的的主要方法是,在客户端与服务器之间的网关中设置一个抵 御拒绝服务攻击的装置,该装置利用syn-cookie机制验证syn连接请求的真实性, 如果通过验证,则放行syn连接请求并维护该连接,否则,阻断连接。
在一个具体实施例中,本发明通过在客户端与服务器之间的网关中设置一个
抵御拒绝服务攻击的装置实现抵御拒绝服务攻击的方法,该装置执行以下步骤
(1) 拦截客户端发送的包含源IP、源端口、目的IP、目的端口、 TCP序列 号的syn连接请求;
(2) 针对所述syn连接请求,利用一个本地密钥,生成一个与所述syn关 联的代理TCP序列号x;
(3) 向客户端返回包含代理TCP序列号的syn/ack数据包;
(4) 接收客户端收到所述syn/ack数据包后回应的包含x+l序列号的ack数
据包;
(5) 利用所述代理TCP序列号x验证ack数据包中的x+l序列号;
(6) 当通过验证时,利用所收到的ack数据包所含有的源IP、源端口、目的 IP、目的端口和密钥以及x+l序列号构造syn数据包,然后以客户端身份向服务 器发送包含所构造的syn数据包的syn连接请求,由此建立客户端与服务器的连 接;
(7) 当验证未通过时,不向服务器发送连接请求。
其中,在所述步骤(6)中,抵御拒绝服务攻击的装置还检査所构造的syn 数据包是否符合netfilter规则。
其中,当检査确认所收到的syn数据包符合netfilter规则时,将用于该syn 连接的连接表项插入连接表中,以便实现连接跟踪,并对网络地址转换提供支持。
其中,所述连接表项包含源IP、源端口、目的IP、目的端口、客户端TCP 序列号和服务器端TCP序列号。
当通过了上述步骤(5)所述的验证时,抵御拒绝服务攻击的装置还将客户 端地址即源IP地址添加到白名单地址列表中,在此情况下,本发明的方法还包 括以下步骤;
当抵御拒绝服务攻击的装置拦截客户端发起的syn连接请求时,首先检查 syn数据包中的源IP地址是否在白名单地址列表中,如果在白名单地址列表中,则直接利用收到的syn数据包向服务器发起连接 请求;
如果不在白名单地址列表中,则执行所述步骤(2)至(7)。
其中,所述抵御拒绝服务攻击的装置是syn-cookie模块。
其中,所述代理TCP序列号x是根据syn数据包的源IP、源端口、目的IP、 目的端口 、 TCP序列号和密钥,利用md5散列算法算出的一个cookie。
其中,所述syn-cookie模块拦截服务器响应网关发送的syn数据包而返回的 syn/ack数据包,将该数据包中的序列号设为cookie+l后,把该syn/ack数据包转 发给客户端,其中该syn/ack数据包中的TCP窗口大小为服务器端真实窗口大小。
然后,所述syn-cookie模块向服务器转发客户端响应网关所转发的syn/ack 数据包后回应的ack数据包。
由此可见,本发明的方法维护两个链表,一个白名单地址列表和一个连接表。 如果一个连接通过了 syn-cookie的验证,其客户端的IP地址就被加到白名单地 址列表中,该地址的后续连接则不需通过验证而被直接放行,对于某些应用,比 如web访问,第一个连接之后会有大量的后续连接,采用这种白名单地址列表 后,可以大大提高访问速度和系统效率。使用syn-cookie机制时,客户端和服务 器没有直接进行TCP的三次握手,而是通过syn-cookie模块这个中间者间接建 立起了连接,所以原则上客户端和服务器都不知道对方的TCP序列号,而只知 道syn-cookie模块使用的中间序列号(cookie值),在这里,我们可以推算出客 户端使用的序列号并告知服务器,但服务器端使用的序列号客户端还是不知道, 这时就需要一个连接表,表中的每一项纪录一个连接双方的地址、端口和序列号 等一些信息,当这个连接后续的数据包通过网关时,则依照连接表中的信息修改 其TCP序列号和ack值。
如果数据包在经过netfilter时进行了网络地址转换,则其IP地址或端口信息 会被改变,本方法在netfilter的POSTROUTING和INPUT两个链中以最低优先 级各注册了一个钩子函数,在数据包离开netfilter之前再次査看其源IP、目的IP、 源端口、目的端口,并更新连接表中对应的信息,只有这样,当这个数据包的回 应包到来时,系统才可以通过连接表正确的识别出来。


图l是本发明的配置示意图2描述四个钩子函数在netfilter中的位置;
图3描述数据包交互过程;
图4描述hook_pr函数的处理流程。
具体实施例方式
图1显示了实现本发明的抵御拒绝服务攻击方法的配置,从图1中可以看 到,本发明在网关中设置了一个抵御拒绝服务攻击的装置,并利用该装置抵御拒 绝服务攻击。
如图3所示,该拒绝服务攻击的装置通过执行以下步骤抵御拒绝服务攻击
(1) 拦截客户端发送的包含源IP、源端口、目的IP、目的端口、 TCP序列 号的syn连接请求;
(2) 针对所述syn连接请求,利用一个本地密钥,生成一个与所述syn关 联的代理TCP序列号x;
(3) 向客户端返回包含代理TCP序列号的syn/ack数据包;
(4) 接收客户端收到所述syn/ack数据包后回应的包含x+l序列号的ack数 据包;;
(5) 利用所述代理TCP序列号x验证ack数据包中的x+l序列号;
(6) 当通过验证时,利用所收到的ack数据包所含有的源IP、源端口、目的 IP、目的端口和密钥以及x+l序列号构造syn数据包,然后以客户端身份向服务 器发送包含所构造的syn数据包的syn连接请求,由此建立客户端与服务器的连 接;
(7) 当验证未通过时,不向服务器发送连接请求。
其中,在所述步骤(6)中,抵御拒绝服务攻击的装置还检査所构造的syn 数据包是否符合netfilter规则。
其中,当检査确认所收到的syn数据包符合netfilter规则时,将用于该syn 连接的连接表项插入连接表中,以便实现连接跟踪,并对网络地址转换提供支持。
其中,所述连接表项包含源IP、源端口、目的IP、目的端口、客户端TCP
8序列号和服务器端TCP序列号。
当通过了上述步骤(5)所述的验证时,抵御拒绝服务攻击的装置还将客户 端地址即源IP地址添加到白名单地址列表中,在此情况下,本发明的方法还包 括以下步骤
当抵御拒绝服务攻击的装置拦截客户端发起的syn连接请求时,首先检查 syn数据包中的源IP地址是否在白名单地址列表中,
如果在白名单地址列表中,则直接利用收到的syn数据包向服务器发起连接 请求;
如果不在白名单地址列表中,则执行所述步骤(2)至(7)。
其中,所述抵御拒绝服务攻击的装置是syn-cookie模块。
其中,所述代理TCP序列号x是根据syn数据包的源IP、源端口、目的IP、
目的端口、 TCP序列号和密钥,利用md5散列算法算出的一个cookie。
其中,所述syn-cookie模块拦截服务器响应网关发送的syn数据包而返回的
syn/ack数据包,将该数据包中的序列号设为cookie+l后,把该syn/ack数据包转
发给客户端,其中该syn/ack数据包中的TCP窗口大小为服务器端真实窗口大小。 然后,所述syn-cookie模块向服务器转发客户端响应网关所转发的syn/ack
数据包后回应的ack数据包。这样就建立了连接。 下面描述在图1所示环境中的数据包交互过程。 图3描述了本方法在处理正常连接和攻击包时的交互过程。
① 客户端发起正常连接时,首先向服务器发送一个syn包。
② 网关拦截住syn包,根据该包的源IP、源端口、目的IP、目的端口、 TCP 序列号和一个密钥,使用md5散列算法计算出一个cookie,以cookie作为TCP 序列号,构造一个syn/ack包,包中TCP窗口大小设为0,将该包直接发往客户 端。
③ 客户端收到Syn/ack后会回应一个ack包,该ack包的ack值为cookie+l , 利用相同的信息源IP、源端口、目的IP、目的端口、 TCP序列号(ack包的序 列号减1即为源syn包的序列号)和密钥来验证cookie的正确性。如果客户端发 起的是正常连接,这里一定会通过验证。通过验证之后,网关为该连接建立连接 表项,这时,在客户端看来,连接已经建立起来,但是从服务器看来连接还没有开始建立,不过,我们在第①步告诉了客户端服务器的TCP窗口大小为0,所以 客户端现在不会向服务器发送带有应用数据的包。下一步网关将以客户端的身份 向服务器发起连接。
④ 网关以客户端的身份向服务器发起连接,利用上一步骤收到的ack包构造 一个与第①步相同的syn包,将syn包交给内核,内核会检査netfilter规则,如 果规则允许该包通过则放行,并将连接表项插入到连接表中,否则将包丢弃,释 放连接表项。
⑤ 服务器收到syn包后会回应一个syn/ack包,网关拦截该包,记录下其序 列号,然后将包中的序列号设为cookie+l,将包交给内核作后续处理,内核会把 包专发给客户端。这个包中TCP窗口大小为服务器端真实的窗口大小,网关未 作修改。
⑥ 客户端收到这个syn/ack后会发现这是一个重复的数据包,不过窗口大小 已作了修改,这时它会回应一个与第(D步相同的ack包,网关收到该包后修改其 ack值,然后专发到服务器。现在客户端和服务器之间的连接已经完全建立起来 了,可以正常交互应用数据。
⑦ 客户端向服务器发送数据时,网关修改数据包的ack值。
⑧ 服务器向客户端发送数据时,网关修改数据包的序列号。
⑨ 如果是攻击者发起了 syn flooding攻击,攻击包到达网关时,会被丢弃, 虽然网关会为每一个包回应一个syn/ack,但攻击者因为是伪造的源地址所以无 法收到回应包,也就无法伪造带cookie的ack包,攻击包被拦截在网关入口处, 不会对netfilter和服务器以及内部网络造成危害。
接着描述程序流程。
(1) 、在netfilter中注册钩子函数
如图2所示,在PREROUTING链以最高优先级注册函数hook_pr,在 OUTPUT链以最高优先级注册函数hook—ou,在POSTROUTING链以最低优先 级注册函数hook_po,在INPUT链以最低优先级注册函数hook一in。
(2) 、函数hookjr
图4描述了函数hookjr的处理流程。首先截获所有的TCP包,根据TCP 标志的不同作不同的处理。如果只有syn标志,则可能是一个新连接的开始或者syn flooding攻击洪流 里的一个包,这里先检査syn包的源IP地址是否在白名单地址列表中,如果在, 说明该地址已经通过了 syn-cookie的验证,这里不对该包做任何处理,直接交给 内核;如果不在,则利用syn包的源IP、源端口、目的IP、目的端口、 TCP序 列号和一个密钥,使用md5散列算法计算出一个cookie,用该cookie作为序列 号为syn包回应一个syn/ack,然后将syn包丢弃,函数返回。需要说明一下,syn/ack 包被直接添加到网卡的发送队列,而不再经过netfilter和内核的其它处理。
如果只有ack标志,首先验证其ack-l是否为一个正确的cookie。第一,如 果是,说明该包是对syn/ack的回应,是一个正常的访问者在试图建立连接,那 么就将该访问者的IP地址添加到白名单地址列表中,然后为该连接构造一个连 接表项,连接表项中记录该连接的相关信息,当该连接的后续包到来时,可以通 过该连接表项识别出来,并对包做相应的处理。之后,本模块构造一个源为访问 者,目的为服务器的syn包——根据ack包的信息可以构造出这样一个syn包, syn包的序列号为ack包的序列号减1,这样可以使服务器知道客户端的序列号, 当服务器再向客户端发包时就会设置正确的ack值,而不用本模块对其再进行修 改。最后,将syn包交内核处理,而将ack包丢弃,函数返回。需要说明的是, 上面提到的连接表项在这个函数里仅仅是构建它,而并不将它立即插入到连接表 中,因为这个连接可能被netfilter的规则所拒绝,连接被拒绝了连接表项也就没 有用处,这里将连接表项"依附"到刚刚构造的那个syn包上,如果syn包被netfilter 丢弃,在内核释放syn包占用的空间时,也将连接表项释放,如果syn包能够顺 利的通过netfilter的规则,则在它离开netfilter的最后时刻将连接表项插入到连 接表中,在后面的函数中还会提到这个问题。第二,如果验证cookie失败,则 按下一个段落的流程进行处理。
对于所有其它的TCP包,按下面的流程进行处理。首先査看连接表,如果
该包不是已知连接的一部分,则直接交内核处理,函数返回;如果是已知连接的 一部分,对于客户端发往服务器的包,修改ack值,对于服务器发往客户端的包, 修改序列号,然后根据TCP标志修改连接表项中的连接状态,如果连接已断开, 则根据rfc的规定等待一段时间后删除连接表项,最后将修改过的数据包交给内 核继续处理,函数返回。
11(3) 、函数hook—ou
本机发出的数据包首先会经过这里,这里可以使用和函数hook一pr相同的处 理流程,对本机发出的syn包进行验证,但我们认为本机发出的都是真实的连接 请求,而不是伪造的攻击包,所以这里对于带有syn标志的包就直接交给内核作 后续处理,其它TCP包的处理方式和函数hookjr相同。
(4) 、函数hook_po禾口 hook一in
这两个函数的流程完全相同,是数据包离开netfilter前的最后一个环节。同 样,首先截获所有TCP包,检査数据包上是否"依附"有一个连接表项,如果 没有则把数据包交给内核处理,函数返回;如果有,则根据数据包的内容再次更 新连接表项的内容,因为数据包在通过netfilter的过程中数据包内容可能会被它 修改,比如做NAT等,更新连接表项后将该表项插入到连接表中,脱离连接表 项和数据包的依附关系,将数据包交内核处理,函数返回。
(5) 、连接表的维护
连接表中的每一项都记录着它所对应的TCP连接的状态,TCP每一个状态 都有一个超时时间,超时之后会通过定时器将连接表项从连接表中删除。连接表 的总大小有一个限制,连接表满后如果还有新的连接需要加入,则删除连接表中 最"老"的连接表项,而将新的连接加入。连接表利用源地址、目的地址、源端 口、目的端口的8位hash值作索引进行査找。由于使用了 "白名单地址列表", 连接表不会增长到很大,很容易维护。
(6) 、白名单地址列表的维护
通过了 syn-cookie验证的客户端地址会被添加到白名单地址列表中,该客户 端的后续连接建立时不再进行syn-cookie验证,这样可以提高连接建立的速度和 系统效率。列表中的地址都有一个超时时间,超时后被删除,限制列表的总大小, 列表满时如果还有新的地址需要加入,则删除列表中最"老"的地址,再将新的 地址加入。
尽管上文对本发明进行了详细说明,但是本技术领域技术人员将会明白可以 根据本发明的原理对上文的细节进行修改,因此本发明的保护范围应当由所附权 利要求确定。
权利要求
1、一种抵御拒绝服务攻击的方法,其中在客户端与服务器之间的网关中设置一个抵御拒绝服务攻击的装置,该装置执行以下步骤利用syn-cookie机制验证syn连接请求的真实性;如果通过验证,则放行syn连接请求并维护该连接,否则,阻断连接。
2、 一种抵御拒绝服务攻击的方法,其中在客户端与服务器之间的网关中设 置一个抵御拒绝服务攻击的装置,该装置执行以下步骤(1) 拦截客户端发送的包含源IP、源端口、目的IP、目的端口、 TCP序列 号的syn连接请求;(2) 针对所述syn连接请求,利用一个本地密钥,生成一个与所述syn关 联的代理TCP序列号x;(3) 向客户端返回包含代理TCP序列号的syn/ack数据包;(4) 接收客户端收到所述syn/ack数据包后回应的包含x+l序列号的ack数据包;(5) 利用所述代理TCP序列号x验证ack数据包中的x+l序列号;(6) 当通过验证时,利用所收到的ack数据包所含有的源IP、源端口 、目的 IP、目的端口和密钥以及x+l序列号构造syn数据包,然后以客户端身份向服务 器发送包含所构造的syn数据包的syn连接请求,由此建立客户端与服务器的连 接;(7) 当验证未通过时,不向服务器发送连接请求。
3、 根据权利要求2所述的方法,其中在所述步骤(6)中,抵御拒绝服务攻 击的装置还检査所构造的syn数据包是否符合ne伍lter规则。
4、 根据权利要求3所述的方法,其中当检查确认所收到的syn数据包符合 netfilter规则时,将用于该syn连接的连接表项插入连接表中。
5、 根据权利要求4所述的方法,其中所述连接表项包含源IP、源端口、目 的IP、目的端口、客户端TCP序列号和服务器端TCP序列号。
6、 根据权利要求2所述的方法,其中当通过步骤(5)所述的验证时,抵御 拒绝服务攻击的装置还将客户端地址即源IP地址添加到白名单地址列表中。
7、 根据权利要求6所述的方法,还包括以下步骤当抵御拒绝服务攻击的装置拦截客户端发起的syn连接请求时,首先检查 syn数据包中的源IP地址是否在白名单地址列表中,如果在白名单地址列表中,则直接利用收到的syn数据包向服务器发起连接 请求;如果不在白名单地址列表中,则执行步骤(2)至(7)。
8、 根据权利要求2所述的方法,其中所述抵御拒绝服务攻击的装置是 syn陽cookie模块。
9、 根据权利要求8所述的方法,其中所述代理TCP序列号x是根据syn数 据包的源IP、源端口、目的IP、目的端口、 TCP序列号和密钥,利用md5散列 算法算出的一个cookie。
10、 根据权利要求9所述的方法,其中所述syn-cookie模块拦截服务器响应 网关发送的syn数据包而返回的syn/ack数据包,将该数据包中的序列号设为 cookie+l后,把该syn/ack数据包转发给客户端。
全文摘要
本发明涉及一种基于netfilter和syn-cookie实现的,防御syn洪流(synflooding)攻击的方法。本发明在网关中设置一个netfilter,利用syn-cookie机制来验证syn包的真实性,通过验证的syn请求被放行,没有通过验证的请求被拦截。
文档编号H04L12/24GK101436958SQ20071017738
公开日2009年5月20日 申请日期2007年11月16日 优先权日2007年11月16日
发明者李有永, 涂福恩, 睿 王, 申龙哲, 洁 马 申请人:太极计算机股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1