DDoS-SYN泛洪攻击缓解

Posted by 周思进 on March 8, 2022

DDoS 实际是 DoS 的升级版,先说下 DoS 概念。DoS(Denial of Service),就是拒绝服务,恶意黑客通过网络攻击使服务器无法接收正常服务请求。而 DDoS(Distributed DoS),分布式拒绝服务攻击,即黑客通过分布在网络的客户端同时向目标服务器发起攻击,使服务器无法正常接收用户请求。

DDoS 的攻击种类多种多样,一种是通过发起海量的请求挤占服务带宽,导致带宽耗尽,服务端无法接收用户的正常请求,这种情况,只能通过扩大带宽来提高网络的请求量,可以使用 DDos 高防产品来解决。

另一种则是通过耗尽服务端的连接资源使其无法继续接收请求而拒绝服务。

DDoS 的攻击形式也多种多样,有网络层的 ICMP 泛洪攻击,还有传输层的基于 UDP 和 TCP 协议的各类攻击。

基于 UDP 协议,典型的攻击有 UDP 泛洪攻击、DNS 放大攻击;这两个攻击也有区别,一个是直接攻击,另一个是反射攻击。

如UDP 泛洪攻击,是直接将大量的 UDP 包发送给目标服务器,属于直接攻击。 UDP 泛洪攻击在于让服务器忙于做如下响应处理,导致资源耗尽,无法处理正常情况。
1、服务器会检测是否有端口监听该 UDP 报文
2、如果没有端口监听处理,则服务器会发送 ICMP 目的不可达报文给对方

而DNS放大攻击属于反射型攻击,攻击者不会直接发送报文给目标服务器,而是通过伪装成目标服务器 IP,向DNS服务器发送请求,导致DNS服务器发送大量的应答报文给目标服务器,使其瘫痪。

相对于 UDP 攻击, 基于 TCP 协议的攻击就没法进行反射型攻击,因为如果 TCP 将源地址伪造成被攻击站点的话,那么 SYN+ACK 报文就会发送到被攻击站点,但被攻击站点并没有发送过 SYN 报文,直接就 RST 拒绝了。常见的有 SYN 泛洪攻击、全连接攻击(建立连接后不发送请求报文)、CC 攻击(大量正常请求报文)等等。


下面针对 SYN-Flood 攻击做简单说明,及测试和应对缓解措施说明。

SYN 泛洪攻击则是被攻击站点在接收到了客户端的 SYN 包后,为其分配了内存资源,并将其放入到了半连接队列,然后向对端发送 SYN+ACK 报文,自身进入 SYN_RECV 状态;正常会收到对端的 ACK 确认报文,完成 TCP 的三次握手,进入 ESTABLISHED 状态。但 SYN 攻击就是再也接收不到最后客户端发送的 ACK 报文。

由于半连接表的大小有限,大量的半连接最终导致连接表沾满,而无法再接收处理用户的正常请求。

1、

查看系统的默认半连接数

[email protected]:~ $ cat /proc/sys/net/ipv4/tcp_max_syn_backlog
128

对于嵌入式设备,这个连接数扩大本身也会增加自身内存占用,实际也并无多大改善意义,基本不考虑。

2、

服务端一直收不到对端的 ACK 报文,就会触发超时重传,这也极其的消耗资源,默认重传次数5次,可以考虑将这个值减小

[email protected]:~ $ cat /proc/sys/net/ipv4/tcp_synack_retries
5

3、

考虑限制 SYN 的接收个数,此方法可以通过 iptables 命令实现,如下

# 限制syn并发数为每秒10次
$ iptables -A INPUT -p tcp --syn -m limit --limit 10/s -j ACCEPT

# 超出个数的 syn 包进行丢弃
$ iptables -A INPUT -p tcp --syn -j DROP

然后通过 hping3 命令实施 SYN-Flood 攻击来验证效果,如系统不支持,可以手动安装,也可以直接装个 Keil 虚拟机,进入 root 权限后,就可执行使用。

$ hping3 -S -p 80 --flood 192.168.1.120
# -S 参数表示设置 TCP 协议的SYN(同步序列号)
# -p 表示目的端口为80

嵌入式设备在不加限制的情况下,取流基本直接卡死了,加了限制后,设备基本还能继续取流,偶有卡顿。

4、

SYN Cookies 也是一种专门防御 SYN Flood 攻击的方法。其基于一些连接信息计算出一个哈希值作为 cookie, 然后用这个当序列号,来应答 SYN+ACK 包。当客户端发送 ACK 后,服务器就会重新计算这个哈希值,确认该 ACK 是上次发送的 SYN+ACK 的返回包,才会正式申请资源建立 TCP 连接。

开启 SYN Cookies 后,就不需要维护半连接队列,也不用提前申请资源了。这个验证方式跟摘要认证类似,但因为用到了哈希计算,增加了连接建立的延迟时间,实际测试强制打开,似乎对于嵌入式设备也并无什么效果,取流同样直接卡死。

$ cat /proc/sys/net/ipv4/tcp_syncookies
1

# 1 表示连接压力比较大时才启用 syncookies 技术
# 2 表示始终使用 syncookies 技术
# 0 表示关闭