解决TCP链接中存在的大量的半链接状态SYN_RECV,如何用iptables防御SYN Flood攻击

概述

服务器TCP连接数/同时连接数突然飙升到很高,这可能是由于受到SYN Flood攻击,属于DDos攻击的一种。该攻击严重时会导致服务器资源耗尽(CPU满负荷或内存不足)而无法响应正常网站访问请求,那么如何解决和防范该问题呢?

问题描述

服务器报警网络连接数TCP异常,超出我设置的警告线。异常情况见下图,22:45开始链接数突然开始飙升到平时的10倍。第二天上班查看详情后,分析可能是遭受SYN Flood攻击,于09:45设置iptables限制SYN并发数,之后见到异常链接数有所下降。

服务器TCP链接数异常 – 遭受SYN Flood攻击 – 解决过程

如何判断遭受 SYN 攻击?

检测SYN攻击比较容易,当你在服务器上使用netstat命令看到大量的SYN_RECV半连接状态时,特别是源IP地址是随机的,基本上可以断定这是一次SYN攻击。命令和结果如下:

# netstat -n | grep "^tcp" | awk '{print $6}' | sort | uniq -c | sort -n
2 ESTABLISHED
2 TIME_WAIT
88 SYN_RECV

可以看出我的服务器中存在大量的SYN_RECV链接,这正是受到了SYN Flood攻击。使用命令netstat -n -p TCP可以查看链接的IP地址等信息。

解决方法

我们使用iptables防御SYN Flood攻击。这种攻击是没法完全解决,我们只能采取措施将影响降低到最小,通过下边操作命令可将SYN并发数限制在每秒钟一个。

限制syn并发数每秒1次,可以根据自己需要修改参数–limit 1/s来调整每秒钟限制连接数

# iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT

允许服务器内部每秒1个初始连接进行转发

# iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

上述操作设置后,查看iptables端口配置

# iptables -L -n --line-number

iptables删除端口配置,比如删除INPUT规则的第一条(设置不合适的可通过该命令删除)

# iptables -D INPUT 1

【注意】这个方式需要调节一个合理的速度值,不然会影响正常用户的请求!

我设置后,09:45异常TCP连接数SYN_RECV有一定程度下降,该方法还是有用的。但由于我的服务器遭受的攻击没有影响到正常的网站访问,我就没必要做iptables的SYN限制,只是研究一下这种异常的原理和解决方法,为今后遇到类似问题做准备。

设置规则后,就能立马查看TCP异常链接数的变化,有没有降低。由于该规则会限制正常用户访问,如若想一直限制,那就需要【保存】。因为设置的iptables规则是放在内存中的,重启会被清除,通过命令service iptables save或者/etc/rc.d/init.d/iptables save保存

SYN Flood攻击是什么?

SYN Flood (SYN洪水) 是种典型的DoS (Denial of Service,拒绝服务) 攻击,属于DDos攻击的一种,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式(TCP协议的缺陷,所以没办法根除,除非重做TCP协议,目前不可能),最后停止响应正常的TCP连接请求。

SYN Flood 主要是利用了TCP协议的三次握手的缺陷,在这个攻击中,Flood带有一系列的syn数据包,每个数据包都会导致服务端发送SYN-ACK响应,然后服务器等待SYN+ACK之后的第三次握手ACK,由于客户端是软件生成的虚拟IP,永远不会再发送ACK响应服务端,服务端会利用重传机制直到超时后删除,整个系统资源也会被队列积压消耗,导致服务器无法对正常的请求进行服务。

转载请注明:半亩方塘 » 解决TCP链接中存在的大量的半链接状态SYN_RECV,如何用iptables防御SYN Flood攻击