一、前言
SYN Flood是互联网上最原始、最经典的DDoS(Distributed Denial of Service)攻击之一。它利用了TCP协议的三次握手机制,攻击者通常利用工具或者控制僵尸主机向服务器发送海量的变源IP地址或变源端口的TCP SYN报文,服务器响应了这些报文后就会生成大量的半连接,当系统资源被耗尽后,服务器将无法提供正常的服务。增加服务器性能,提供更多的连接能力对于SYN Flood的海量报文来说杯水车薪,防御SYN Flood的关键在于判断哪些连接请求来自于真实源,屏蔽非真实源的请求以保障正常的业务请求能得到服务。
二、目录
SYN洪泛攻击的历史和技术基础
SYN Flood是如何发生的?
如何识别和防御SYN Flood?
三、SYN Flood的历史和技术基础
(一)历史
早在1994年,Bill Cheswick和Steve Bellovin就发现了TCP SYN泛洪弱点[B96]。他们在《防火墙和互联网安全:击退威利黑客》(CB94)一书中加入并删除了一段关于攻击的内容。不幸的是,在接下来的两年内没有制定任何对策。
SYN泛洪攻击于1996年在Phrack杂志上首次公开,杂志发布了一个SYN泛洪攻击的描述和利用工具[P48-13]。除了一些小的错误,本文的质量足够高,非常有用,文章中的代码被广泛分发和使用。
到1996年9月,开始广泛观察到SYN泛洪袭击。特别是,针对一家ISP邮件服务器的攻击导致了众所周知的停机。CERT很快发布了一份关于此次攻击的建议[CA-96.21]。与当时已知的其他拒绝服务攻击相比,SYN泛滥尤为严重。SYN洪泛不是依赖于简单耗尽网络资源的常见暴力策略,而是针对需要消耗更少数据包的终端主机资源。
社区很快开发了许多不同的技术来防止或限制SYN泛洪攻击的影响。其中许多已经在互联网上不同程度地部署,包括终端主机和中间路由器。这些技术中的一些已经成为某些操作系统中TCP实现的重要部分,尽管有些技术与TCP规范有很大的不同,并且这些技术中没有一项技术已经被IETF过程标准化或认可。
(二)操作理论
TCP实现可以允许使用应用程序指定的IP地址和端口号对中的全部、部分或全部进入LISTEN状态。在许多常见的应用程序(如web服务器)中,远程主机的任何信息都不是预先已知或预先配置的,因此可以与服务器事先不知道其详细信息的任何客户端建立连接。这种类型的“未绑定”LISTEN是SYN洪泛攻击的目标,因为它通常由操作系统实现。
为了成功,SYN洪泛攻击依赖于受害主机TCP实现的行为。特别是,它假设受害者在收到每个TCP SYN段时为其分配状态,并且对这种状态的数量有限制,不能在任何时候保持。当前的基本TCP规范RFC 793[RFC0793]描述了传入SYN段的标准处理。RFC 793描述了传输控制块(Transmission Control Block,TCB)数据结构的概念,以存储单个连接的所有状态信息。在实践中,操作系统可能以不同的方式实现这个概念,但关键是每个TCP连接都需要一些内存空间。
根据RFC 793,当接收到连接处于LISTEN状态的本地TCP端口的SYN时,状态转换为SYN-REEVED,并且使用来自接收到的SYN段的报头字段的信息初始化一些TCB。实际上,许多操作系统不改变LISTEN中的TCB,而是复制TCB,并在副本上执行状态转换和更新。这样做使得本地TCP端口可以在几个不同的连接之间共享。这种TCB复制行为实际上对这一目的并不重要,但会影响希望通过单个TCP端口处理多个同时连接的应用程序的编写方式。这种行为的关键结果是,必须将新的(或未使用的)内存专用于复制的TCB,而不是更新已分配的内存。
例如,在Linux2.6.10网络代码中,使用“sock”结构来实现TCB概念。通过检查,这种结构需要1300多个字节才能存储在内存中。在实现较不复杂的TCP算法和选项的其他系统中,开销可能较小,尽管它通常超过280字节[SK+97]。
为了保护主机内存不被连接请求耗尽,任何时候可以驻留的TCB结构的数量通常受到操作系统内核的限制。系统因限制是全局应用还是本地应用于特定端口号而有所不同。限制是否适用于完全建立的连接以及SYN-REEVED中的连接也存在差异。通常,系统为典型的listen()系统调用实现一个参数,该参数允许应用程序为这个限制建议一个值,称为backlog。当达到backlog限制时,要么忽略传入的SYN段,要么替换backlog中未完成的连接。标准文档中没有描述使用backlog的概念,因此到达backlog时的失败行为可能在堆栈之间有所不同(例如,可能会生成TCP RST)。确切的故障行为将决定发起主机是随时间继续重新发送SYN段,还是快速停止。这些实现上的差异是可以接受的,因为它们仅在本地堆栈的资源受到约束时影响其行为,而不会导致互操作性问题。
SYN洪泛攻击并不试图使网络资源或终端主机的内存过载,而只是试图耗尽与端口号相关的缓存的半开放连接。目标是从IP地址(通常是伪造的)快速发送SYN段,这些SYN段不会生成对生成的SYN ACK的回复。通过让缓存的连接充满了虚假的半开放连接,合法的请求将被拒绝。成功的三个重要攻击参数是拦阻的大小、生成拦阻的频率以及选择IP地址进行欺骗的方式。
四、SYN Flood是如何发生的?
SYN Flood顾名思义就是用洪水一样的SYN报文进行攻击。SYN报文指的是TCP协议中的Synchronize报文,是TCP三次握手过程中的首个报文。让我们先来了解一个正常的TCP三次握手过程。
(一)TCP三次握手过程
开始建立连接时,客户端发送SYN报文到服务器,等待服务器确认。SYN报文的源IP地址和端口是客户端的IP地址和端口。
服务器收到SYN报文,回应一个SYN-ACK(Synchronize-Acknowledgement)报文。SYN-ACK报文的目的P地址和端口是客户端的IP地址和端口。
客户端收到服务器的SYN-ACK报文,向服务器发送ACK报文,服务器收到ACK报文后完成三次握手,TCP连接建立成功。在连接超时之前,服务器会一直等待ACK报文,此时该连接状态为半开放连接(也被称为半连接)。半连接会占用服务器的连接数,当连接数被占满时,服务器就无法提供正常的服务了。黑客正是通过这个机制来实现SYN Flood。
(二)SYN Flood的攻击过程
黑客通常通过伪造的源IP地址或端口,向服务器发送大量的SYN报文,请求建立TCP连接。由于源IP地址或端口是伪造的,服务器发送的SYN-ACK报文永远不会被真实的客户端接收和回应。极少数情况下,黑客也会使用真实源IP地址,但他们只是通过攻击工具发送海量SYN报文,工具并不会响应来自服务器SYN-ACK报文。无论如何,服务器都接收不到ACK报文,产生了大量的半连接。此时服务器需要维持一张巨大的等待列表,不停地重试发送SYN-ACK报文,同时大量的资源无法释放。当服务器被这些恶意的半连接占满时,就不会再响应新的SYN报文,从而导致正常的用户无法建立TCP连接。
五、如何识别和防御SYN Flood?
SYN Flood的目的是占满服务器的连接数,消耗服务器的系统资源。对于服务器自身来说,最直接的做法就是提高服务能力,比如组建集群,升级硬件。但是这种方式成本巨大,且对于海量的攻击报文来说,并没有太大的作用,仅多撑几分钟甚至几秒而已。
所以,必须在这些攻击报文到达服务器之前就进行拦截。然而对于防火墙这类安全设备而言,SYN报文是正常的业务报文,防火墙的安全策略必须允许其通过,否则服务器就无法对外提供服务。如果能明确虚假源的IP地址,就能通过精细的安全策略阻止这些源发来的SYN报文。但是管理员无法预知哪些是虚假源。即使能分析出虚假源,也无法做到快速、自动地配置或取消安全策略来应对不可预期的攻击流量。
此时就需要Anti-DDoS系统的能力了,它部署在网络入口处,在服务器之前处理SYN报文,识别出虚假源,屏蔽来自这些地址的报文,只将合法的SYN报文传递给服务器。Anti-DDoS系统处理SYN报文主要有两种手段,源认证和首包丢弃。
(一)源认证
Anti-DDoS系统拦截客户端发送的SYN报文,代替服务器向客户端发送SYN-ACK报文,如果客户端不应答,则认为该客户端为虚假源;如果客户端应答,则Anti-DDoS系统认为该客户端为真实源,并将其IP地址加入白名单,在一段时间允许该源发送的所有SYN报文通过,也不做代答。
(二)首包丢弃
如果Anti-DDoS系统代替服务器应答了所有的SYN Flood攻击报文,那么性能瓶颈仅仅是从服务器转移到了Anti-DDoS系统而已。一旦Anti-DDoS系统的系统资源耗尽,攻击依旧会透传到服务器,而且大量反弹的SYN-ACK报文也会对网络造成一定的压力。Anti-DDoS系统利用首包丢弃来解决这个问题。
TCP协议的可靠性不仅体现在三次握手,还体现在超时与重传的机制。正常情况下客户端发送SYN报文后如果在一定时间没有收到服务器的SYN-ACK应答,客户端会重新发送SYN报文。Anti-DDoS系统会丢弃掉收到的第一个SYN报文。SYN Flood攻击时,黑客发送的绝大多数是变源的SYN报文,所有的SYN报文对于Anti-DDoS系统来说都是首包,都将被直接丢弃。如果客户端重传了SYN报文,Anti-DDoS系统再对该报文进行源认证。如此一来,大大减少了Anti-DDoS系统代答的压力。首包丢弃和源认证两种手段结合,对于防御SYN Flood(特别是不断变换源IP和源端口的虚假源攻击)非常有效。
(三)高防服务器
T级别数据中心,具备完善的机房设施,核心骨干网络有效保证高品质的网络环境和丰富的带宽资源
DDoS清洗:近源清洗多种流量清洗部署方案,无损防御各种DDoS攻击
CC攻击防御:5s发现恶意请求,10s快速阻断攻击,事前拦截、事后溯源、全方位防黑
Web应用防火墙:防SQL注入、XSS跨站,后门隔离保护、Webshell上传、非法HTTP协议请求。
德迅卫士:系统层安全软件,为用户远程桌面扫描登陆、手机短信验证登陆等。一键后台优化服务器权限、威胁组件、威胁端口。
(四)抗D盾的使用
抗D盾是新一代的智能分布式云接入系统,接入节点采用多机房集群部署模式,隐藏真实服务器IP,类似于网站CDN的节点接入,但是“抗D盾”是比CDN应用范围更广的接入方式,适合任何TCP 端类应用包括(游戏、APP、微端、端类内嵌Web等)。用户连接状态在各机房之间实时同步,节点间切换过程中用户无感知,保持TCP连接不中断,轻松应对任何网络攻击。
DDoS防御:基于SDK接入的分布式防御体系,可精准定位恶意攻击者并主动隔离,具备自动化溯源能力。
CC攻击防御:私有化协议二次封装,非链接限速、报文检测机制,0误杀、0漏过。
集成方式:EXE封装、SDK接入,支持Windows、iOS、Android系统,分钟级集成。
网络加速:智能多线节点分布,配合独家研发的隧道填补技术,保证每条线路都是优质网络
防掉线系统:研发新SocKet协议,弥补WinSock链接失败会断开问题,链接失败自动无缝切换
承诺服务:提供被攻击打死无理由退款,封装失败或者无效无理由退款,24小时运维在线服务