SYN Flood攻击与防御

1--SYN报文讲解

1.1--SYN报文理解

SYN报文属于四层报文负责TCP连接的建立,是建立三次握手的第一步.

SYN报文没有明显特征所以一般不通过SYN报文特征进行拦截,从SYN报文建立TCP连接的行为入手做源认证来进行SYN Flood防御

1.2--TCP连接的建立----三次握手

TCP三次握手
TCP三次握手

在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP窗口大小信息。

三次握手

第一次握手:

建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:

服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)中,一并发送给客户端,此时服务器进入SYN_RECV状态;

第三次握手:

客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y+1,向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。

1.3--SYN Flood 攻击原理

连接建立与SYN Flood 攻击的关系

三次握手前,服务端的状态从CLOSED变为LISTEN, 同时在内部创建了两个队列:半连接队列和全连接队列,即SYN队列和ACCEPT队列。

半连接队列
当客户端发送SYN到服务端,服务端收到以后回复ACK和SYN,状态由LISTEN变为SYN_RCVD,此时这个连接就被推入了SYN队列,也就是半连接队列。

全连接队列
当客户端返回ACK, 服务端接收后,三次握手完成。这个时候连接等待被具体的应用取走,在被取走之前,它会被推入另外一个 TCP 维护的队列,也就是全连接队列(Accept Queue)。

SYN Flood攻击的原理很简单,就是用客户端在短时间内伪造大量不存在的 IP 地址,并向服务端疯狂发送SYN。对于服务端而言,会产生两个危险的后果:
处理大量的SYN包并返回对应ACK, 势必有大量连接处于SYN_RCVD状态,从而占满整个半连接队列,无法处理正常的请求。
由于是不存在的 IP,服务端长时间收不到客户端的ACK,会导致服务端不断重发数据,直到耗尽服务端的资源。

1.4--SYN报文字段讲解

SYN报文
SYN报文

SYN报文在TCP层面 标志位(Flags)SYN置位1标识这是一个SYN报文

重点字段如下:

Source Port :60432客户端发出SYN报文的来源端口(一般是5万以上的高端口发出)

Destination Port: 8080服务端的目地端口(一般是业务端口.服务器没有监听直接丢弃SYN报文)

Sequence Number (raw): 4012586035

Acknowledgment number(raw): 0

Seq和Ack主要用于后续报文配合实现TCP报文的重组保持TCP流的稳定

Header Length: 32 bytes (8)标识头部长度 TCP固定头部长度20字节 SYN报文写到OPTION字段12字节 20+12=32   (数据偏移)TCP Data Offset即头部长度(8)由wireshark解析表示TCP Data Offset的值为8 单位4个字节 一般的TCP报文没有携带option字段 可以从这个角度进行拦截 

Flags:标志位

紧急标志位(URG):开启时表明此数据包处于紧急状态应该优先处理
确认标志位(ACK):开启时表明确认号有效 否则忽略确认号
推送标志位(PSH):开启时表明应该尽快交付给应用进程 而不必等到缓存区填满才推送
复位标志位(RST):开启时表明TCP连接出现连接出现错误 数据包非法拒绝连接
同步标志位(SYN):开启时表明一个连接的请求或者接受报文 SYN报文置位1
终止标志位(FIN):开启时表明释放一个连接

Windows:滑动窗口即可以连续接受数据的字节数  以字节为单位,表示发送该报文的那一方的接收窗口大小,用于配合拥塞窗口调整对方的发送窗户大小

此处不多加赘诉滑动窗口与拥塞的配合 介绍下常见的Windows大小

SYN Flood 有时候会修改SYN报文的windows大小 需要分析业务正常SYN包的windows大小如果出现高频windows大小不为正常值的可以作为一个特征进行拦截(谨慎添加 windows变化较多)

Urgent Pointer:0  如果TCP-Flags中urg尚未置位1此处值不为0直接拦截大多防火墙厂家默认拦截Urgent Pointer不为0的报文

OPTION(选项字段) 一般包含选项表结束,无操作,最大报文段长度,窗口扩大因子,时间戳这几个选项,目前主要是包含MSS WS SACK三个字段

MSS最大报文长度:MTU-IP头部-TCP头部=1500-20-20=1460字节

WS窗口因子:WS与滑动窗口相关。通过增加一个因子来扩大默认滑动窗口的值。

1、两端都支持,窗口因子才会最终被启用。如有一端不支持,则因子不会被使用。

