抵御拒绝服务攻击的方法转让专利

申请号 : CN200710177387.8

文献号 : CN101436958B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 王睿申龙哲李有永马洁涂福恩

申请人 : 太极计算机股份有限公司

摘要 :

本发明涉及一种基于netfilter和syn-cookie实现的,防御syn洪流(synflooding)攻击的方法。本发明在网关中设置一个netfilter,利用syn-cookie机制来验证syn包的真实性,通过验证的syn请求被放行,没通过验证的请求被拦截。

权利要求 :

1.一种抵御拒绝服务攻击的方法,其中在客户端与服务器之间的网关中设置一个抵御拒绝服务攻击的装置,该装置执行以下步骤:(1)拦截客户端向服务器发送的包含源IP、源端口、目的IP、目的端口、TCP序列号的syn数据包的syn连接请求;

(2)针对所述syn连接请求,利用一个本地密钥,生成一个与所述syn连接请求关联的代理TCP序列号x;

(3)向客户端返回包含代理TCP序列号x的syn/ack数据包;

(4)接收客户端收到所述syn/ack数据包后回应的包含x+1序列号的ack数据包;

(5)利用所述代理TCP序列号x验证ack数据包中的x+1序列号;

(6)当通过验证时,利用所收到的ack数据包所含有的源IP、源端口、目的IP、目的端口和密钥以及x+1序列号构造与步骤(1)中的syn数据包相同的syn数据包,然后以客户端身份向服务器发送包含所构造的syn数据包的syn连接请求,以便以后服务器经由网关向客户端发送syn/ack数据包和客户端经由网关向服务器发送ack数据包,完成客户端与服务器之间的连接;

(7)当验证未通过时,不向服务器发送连接请求。

2.根据权利要求1所述的方法,其中在所述步骤(6)中,抵御拒绝服务攻击的装置还检查所构造的syn数据包是否符合netfilter规则。

3.根据权利要求2所述的方法,其中当检查确认所构造的syn数据包符合netfilter规则时,将用于该syn连接的连接表项插入连接表中。

4.根据权利要求3所述的方法,其中所述连接表项包含源IP、源端口、目的IP、目的端口、客户端TCP序列号和服务器端TCP序列号。

5.根据权利要求1所述的方法,其中当通过步骤(5)所述的验证时,抵御拒绝服务攻击的装置还将客户端地址即源IP地址添加到白名单地址列表中。

6.根据权利要求5所述的方法,还包括以下步骤:

当抵御拒绝服务攻击的装置拦截客户端发起的syn连接请求时,首先检查syn数据包中的源IP地址是否在白名单地址列表中,如果在白名单地址列表中,则直接利用收到的syn数据包向服务器发起连接请求;

如果不在白名单地址列表中,则执行步骤(2)至(7)。

7.根据权利要求1所述的方法,其中所述抵御拒绝服务攻击的装置是syn-cookie模块。

8.根据权利要求7所述的方法,其中所述代理TCP序列号x是根据syn数据包的源IP、源端口、目的IP、目的端口、TCP序列号和密钥,利用md5散列算法算出的一个cookie。

9.根据权利要求8所述的方法,其中所述syn-cookie模块拦截服务器响应网关发送的syn数据包而返回的syn/ack数据包,将该数据包中的序列号设为cookie+1后,把该syn/ack数据包转发给客户端。

说明书 :

抵御拒绝服务攻击的方法

技术领域

[0001] 本发明涉及一种在网关设备上抵御拒绝服务攻击的方法,特别涉及基于netfilter和syn-cookie实现防御syn flooding攻击的方法。

背景技术

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

发明内容

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

附图说明

[0032] 图1是本发明的配置示意图;
[0033] 图2描述四个钩子函数在netfilter中的位置;
[0034] 图3描述数据包交互过程;
[0035] 图4描述hook_pr函数的处理流程。

具体实施方式

