总结SYN洪泛攻击原理。思考预防SYN洪泛攻击措施及故障排除方法。SYN洪泛攻击概述:尽管这种攻击已经出现了十四年,但它的变种至今仍能看到。虽然能有效对抗SYN洪泛的技术已经存在,但是没有对于TCP实现的一个标准的补救方法出现。你可以在如今的操作系统和设备中找到保护应用层和网络层的不同解决方案的不同实现。它利用TCP三次握手协议的缺陷,向目标主机发送大量的伪造源地址的SYN连接请求,使得被攻击方资源耗尽,从而不能够为正常用户提供服务。SYN洪泛攻击原理:在TCP协议中被称为三次握手(Three-wayHandshake)的连接过程中,如果一个用户向服务器发送了SYN报文,服务器又发出SYN+ACK应答报文后未收到客户端的ACK报文的,这种情况下服务器端会再次发送SYN+ACK给客户端,并等待一段时间后丢弃这个未完成的连接,这段时间的长度称为SYNTimeout,一般来说这个时间是分钟的数量级。SYNflood所做的就是利用了这个SYNTimeout时间和TCP/IP协议族中的另一个漏洞:报文传输过程中对报文的源IP地址完全信任。SYNflood通过发送大量的伪造TCP链接报文而造成大量的TCP半连接,服务器端将为了维护这样一个庞大的半连接列表而消耗非常多的资源。这样服务器端将忙于处理攻击者伪造的TCP连接请求而无法处理正常连接请求,甚至会导致堆栈的溢出崩溃。造成SYN洪泛攻击最主要的原因是TCP/IP协议的脆弱性。TCP/IP是一个开放的协议平台,它将越来越多的网络连接在一起,它基于的对象是可信用户群,所以缺少一些必要的安全机制,带来很大的安全威胁。例如常见的IP欺骗、TCP连接的建立、ICMP数据包的发送都存在巨大的安全隐患,给SYN洪泛攻击带来可乘之机。SYN洪泛攻击类别直接攻击:如果攻击者用他们自己的没有经过伪装的IP地址快速地发送SYN数据包,这就是所谓的直接攻击。这种攻击非常容易实现,因为它并不涉及攻击者操作系统用户层以下的欺骗或修改数据包。例如,他可以简单地发送很多的TCP连接请求来实现这种攻击。然而,这种攻击要想奏效攻击者还必须阻止他的系统响应SYN-ACK包,因为任何ACK、RST或ICMP(InternetControlMessageProtocol)包都将让服务器跳过SYN-RECEIVED状态(进入下一个状态)而移除TCB(因为连接已经建立成功或被回收了)。攻击者可以通过设置防火墙规则来实现,让防火墙阻止一切要到达服务器的数据包(SYN除外),或者让防火墙阻止一切进来的包来使SYN-ACK包在到达本地TCP处理程序之前就被丢弃了。一旦被检测到,这种攻击非常容易抵御,用一个简单的防火墙规则阻止带有攻击者IP地址的数据包就可以了。这种方法在如今的防火墙软件中通常都是自动执行的。欺骗式攻击:SYN洪泛攻击的另一种方式是IP地址欺骗。它比直接攻击方式更复杂一点,攻击者还必须能够用有效的IP和TCP报文头去替换和重新生成原始IP报文。如今,有很多代码库能够帮助攻击者替换和重新生成原始IP报文。对于欺骗式攻击,首先需要考虑的就是选择地址。要使攻击成功,位于伪装IP地址上的主机必须不能响应任何发送给它们的SYN-ACK包。攻击者可以用的一个非常简单的方法,就是仅需伪装一个源IP地址,而这个IP地址将不能响应SYN-ACK包,或许因为这个IP地址上根本就没有主机,或许因为对主机的地址或网络属性进行了某些配置。另一种选择是伪装许多源地址,攻击者会假想其中的一些伪装地址上的主机将不会响应SYN-ACK包。要实现这种方法就需要循环使用服务器希望连接的源IP地址列表上的地址,或者对一个子网内主机做相同的修改。如果一个源地址被重复地伪装,这个地址将很快被检测出来并被过滤掉。在大多数情况下运用许多不同源地址伪装将使防御变得更加困难。在这种情况下最好的防御方法就是尽可能地阻塞源地址相近的欺骗数据包。假设攻击者是在一个“互联”的网络中(例如一个自治系统(AutonomousSystem)),由其ISP限制攻击者所在网络流量的输入输出过滤将能够制止这种欺骗攻击——如果这种方法能被机构部署到正确位置的话。这种流量输入输出过滤的防御方式将限制一些合法的通信,比如移动IP三角路由运作模式,因此不可能被普遍部署。IP安全协议(IPsec)同样也提供了一种抵御欺骗包的优秀方式,但是这协议因为部署限制还不能被使用。由于对于服务器方通常不可能要求链接发起人的ISP去实施地址过滤或者要求其使用IP安全协议,因此抵御这种用多地址伪装的欺骗攻击还需要更加复杂的解决方案。分布式攻击:对于单个运用欺骗式攻击的攻击者真正的限制因素是如果这些伪装数据包能够以某种方式被回溯到其真正的地址,攻击者将被简单地击败。尽管回溯过程需要一些时间和ISP之间的配合,但它并不是不可能的。但是攻击者运用在网络中主机数量上的优势而发动的分布式SYN洪泛攻击将更加难以被阻止。如图3所示,这些主机群可以用直接攻击,也可以更进一步让每台主机都运用欺骗攻击。如今,分布式攻击才是真正可行的,因为罪犯拥有数以千计的主机供他来进行拒绝服务(DoS)攻击。由于这些大量的主机能够不断地增加或减少,而且能够改变他们的IP地址和其连接,因此要阻止这类攻击目前还是一个挑战。SYN泛洪防御技术:目前,国内外研究者针对SYNflood提出了非常多的防御手段,主要分为SYNFlood防御技术和IP追踪技术两大类,但每种方法都有其自身的缺陷和局限性。随着高速网络的不断普及,终端数量的不断上升和IPV6的出现,SYNflood攻击将会变得更加难以防范。针对现有方法存在的不足,未来将会有更多更灵敏、更主动的防御策略出现。归纳起来会有以下几个方面:(1)面向IPV6协议的SYNFlood防御手段研究。(2)更加主动的SYNFlood攻击源嗅探算法。(3)更加灵活的服务器资源分配策略。(4)针对手机等移动终端的网络防火墙。目前,针对SYNflood,有以下几种简单的解决方法,分别是:缩短SYNtimeout时间、设置SYNcookie、设置SYN可以队列、使用防火墙(设置防火墙相关安全策略),这些也就是所谓的被动防御措施(相对于IP追踪类的主动防御而言)。缩短SYNtimeout时间:缩短SYNtimeout时间的目的是为了让服务器端更早的释放半连接状态所消耗的资源,减少了服务器堆栈溢出崩溃的几率。由于SYNflood攻击的效果取决于服务器上保持的SYN半连接数,这个值=SYN攻击的频度xSYNtimeout,所以通过缩短从接收到SYN报文到确定这个报文无效并丢弃改连接的时间,可以成倍的降低服务器的负荷。设置SYNcookie:给每一个请求连接的IP地址分配一个cookie,如果短时间内连续受到某个IP的重复SYN文,认定是受到了攻击,以后从这个IP地址来的包会被丢弃。在收到客户端的SYN包后,防火墙代替服务器向客户端发送SYN+ACK包,如果客户端在一段时间内没有应答或中间的网络设备发回了ICMP错误消息,防火墙则丢弃此状态信息:如果客户端的ACK到达,防火墙代替客户端向服务器发送SYN包,并完成后续的握手最终建立客户端到服务器的连接。通过这种技术,保证了每个SYN包源的真实有效性,确保服务器不被虚假请求浪费资源,从而防范了对服务器的SYNFlood攻击。SYNcookie不在主机上保存任何状态,只保存所有初始TCP连接状态,用一个队列来存储。它使用编码函数将所有信息加密后用SYN+ACK发送到客户端,并且将最后的三次握手最后部分返回给服务器。当然它还有一个缺陷就是不能将初始的SYN的所有选项加密成cookie,第二个问题就是TCP协议要求对不应答的数据进行转发,假设服务器在放弃或者丢弃连接之前转发SYN+ACK,就会发送一个RST给客户端去关闭这个连接.当SYN+ACK到达客户端,但是返回的ACK丢失,这种结果就导致客户端和服务器端状态建立不平等。通常,这种情况被服务器转发处理,但是在SYNcookie中,主机中不保存任何状态,这种转发的机制是不存在的。SYNcookie是通过返回的ACK来完成整个连接的建立,不依赖于流程化的SYN,SYN+ACK传送。这可能造成ACK请求ROOD攻击,这种攻击依赖使用正确的值来允许建立连接。这也提供一个绕过防火墙的可能,因为防火墙依赖SYN来过滤外部连接,而现在建立连接根本不依靠SYN包了。另一个SYNcookie的困难就是同TCPV6的兼容上。TCP/IP的运作依靠发送系列化的对等递增的序列数,并且用先前接受的SYNSEQ值来建立连接完成三次握手过程。然而,一旦TCP连接完成了,TCP/IP的序列号的使用是强制性的,这要求服务器纪录下初始的序列号,不论这个项是否需要。因此SYNcookie不能应用于高性能要求的服务器。通常的方法是使用状态分配机制,并且只在大量状态被分配的时候才启用SYNcookie。设置SYN可疑队列:根据攻击程序伪造IP地址的方法。将SYNFlood攻击大致分成以下几种情况:(1)攻击者使用单一的虚假IP地址进行攻击。在这种情况下。攻击者向被攻击主机发送的所有攻击包的源IP地址都是同一个虚假的IP地址。(2)攻击者使用一组虚假的IP地址进行攻击。这种情况比上一种攻击情况有了改进,进行攻击时。攻击者先生成一组IP地址,再将这些IP地址依此添加到成的每个攻击包的源TP地址中。(3)攻击者使用一个网段范围的地址进行攻击。这是攻击者使用较普遍,也是攻击成功率较高的一种攻击情况。进行攻击时,攻击者精心选择一个地址分配比较稀疏的网段,通常会选择一个B类网段。针对以上几种情况,可采用对接收的数据按一定规则加以分类,将数据分为攻击数据、可疑数据和正常数据三种类型,然后分别排队处理。首先,对同一IP地址在短时间内发送大量重复连接请求时,可将其作为攻击数据直接丢弃,其次,对于一组IP地址在短时间内发送大量重复连接请求时,将其放入可疑数据队列,当某个IP地址发出的连接请求数大于某一阈值时.即作为攻击数据进行丢弃处理:若收到某个IP地址发送的应答,则将其转入正常数据队列。最后,对于使用一个网段范围的地址进行攻击的,即服务器在短时间内收到某个网络地址内不同主机发出大量的连接请求,此时仍将其放入可疑数据队列,对于此网段中正常上网的主机当收到服务器重复的SYN+ACK数据包时。就向服务器发送一个RST数据包,从而结束半连接状态;对于此网段中没有开机或上网的主机。即虚假源IP地址。为防止堆栈溢出崩溃,可不按通常的运行方式为其分配相应的数据结构和存储状态信息,只向源IP发送确认信息,将TCP连接保持一种无状态的握手方式巾,直到超时后将其丢弃或者收到源IP的连接确认,再将其转入正常数据队列,并分配相应的数据结构和存储状态信息。当服务器负载较重时,首先丢弃可疑数据队列中的数据,然后冉随机地丢弃正常数据队列中的数据,确保服务器的正常运行。使用放火墙:防火墙位于客户端和服务器之间.因此利用防火墙来阻止DoS攻击能有效地保护内部的服务器。针对SYNFlood,防火墙通常有三种防护方式:SYN网关、被动式SYN网关和SYN中继。(1)SYN网关:防火墙收到客户端的SYN包时,直接转发给服务器:防火墙收到服务器的SYN/ACK包后,一方面将SYN/ACK包转发给客户端,另一方面以客户端的名义给服务器回送一个ACK包.完成TCP的三次握手,让服务器端由半连接状态进入连接状态。当客户端真正的ACK包到达时。有数据则转发给服务器,否则丢弃该包。由于服务器能承受连接状态要比半连接状态高得多。所以这种方法能有效地减轻对服务器的攻击。(2)被动式SYN网关:设置防火墙的SYN请求超时参数,让它远小于服务器的超时期限.防火墙负责转发客户端发往服务器的SYN包,服务器发往客户端的SYN/ACK包、以及客尸,端发往服务器的ACK包。这样,如果客户端在防火墙计时器到期时还没发送ACK包,防火墙则往服务器发送RST包,以使服务器从队列中删去该半连接。由于防火墙的超时参数远小于服务器的超时期限,出此这样能有效防止SY