2、窗口因子是在TCP的SYN包协商的,而且只协商一次。也就是滑动窗口是根据实际情况进行变化的,但是因子是固定的。

SACK:来允许TCP单独确认非连续的片段,用于告知真正丢失的包,只重传丢失的片段

SACK跟WS也需要双方都支持 两者都是在拥塞方面起作用 如果报文经过中间设备转发速率变慢很多可能是这两者影响TCP单条流的带宽,此处不过多叙述

2--SYN Flood攻击与防御

参考链接华安解密之DDoS攻防:TCP原理篇之SYN Flood

对于这种面向连接的SYN-FLood攻击,最有效的防御方式就是源认证。源认证有三个层面:

源认证有三个层面:

1、 TCP/IP源认证
2、 应用层源认证
3、 用户源认证

本节的源认证,正是整个源认证防御系统中的第一层TCP/IP源认证。在TCP三次握手还没有建立成功之前,验证攻击源的TCP/IP是否真实可信。
其中源认证是对IP层面的校验,认证这个源是不是真实存在的源;而首包丢弃是对于TCP协议栈层面的校验,用于判断是否是这个源发出的真实请求,真实请求就代表是具有TCP协议栈的请求

FW并不会常开SYN源认证策略,一般是到达防护参数阈值后开启 常见防护参数如下:

1.源认证的SYN包开启门限

2.源认证的并发连接开启门限

3.目的IP阈值(pps)

2.1 SYN基础源认证


FW到达阈值启动防御后拦截SYN请求与C端建立连接给C端回错误序列包的SYN-ACK,虚假IP不会回包;真实IP收到错误的链接信息会发RST包,要求断开当前链接重新建立连接,重新发送SYN请求。
FW收到RST包会把C端加入到白名单,重新发送的SYN会穿过FW与S端建立连接


从报文交互过程可以看出,Anti-DDoS设备代替服务器,向客户端反弹一个错误序列号的SYN-ACK报文,等待客户端的回应。

1.如果是虚假源,这个源IP可能在网络中根本就不存在,或者即使存在也没有发送过SYN请求,莫名其妙的就收到一个SYN-ACK报文,不会做出任何响应,所以也就无法通过源认证。

2.如果是真实源,收到错误的SYN-ACK报文,会回应一个RST报文,要求重传。这样Anti-DDoS设备就会判定这个客户端是真实源,并加入白名单。后续这个源在一定时间内,发送的SYN报文,匹配白名单,直接送达服务器。


通过这种方式可以识别出,哪些是真实源,哪些是虚假源。不过,有的网络设备会丢弃错误序列号的SYN-ACK报文,那么这种基本源认证在以下两种情况下就不适用了:
1、 Anti-DDoS设备和客户端之前有防火墙。有的防火墙的设置可能会丢弃错误序列号的SYN-ACK报文。
2、极少数客户端对于错误序列号的SYN-ACK报文是不回应的。

2.2 SYN高级源认证

FW到达阈值启动防御后拦截SYN请求与C端建立连接给C端回正确序列号的SYN-ACK,虚假IP不会回包,真实IP收到正确序列号的SYN-ACK,会回ACK,建立三次握手。
FW把建立三次握手的C端IP加入白名单,并回包RST要求C端重新建立连接。客户端新发送的SYN会穿透FW与S端建立连接。
但是存在网络阻塞的情况,虚拟IP的大量请求加上对真实IP和虚拟IP的大量回包会导致网络阻塞丢包、请求无法到达等情况,


FW启用首包丢弃并记录三元组信息,收到的所有SYN请求包都丢弃,攻击报文不会重传。真实IP具有TCP协议栈,没有收到回包会判定发出的包丢弃或损坏了会重新发包
真实IP通过TCP重传机制重传SYN,FW比对三元组信息和时间戳确认为重传包,FW回SYN-ACK正确序列号的包进入源认证环节,虚拟IP不会回包,真实IP回包ACK FW把C端加入白名单并发送RST
C端重新发送的SYN与S端建立连接,这样回的SYN-ACK少了很多 减少了一定的网络阻塞。

首包丢弃功能要和源认证一起配合使用,对于虚假源攻击,尤其是针对不断变换源IP和源端口的虚假源攻击,可以达到最佳防御效果。

2.3 Cookie方式

在FW接收到SYN后不立即分配连接资源,而是根据这个SYN计算出一个Cookie,连同第二次握手(此时回复的是正确序列号的SYN-ACK)回复给客户端,在客户端回复ACK的时候带上这个Cookie值,FW验证 Cookie 合法之后才分配连接资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值