防范计算机网络攻击的方法
技术领域
本发明涉及计算机通信技术,特别涉及针对DoS(Denial ofService,拒绝服务攻击)与DDoS(Distributed Denial of Service,分布式拒绝服务攻击)的安全技术。
背景技术
建立TCP连接的标准过程是这样的:首先,请求端(客户端)发送一个包含SYN标志的请求建立连接的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端请求使用的服务器端口以及建立TCP连接的初始序号;第二步,服务器(或受信主机)在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时确认序号为客户端初始序列号加1,ACK即确认(Acknowledgement)。第三步,客户端也返回一个确认报文ACK给服务器端,同样确认序列号为服务器初始序列号加1,到此一个TCP连接完成。以上的连接过程在TCP协议中被称为三次握手(Three-wayHandshake)。
TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接(half-open连接),这段时间的长度我们称为SYN Timeout(Timeout,超时),一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,伪造不同的IP地址向服务器发出大量SYN报文,并诱使服务器向伪造的IP地址发送SYN+ACK报文,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况,即通常所言的SYN Flood攻击。
现有的解决方法,一种是缩短SYN Timeout时间,由于SYN Flood攻击的效果取决于服务器上保持的SYN半连接数,这个值等于SYN攻击的频度与SYN Timeout之乘积,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃该连接的时间,例如设置为20秒以下(过低的SYN Timeout设置可能会影响客户的正常访问),可以成倍的降低服务器的负荷。
第二种方法是设置SYN Cookie,就是给每一个请求连接的IP地址分配一个Cookie,如果短时间内连续收到某个IP的重复SYN报文,就认定是受到了攻击,以后从这个IP地址来的包会被一概丢弃。
上述的两种方法只能对付比较原始的SYN-Flood攻击,缩短SYNTimeout时间仅在对方攻击频度不高的情况下生效,SYN Cookie更依赖于对方使用真实的IP地址,如果攻击者以数万/秒的速度发送SYN报文,同时利用SOCK RAW随机改写IP报文中的源地址,则无法防范。
发明内容
本发明要解决的技术问题是,提供一种防范计算机网络攻击的方法,能够阻止攻击对HALF-OPEN连接队列的过度消耗,使攻击不能成功,对服务器提供保护。
本发明解决其技术问题所采用的技术方案是,提供一种防范计算机网络攻击的方法,包括以下步骤:
(1)拦截外来的数据包,并记录所述数据包中所含的源主机A身份信息;
(2)转发所述数据包至受信主机B,并设置第一定时器;
(3)如果在第一定时器超时以前接收到来自受信主机B的响应报文a1,则记录其中的受信主机B的身份信息,并进入步骤4;如果在第一定时器超时尚未接收到来自受信主机B的响应报文a1,则释放步骤1中记录的身份信息;
(4)以步骤1记录的源主机A的身份向受信主机B发送响应报文a2;并根据步骤1记录的源主机A的身份信息,转发受信主机B向源主机A发送的响应报文a1,并设置第二定时器;
(5)如果步骤4设置的第二定时器超时以前收到源主机A的响应报文a3,即撤销第二定时器,视为连接建立成功;
如果在步骤4设置的第二定时器超时,即根据所记录的源主机A身份信息,以源主机A的身份向受信主机B发出RESET信息,撤销该连接。所述“定时器超时”是指在定时器设定的时间内未收到回应报文。
所述步骤(1)中,所述外来的数据包为TCP建连请求(SYN)报文,所述身份信息为初始序列号、源IP地址和源端口;创建TCB结构记录所述初始序列号、源IP地址和源端口,同时记录目的IP地址、目的端口以及该连接的初始状态。所述步骤(2)中,第一定时器为SYN+ACK定时器;所述步骤(3)中,所述响应报文为SYN+ACK报文,所述受信主机B的身份信息为受信主机B的初始序列号、源IP地址和源端口。所述步骤(4)中,所述确认信息a2为ACK报文,所述确认信息a1为SYN+ACK报文。所述步骤(5)中,所述响应报文a3为ACK报文,若于第二定时器超时以前收到源主机A的响应报文a3,视为连接建立成功,撤销第二定时器,并丢弃此报文,释放该连接的TCB结构;若超时,即根据所记录的源主机A身份信息,以源主机A的身份向受信主机B发出RESET信息,撤销该连接,释放该连接的TCB结构。
本发明的有益效果是,由于主机迅速由syn_recved状态进入established状态,避免了half_open队列的过度消耗,从而降低了服务器负荷,解决了SYN-FLOOD攻击对服务器的影响。
以下结合附图与具体实施方式对本发明作进一步说明。
附图说明
图1是TCP三次握手示意图。
图2是本发明示意图。
具体实施方式
作为具体的实施方式,外网与内网之间,或者说,在源主机A与受信主机B之间以防火墙隔离,如图2所示。防火墙对收到的SYN报文按以下程序处理:
1、源主机A向受信主机B发出建连请求(SYN)报文,报文中包含主机A的初始序列号seq(a)。
2、防火墙创建TCB结构(传输控制块,Transmission ControlBlock),记录源主机A的初始序列号,同时记录源IP地址、源端口、目的IP地址和目的端口,然后转发此SYN报文,同时启动SYN+ACK第一定时器,等待主机B的SYN+ACK报文的到来。如果第一定时器超时,防火墙释放该连接的TCB结构。
3、如果在SYN+ACK定时器超时以前,主机B的响应报文a1到来,则防火墙撤销SYN+ACK第一定时器,记录主机B的初始序列号seq(b),防火墙转发此响应报文a1,然后防火墙立即以主机A的身份向主机B发送ACK报文a2,使主机B的该连接从syn_recved状态进入established状态,同时启动ACK定时器。
4、如果在ACK定时器超时前,主机A的响应(ACK)报文a3到来,则防火墙认为建立连接成功,丢弃此报文,撤销ACK定时器,释放该连接的TCB结构。
5、如果ACK定时器超时,防火墙以主机A的身份向主机B发送RESET报文,撤销该连接,同时释放该连接的TCB结构。
本具体实施方式不应理解为对本发明权利要求的限制,基于本发明构思的其他实施例,例如,虽然未以“防火墙”命名,但同样基于本发明构思实现的路由器功能模块,依然属于本发明权利要求范围之内。