一、什么是 SYN flooding?

LINUX常见问题之SYN flooding-LMLPHP

SYN Flood是流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,塞满TCP等待连接队列,导致资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来,从而间接达到攻击的目的。

SYN Flood攻击利用的正是IPv4中TCP协议的三次握手过程进行的攻击。如果一端想向另一端发起TCP连接,它需要首先发送TCP SYN 包到对方,对方收到后发送一个TCP SYN+ACK包回来,发起方再发送TCP ACK包回去,这样三次握手就结束了。

我们把TCP连接的发起方叫作"TCP客户机(TCP Client)",TCP连接的接收方叫作"TCP服务器(TCP Server)"。值得注意的是在TCP服务器收到TCP SYN request包时,在发送TCP SYN+ACK包回TCP客户机前,TCP服务器要先分配好一个数据区专门服务于这个即将形成的TCP连接。一般把收到SYN包而还未收到ACK包时的连接状态成为半开连接(Half-open Connection)。

LINUX常见问题之SYN flooding-LMLPHP

在最常见的SYN Flood攻击中,攻击者在短时间内发送大量的TCP SYN包给受害者,这时攻击者是TCP客户机,受害者是TCP服务器。根据上面的描述,受害者会为每个TCP SYN包分配一个特定的数据区,只要这些SYN包具有不同的源地址(这一点对于攻击者来说是很容易伪造的)。这将给TCP服务器系统造成很大的系统负担,最终导致系统不能正常工作。 

二、发现SYN flooding了怎么办?

1、netstat -s来查看SYNs to LISTEN sockets dropped是否持续增长。message日志是否持续报flooding相关的报错。

2、打开tcp cookie的功能

这个cookie是指SYN Cookie。在目前以IPv4为支撑的网络协议上搭建的网络环境中,SYN Flood是一种非常危险而常见的DoS攻击方式。到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最著名的一种。SYN Cookie原理由D.J.Bernstain和Eric Schenk发明。在很多操作系统上都有各种各样的实现。

syn_cookies的官方介绍:

LINUX常见问题之SYN flooding-LMLPHP

  官方文档说明了当看到有SYN flood warning的时候并不一定真的是flooded,有可能是你的服务器没有正确的配置。同理,有时你的服务器有此报警的时候也并不一定是真的有attack,这时考虑需要你调整你的内核参数tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow。


3、用tcpdump抓包,如果有很多SYN,服务端回复了SYN+ACK,但客户端没有回复ACK,那么这可能就是恶意流量。如果恶意流量很大导致服务不可用,可对抓取到的可疑源端地址进行流量紧急封堵。

如果流量是正常流量的话,可以考虑优化调整内核参数可以调整内核的三个参数:tcp_max_syn_backlog, tcp_synack_retries, tcp_abort_on_overflow

三、内核源码出处

net/ipv4/tcp_input.c

01-11 05:46