在3次握手进行的过程中,服务器需要保持所有未完成的握手信息(称为半开连接,即收到了TCP-SYN并发送了SYN-ACK,但第三次握手信息(ACK)未收到的状态)直到握手完成或超时(不同的系统超时长度的设置不同,一般情况下在75秒左右)以后丢弃该信息。
而且,半开连接的数量是有限的,比如很多OS设置为1024个,当服务器的半开连接栈用完,服务器将不再接受其他的连接请求。
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
查看处于 SYN_RECV 的连接数量是否异常
SYN Flood 攻击就是攻击者向攻击目标发送大量伪造的TCP 连接请求报文,即 SYN 包;
而当攻击目标收到连接请求时,就会在目标的 TCP 协议栈分配资源, 并记录其信息到半开连接队列中,同时回应 ACK + SYN;
此时, 攻击者却不再发送ACK 确认报文以完成第三次握手, 而是将继续发送大量的 SYN 连接请求包。
这样不仅会导致被攻击者在短时间内需要为大量半开连接分配内存资源,还会使得系统对后续到来的SYN 包在自身的半开连接队列中查找是否有此包的握手信息,从而消耗大量 CPU 资源, 最终造成被攻击者无法向正常用户提供所需服务。
设置 net.ipv4.tcp_synack_retries = 0
,表示不进行 SYN+ACK 包的重发。
默认 net.ipv4.tcp_synack_retries
为 5,表示重发5次,每次等待30~40秒,即“半开连接”默认hold住大约180秒。
设置 net.ipv4.tcp_max_syn_backlog = 200000
,表示最大半连接队列容量。
SYN Cookie 技术
原理:
Cookie 机制是服务器收到客户端的连接请求后, 系统并不会为其分配资源,而简单记录该连接信息,形式即如源 IP、 源端口、 时间戳的三元组,根据这个 SYN 包的相关信息计算生成某一 Cookie 值, 并将其作为 ACK + SYN 包的序列号返回给客户端。
在接到 ACK 报文时, 根据 ack_seq - 1
计算出 Cookie,并进行验证,验证通过则分配资源,建立连接, 否则回复 RST 包。
启用:
设置 net.ipv4.tcp_syncookies = 1
开启 SYN Cookie。
cookie 计算:
服务器收到一个SYN包,计算一个消息摘要 mac = MAC(A, k);
MAC是密码学中的一个消息认证码函数,也就是满足某种安全性质的带密钥的hash函数,它能够提供cookie计算中需要的安全性。
在Linux实现中,MAC函数为SHA1。
A = SOURCE_IP || SOURCE_PORT || DST_IP || DST_PORT || t || MSSIND
总结:
参考: https://www.cnblogs.com/zlhff/p/5481266.html
SYN Cache 技术
该方法通过一个专用的 HASH 表 (Cache) 来保存半开连接信息,直至收到 ACK 信息才为连接分配系统资源 (TCB) .
SYN Proxy 技术
只有在 SYN 代理确认连接的有效性后,才向内部服务器发起连接请求。所以当攻击发生时,攻击造成的危害就将转移到至该代理上,借此以保护服务器端。
是基于 SYN Cookie 和 SYN Cache 的,这也是对 SYN Cookie 的另一种改进。
只是需要注意,一旦代理被攻击破坏, 其保护的服务器也都将无法向外界提供服务,这也成为 SYN Proxy 方法的瓶颈所在。
hping3 --flood -S --rand-source -p 9999 x.x.x.x
在内网测试,随机地址的SYN包可能会被路由器丢弃。