概述
慢速攻击,是一种ddos攻击的变体版本。一般来讲,它经过向服务器发送正常的请求,只不过请求的头或者请求体的内容特别长,发送速度有特别慢,这样每个链接占用的时间就会变得特别长,攻击者会在短期内持续不断的对服务器进行请求,很快便会耗尽服务端的资源,从而令服务端拒绝服务。浏览器
对HTTP服务而言,会有几种基本攻击方式:服务器
Slow headers:Web应用在处理HTTP请求以前都要先接收完全部的HTTP头部,Web服务器再没接收到2个连续的\r\n时,会认为客户端没有发送完头部,而持续的等等客户端发送数据,消耗服务器的链接和内存资源。并发
Slow body:攻击者发送一个HTTP POST请求,该请求的Content-Length头部值很大,使得Web服务器或代理认为客户端要发送很大的数据。服务器会保持链接准备接收数据,但攻击客户端每次只发送不多量的数据,使该链接一直保持存活,消耗服务器的链接和内存资源。优化
Slow read:客户端与服务器创建链接并发送了一个HTTP请求,客户端发送完整的请求给服务器端,而后一直保持这个链接,以很低的速度读取Response,好比很长一段时间客户端不读取任何数据,经过发送Zero Window到服务器,让服务器误觉得客户端很忙,直到链接快超时前才读取一个字节,以消耗服务器的链接和内存资源。spa
Nginx的优化配置
-
keepalive_timeout代理
Nginx 使用 keepalive_timeout 来指定 KeepAlive 的超时时间(timeout)。指定每一个 TCP 链接最多能够保持多长时间。Nginx 的默认值是 75 秒,有些浏览器最多只保持 60 秒,因此能够设定为 60 秒。若将它设置为 0,就禁止了 keepalive 链接。code
-
client_body_timeoutserver
指定客户端与服务端创建链接后发送 request body 的超时时间。若是客户端在指定时间内没有发送任何内容,Nginx 返回 HTTP 408(Request Timed Out)。内存
# 配置段: http, server, location
client_body_timeout 20s;
-
client_header_timeout资源
客户端向服务端发送一个完整的 request header 的超时时间。若是客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。
# 配置段: http, server, location
client_header_timeout 10s;
-
send_timeout
服务端向客户端传输数据的超时时间。
# 配置段: http, server, location
send_timeout 30s;
-
client_body_buffer_size
此指令设置用于请求主体的缓冲区大小。 若是主体超过缓冲区大小,则完整主体或其一部分将写入临时文件。 若是NGINX配置为使用文件而不是内存缓冲区,则该指令会被忽略。 默认状况下,该指令为32位系统设置一个8k缓冲区,为64位系统设置一个16k缓冲区。 该指令在NGINX配置的http,server和location区块使用。
-
client_max_body_size
此指令设置NGINX能处理的最大请求主体大小。 若是请求大于指定的大小,则NGINX发回HTTP 413(Request Entity too large)错误。 若是服务器处理大文件上传,则该指令很是重要。
默认状况下,该指令值为1m。 以下:
server{
client_max_body_size 2m;
}
其余的配置选项:
-
client_body_in_file_only
此指令禁用NGINX缓冲区并将请求体存储在临时文件中。 文件包含纯文本数据。 该指令在NGINX配置的http,server和location区块使用。 可选值有:
off:该值将禁用文件写入
clean:请求body将被写入文件。 该文件将在处理请求后删除。
on: 请求正文将被写入文件。 处理请求后,将不会删除该文件。
默认状况下,指令值为关闭。 以下:
http{
client_body_in_file_only clean;
}
-
client_body_in_single_buffer
该指令设置NGINX将完整的请求主体存储在单个缓冲区中。 默认状况下,指令值为off。 若是启用,它将优化读取$request_body变量时涉及的I/O操做。以下例子:
server{
client_body_in_single_buffer on;
}
-
client_body_temp_path
此指令指定存储请求正文的临时文件的位置。 除了位置以外,指令还能够指定文件是否须要最多三个级别的文件夹层次结构。 级别指定为用于生成文件夹的位数。
默认状况下,NGINX在NGINX安装路径下的client_body_temp文件夹建立临时文件。 以下例子:
server{
client_body_temp_pathtemp_files 1 2;
}
-
client_header_buffer_size
此指令与client_body_buffer_size相似。 它为请求头分配一个缓冲区。 若是请求头大小大于指定的缓冲区,则使用large_client_header_buffers指令分配更大的缓冲区。以下例子:
http{
client_header_buffer_size 1m;
}
-
large_client_header_buffers
此指令规定了用于读取大型客户端请求头的缓冲区的最大数量和大小。 这些缓冲区仅在缺省缓冲区不足时按需分配。 当处理请求或链接转换到保持活动状态时,释放缓冲区。以下例子:
http{
large_client_header_buffers 4 8k;
}