[0036] 图1显示了实现本发明的抵御拒绝服务攻击方法的配置,从图1中可以看到,本发明在网关中设置了一个抵御拒绝服务攻击的装置,并利用该装置抵御拒绝服务攻击。
[0037] 如图3所示,该拒绝服务攻击的装置通过执行以下步骤抵御拒绝服务攻击:
[0038] (1)拦截客户端发送的包含源IP、源端口、目的IP、目的端口、TCP序列号的syn连接请求;
[0039] (2)针对所述syn连接请求,利用一个本地密钥,生成一个与所述syn关联的代理TCP序列号x;
[0040] (3)向客户端返回包含代理TCP序列号的syn/ack数据包;
[0041] (4)接收客户端收到所述syn/ack数据包后回应的包含x+1序列号的ack数据包;;
[0042] (5)利用所述代理TCP序列号x验证ack数据包中的x+1序列号;
[0043] (6)当通过验证时,利用所收到的ack数据包所含有的源IP、源端口、目的IP、目的端口和密钥以及x+1序列号构造syn数据包,然后以客户端身份向服务器发送包含所构造的syn数据包的syn连接请求,由此建立客户端与服务器的连接;
[0044] (7)当验证未通过时,不向服务器发送连接请求。
[0045] 其中,在所述步骤(6)中,抵御拒绝服务攻击的装置还检查所构造的syn数据包是否符合netfilter规则。
[0046] 其中,当检查确认所收到的syn数据包符合netfilter规则时,将用于该syn连接的连接表项插入连接表中,以便实现连接跟踪,并对网络地址转换提供支持。
[0047] 其中,所述连接表项包含源IP、源端口、目的IP、目的端口、客户端TCP序列号和服务器端TCP序列号。
[0048] 当通过了上述步骤(5)所述的验证时,抵御拒绝服务攻击的装置还将客户端地址即源IP地址添加到白名单地址列表中,在此情况下,本发明的方法还包括以下步骤:
[0049] 当抵御拒绝服务攻击的装置拦截客户端发起的syn连接请求时,首先检查syn数据包中的源IP地址是否在白名单地址列表中,
[0050] 如果在白名单地址列表中,则直接利用收到的syn数据包向服务器发起连接请求;
[0051] 如果不在白名单地址列表中,则执行所述步骤(2)至(7)。
[0052] 其中,所述抵御拒绝服务攻击的装置是syn-cookie模块。
[0053] 其中,所述代理TCP序列号x是根据syn数据包的源IP、源端口、目的IP、目的端口、TCP序列号和密钥,利用md5散列算法算出的一个cookie。
[0054] 其中,所述syn-cookie模块拦截服务器响应网关发送的syn数据包而返回的syn/ack数据包,将该数据包中的序列号设为cookie+1后,把该syn/ack数据包转发给客户端,其中该syn/ack数据包中的TCP窗口大小为服务器端真实窗口大小。
[0055] 然后,所述syn-cookie模块向服务器转发客户端响应网关所转发的syn/ack数据包后回应的ack数据包。这样就建立了连接。
[0056] 下面描述在图1所示环境中的数据包交互过程。
[0057] 图3描述了本方法在处理正常连接和攻击包时的交互过程。
[0058] ①客户端发起正常连接时,首先向服务器发送一个syn包。
[0059] ②网关拦截住syn包,根据该包的源IP、源端口、目的IP、目的端口、TCP序列号和一个密钥,使用md5散列算法计算出一个cookie,以cookie作为TCP序列号,构造一个syn/ack包,包中TCP窗口大小设为0,将该包直接发往客户端。
[0060] ③客户端收到syn/ack后会回应一个ack包,该ack包的ack值为cookie+1,利用相同的信息:源IP、源端口、目的IP、目的端口、TCP序列号(ack包的序列号减1即为源syn包的序列号)和密钥来验证cookie的正确性。如果客户端发起的是正常连接,这里一定会通过验证。通过验证之后,网关为该连接建立连接表项,这时,在客户端看来,连接已经建立起来,但是从服务器看来连接还没有开始建立,不过,我们在第①步告诉了客户端服务器的TCP窗口大小为0,所以客户端现在不会向服务器发送带有应用数据的包。下一步网关将以客户端的身份向服务器发起连接。
[0061] ④网关以客户端的身份向服务器发起连接,利用上一步骤收到的ack包构造一个与第①步相同的syn包,将syn包交给内核,内核会检查netfilter规则,如果规则允许该包通过则放行,并将连接表项插入到连接表中,否则将包丢弃,释放连接表项。
[0062] ⑤服务器收到syn包后会回应一个syn/ack包,网关拦截该包,记录下其序列号,然后将包中的序列号设为cookie+1,将包交给内核作后续处理,内核会把包专发给客户端。这个包中TCP窗口大小为服务器端真实的窗口大小,网关未作修改。
[0063] ⑥客户端收到这个syn/ack后会发现这是一个重复的数据包,不过窗口大小已作了修改,这时它会回应一个与第③步相同的ack包,网关收到该包后修改其ack值,然后专发到服务器。现在客户端和服务器之间的连接已经完全建立起来了,可以正常交互应用数据。
[0064] ⑦客户端向服务器发送数据时,网关修改数据包的ack值。
[0065] ⑧服务器向客户端发送数据时,网关修改数据包的序列号。
[0066] ⑨如果是攻击者发起了syn flooding攻击,攻击包到达网关时,会被丢弃,虽然网关会为每一个包回应一个syn/ack,但攻击者因为是伪造的源地址所以无法收到回应包,也就无法伪造带cookie的ack包,攻击包被拦截在网关入口处,不会对netfilter和服务器以及内部网络造成危害。
[0067] 接着描述程序流程。
[0068] (1)、在netfilter中注册钩子函数
[0069] 如图2所示,在PREROUTING链以最高优先级注册函数hook_pr,在OUTPUT链以最高优先级注册函数hook_ou,在POSTROUTING链以最低优先级注册函数hook_po,在INPUT链以最低优先级注册函数hook_in。
[0070] (2)、函数hook_pr
[0071] 图4描述了函数hook_pr的处理流程。首先截获所有的TCP包,根据TCP标志的不同作不同的处理。
[0072] 如果只有syn标志,则可能是一个新连接的开始或者syn flooding攻击洪流里的一个包,这里先检查syn包的源IP地址是否在白名单地址列表中,如果在,说明该地址已经通过了syn-cookie的验证,这里不对该包做任何处理,直接交给内核;如果不在,则利用syn包的源IP、源端口、目的IP、目的端口、TCP序列号和一个密钥,使用md5散列算法计算出一个cookie,用该cookie作为序列号为syn包回应一个syn/ack,然后将syn包丢弃,函数返回。需要说明一下,syn/ack包被直接添加到网卡的发送队列,而不再经过netfilter和内核的其它处理。
[0073] 如果只有ack标志,首先验证其ack-1是否为一个正确的cookie。第一,如果是,说明该包是对syn/ack的回应,是一个正常的访问者在试图建立连接,那么就将该访问者的IP地址添加到白名单地址列表中,然后为该连接构造一个连接表项,连接表项中记录该连接的相关信息,当该连接的后续包到来时,可以通过该连接表项识别出来,并对包做相应的处理。之后,本模块构造一个源为访问者,目的为服务器的syn包——根据ack包的信息可以构造出这样一个syn包,syn包的序列号为ack包的序列号减1,这样可以使服务器知道客户端的序列号,当服务器再向客户端发包时就会设置正确的ack值,而不用本模块对其再进行修改。最后,将syn包交内核处理,而将ack包丢弃,函数返回。需要说明的是,上面提到的连接表项在这个函数里仅仅是构建它,而并不将它立即插入到连接表中,因为这个连接可能被netfilter的规则所拒绝,连接被拒绝了连接表项也就没有用处,这里将连接表项“依附”到刚刚构造的那个syn包上,如果syn包被netfilter丢弃,在内核释放syn包占用的空间时,也将连接表项释放,如果syn包能够顺利的通过netfilter的规则,则在它离开netfilter的最后时刻将连接表项插入到连接表中,在后面的函数中还会提到这个问题。第二,如果验证cookie失败,则按下一个段落的流程进行处理。
[0074] 对于所有其它的TCP包,按下面的流程进行处理。首先查看连接表,如果该包不是已知连接的一部分,则直接交内核处理,函数返回;如果是已知连接的一部分,对于客户端发往服务器的包,修改ack值,对于服务器发往客户端的包,修改序列号,然后根据TCP标志修改连接表项中的连接状态,如果连接已断开,则根据rfc的规定等待一段时间后删除连接表项,最后将修改过的数据包交给内核继续处理,函数返回。
[0075] (3)、函数hook_ou
[0076] 本机发出的数据包首先会经过这里,这里可以使用和函数hook_pr相同的处理流程,对本机发出的syn包进行验证,但我们认为本机发出的都是真实的连接请求,而不是伪造的攻击包,所以这里对于带有syn标志的包就直接交给内核作后续处理,其它TCP包的处理方式和函数hook_pr相同。
[0077] (4)、函数hook_po和hook_in
[0078] 这两个函数的流程完全相同,是数据包离开netfilter前的最后一个环节。同样,首先截获所有TCP包,检查数据包上是否“依附”有一个连接表项,如果没有则把数据包交给内核处理,函数返回;如果有,则根据数据包的内容再次更新连接表项的内容,因为数据包在通过netfilter的过程中数据包内容可能会被它修改,比如做NAT等,更新连接表项后将该表项插入到连接表中,脱离连接表项和数据包的依附关系,将数据包交内核处理,函数返回。
[0079] (5)、连接表的维护
[0080] 连接表中的每一项都记录着它所对应的TCP连接的状态,TCP每一个状态都有一个超时时间,超时之后会通过定时器将连接表项从连接表中删除。连接表的总大小有一个限制,连接表满后如果还有新的连接需要加入,则删除连接表中最“老”的连接表项,而将新的连接加入。连接表利用源地址、目的地址、源端口、目的端口的8位hash值作索引进行查找。由于使用了“白名单地址列表”,连接表不会增长到很大,很容易维护。
[0081] (6)、白名单地址列表的维护
[0082] 通过了syn-cookie验证的客户端地址会被添加到白名单地址列表中,该客户端的后续连接建立时不再进行syn-cookie验证,这样可以提高连接建立的速度和系统效率。列表中的地址都有一个超时时间,超时后被删除,限制列表的总大小,列表满时如果还有新的地址需要加入,则删除列表中最“老”的地址,再将新的地址加入。
[0083] 尽管上文对本发明进行了详细说明,但是本技术领域技术人员将会明白可以根据本发明的原理对上文的细节进行修改,因此本发明的保护范围应当由所附权利要求确定。