目录
1 SYN Flood
2 直接攻击
3 伪造源攻击(IP欺骗)
4 分布式服务拒绝式攻击(DDos) -- SYN Flood
1 部署 Anti-DDos 服务(源认证+首包丢弃)
2 SYN Cookie 技术
5 分布式服务拒绝是攻击(DDos) -- 应用层
1 SYN Flood
SYN Flood 就是SYN洪水攻击,他是利用TCP握手机制的漏洞,来达到攻击服务器的目的
TCP三次握手中,客户端发起 SYN 请求,而服务端受到SYN请求之后,会返回一个 SYN+ACK ,与此同时,服务器会在底层为这个客户端维护一个数据结构,放在半连接队列中。那么如果同一时刻存在的半连接数量过多,会消耗服务器的资源,同时,也可能导致服务器无法将新连接放到半连接队列中。
只有服务器收到了客户端的 ACK 之后,该连接的数据结构才会从半连接队列中放到全连接队列中,等待被上层 accept 。
2 直接攻击
那么最简单的SYN 洪水攻击方式就是: 首先黑客会使用自己真实的IP地址,向服务器发送大量的创建连接请求,同时黑客会在自己的主机的防火墙规则中将服务器返回的SYN+ACK拦截,那么这样一来,自然就不会回复ACK,就会一直占用服务器的半连接队列资源。即使服务器重传ACK+SYN,还是会被拦截。
当然这些半连接资源最终会由于超时而被释放,但是他在这段时间内会占用系统资源,影响正常的客户端的建立连接的请求。
这种攻击方式由于是直接使用一个真实的IP进行攻击,很容易溯源,以及进行屏蔽。服务器可以设置在一段时间内某一个IP发送过多的SYN请求,就将其列入黑名单,从而拦截这些恶意的IP。
这种方式过于简单直接,很少被使用。
3 伪造源攻击(IP欺骗)
在这种方式下,黑客不直接使用自己真实的网络地址向服务器发送连接请求,而是伪造TCP请求报文,使用虚假的源地址进行连接建立的请求。
那么服务器在受到连接建立请求之后,在他看来,所谓的连接发起方就是TCP报头中的源IP和源端口这一组地址号,那么他就会发送SYN+ACK给这个虚假的网络地址,并且为其维护半连接。 但是由于这是一个虚假的网络地址,服务器永远也不会受到对端的ACK,那么该连接也就一直在半连接队列中占用服务器资源,直到超时释放。
那么在这种情况下,黑客可以使用单主机来伪造大量的虚假源地址的连接请求报文,占用服务器资源,导致正常的用户无法建立连接。
而这种做法其实也有解决方案,因为不管它使用的是真实的IP还是虚假的IP,他的报文的源头其实都是黑客的主机,那么其实服务器提供商是可以联合运营商或者网络提供商来进行恶意报文的溯源的,最终也是能够找到攻击方
上面所讲的两种SYN Flood攻击都是以消耗服务器的系统和CPU资源,来导致正常用户无法建立连接,当服务器资源已经超负荷时,新来的正常用户的连接请求会被直接拒绝。 所以我们称类似的这种使服务器无法再建立正常连接,拒绝正常连接的攻击方式称为服务拒绝式攻击(Dos)。
4 分布式服务拒绝式攻击(DDos) -- SYN Flood
上面的两种攻击方式都是基于黑客的一台主机而进行的,而在只有一台主机的情况下,理论来说只要服务器的配置足够高,在一定程度上对这两类攻击会有所缓解。
DDos攻击其实就是利用多台主机进行TCP连接请求,最终也是导致占用服务器资源过多而无法接收正常的连接。 而DDos相对于前面所讲的Dos攻击最显著的特点就是难以溯源,无法找到攻击的真正源头。
DDos 攻击: 黑客在网络中散布病毒,控制大量的网络设备,然后在某一个时刻同时向服务器发出大量的SYN请求,最终也不进行回复,占用服务器的半连接队列资源,最终导致无法建立正常的连接。
在这种攻击模式下,我们可以称这些被控制的设备为 肉鸡 或者 傀儡机,黑客并不直接发起恶意的连接请求,而是通过控制傀儡机来进行攻击,这样会使得服务器对恶意攻击的溯源的难度直线飙升。
那么这种攻击如何进行防范呢?
首先是笨方法,我们只需要让我们的服务器的配置足够高,那么就可以为服务器设置更高的半连接队列和连接的数量,那么就可以抵御一定的DDos攻击。 但是这个方法最大的缺点就是: 成本巨高,同时,在正常的运行中,大量资源其实是浪费的。
第二个方法也很简答,我们目前的问题无非就是半连接队列被占满之后,无法受理新的正常连接。那么在半连接队列满了的时候,我们可以认为半连接队列前部的连接是恶意连接,因为他是最早到来的连接请求,但是直到半连接队列满了都还没受到ACK提升为全连接。
那么此时如果有新连接到来,我们就可以释放掉半连接队列前部的连接的资源,为新到连接空出资源。
而这种方法也会导致正常的在半连接队列中的连接被误释放。
下面有两种很好理解的解决方案:
1 部署 Anti-DDos 服务(源认证+首包丢弃)
SYN Flood 方式的DDos无非就是通过占用服务器的半连接资源来达到攻击的目的,并不会进行第三次握手的回复,而如果我们在服务器和客户端之间再增加一层软件层,也就是我们的 Anti-DDos。
当有客户端向服务器发起SYN的时候,他们的SYN报文并不会直接到达服务器,而是被Anti-DDos拦截,代替服务器向客户端回复SYN+ACK,如果客户端进行了第三次握手的回复,那么我们的Anti-DDos就会将这个正常的连接请求交付给服务器,由服务器建立好正常的连接,同时Anti-DDos会将该IP地址加入白名单,后续的一段时间内不会再拦截该IP的报文。
这就是一种简单的源认证,设置一个软件层对SYN的源头进行虚假性的检测。
但是,如果只是源认证的话,那么仅仅是将服务器的压力转移到了Anti-DDos服务器,如果大量SYN同时到来,会导致Anti-DDos服务器资源耗尽,那么这时候为了不影响正常连接,会将无法进行源认证的SYN直接穿透式的交给服务器,这时候如果攻击力度足够大,还是会影响到服务器。
那么为了更深层次的防备DDos,还需要一种策略就是首包丢弃。
顾名思义,就是Anti-DDos服务器在收到一个SYN请求时,并不为其保存部分数据,而是不进行回复。 这是依赖于TCP的超时重传机制的。 如果是一个正常的客户端发起的连接请求,在超时时间内未收到ACK的话,会触发超时重传机制,再次发起SYN请求,这时候Anti-DDos服务器才会去执行源认证的策略。从而保证Anti-DDos服务器和服务器的安全。
通过源认证+首包丢弃的方案,就能够大限度的防备DDos攻击。
因为黑客在进行DDos攻击的时候,最终还是通过虚假源发起SYN请求,而不会进行回复行为,也不会有超时重传的行为。
2 SYN Cookie 技术
服务器受到DDos攻击的根本原因还是因为服务器会在第一次握手就建立好半连接,消耗自己的资源。那么如果服务器在收到SYN请求之后,并不在服务器内部直接保存对端的数据结构,就可以防备这种攻击。 那么具体怎么做呢?
其实这种方法还是利用黑客制造的虚假源SYN 不会进行回复的特点。
服务器在收到SYN请求之后,利用特殊的算法生成一个Cookie,这个Cookie包含了对端的IP+port以及己方的IP+port信息,以及对端无法知道的服务器的一些固定的信息,比如服务器的时间等,这个Cookie会作为服务器返回的ACK+SYN中的序列号来发送。
如果对端是正常客户端连接,那么就会恢复一个ACK报文,在这个ACK报文中会进行服务端的SYN的确认应答,也就是序列号是服务端生成的Cookie + 1 。那么服务器这时候会再次使用相同的Cookie生成算法生成一个原来的Cookie,然后对比其是否和ACK中的确认序号相差1,如果是,那么就会放入半连接队列中,然后再正常建立全连接。
当然,由于Cookie也就是序号只有32位,那么势必会损失一些连接相关的数据。
即便如此,也比被DDos消耗完服务器的资源好。
5 分布式服务拒绝是攻击(DDos) -- 应用层
上面讲的DDos攻击的方式是通过SYN Flood 来占用服务器的半连接资源,并不会建立真正的连接。 而其实还有一种分布式攻击就是控制足够多的肉鸡,同时对服务器发起正常的 Web 请求,那么在这个时候占用的是服务器的全连接资源。 当服务器的连接数量达到上限之后,也无法再为新来的客户端连接提供服务。
这种攻击方式最好的解决方案就是提升服务器的配置以及分散流量。
我们可以使用分布式的服务器,也就是边缘服务器,当客户端请求的资源在边缘服务器中能找到,那么就直接由边缘服务器进行服务。 如果边缘服务器无法满足需求,再访问源服务器或者说根服务器。
理论上来说这种攻击方式无解,只要由足够多的看似正常的客户端进行看似正常的Web请求,那么没有任何方案能够防范。