Advertisement

关于nginx防御DDOS攻击浅谈

阅读量:

来源:www.weidianyuedu.com/

防御DDOS是一项系统性的工作,在面对多变的攻击手段时需要耗费高昂的人力物力资源,并且往往事倍功半。DDOS攻击的特点是利用网络中的分布式特征针对带宽和服务资源发起攻击,在传输层面上表现为四层流量攻击,在应用层面则表现为七层流量攻击。其中四层集中在带宽资源受限的部分,在架构设计上则主要影响系统的吞吐量指标。对于七层的应用层面DDOS攻击我们可以通过特定配置加以应对:其中前端通常采用Nginx服务器,并利用ngx_http_limit_conn_module限制单个IP的连接数量,在此基础之上再利用ngx_http_limit_req_module进一步限制单个IP每秒请求的数量。这样通过严格控制连接数和请求频率就能相对稳健地抵御CCP(连续请求)类型的DDoS攻击威胁。以下是具体的配置实现步骤:

一. 限制每秒请求数

ngx_http_limit_req_module模块采用漏桶机制来限定每个时间段内的请求数量;当请求次数超过设定上限时会触发HTTP 503错误响应;同时配置参数需要在两个位置进行设置:包括API入口处的流量控制策略以及监控中心的监控规则设置两部分

nginx.conf的http段内定义触发条件,可以有多个条件

在location内定义达到触发条件时nginx所要执行的动作

例如:

1

2

3

4

5

6

7

8

9

10

11

http {

limit_req_zone $binary_remote_addr region=one:10m rate=10r/s; //确保每个访问IP在单位时间内最多接收十个请求

...

server {

...

location ~ .php$ {

limit_req zone=one burst=5 nodelay; //执行的动作,通过zone名字对应

}

}

}

参数说明:

1

2

3

4

5

6

$binary_remote_addr 二进制远程地址

将zone命名为"one"并为其分配10M内存用于存储二进制远程地址;每1m内存可存储约16,000个会话

rate=10r/s; 限制频率为每秒10个请求

burst=5被允许超过频率限制的请求数量不超过5个。如果每秒请求数在1至4秒内分别为9、9、9、9,则在第5秒最多可接收15个请求而不触发超限;反之,在第一秒内的请求数达到15时,则会将前五个请求延迟到第二秒;若第二秒内出现超出该阈值(例如超过10)的情况,则会触发故障响应机制:超出该阈值将导致...'s request limit to be enforced in accordance with the defined policy.

nodelay 超过的请求不被延迟处理,设置后15个请求在1秒内处理。

二.限制IP连接数

ngx_http_limit_conn_module的设置方式和设置项与http_limit_req模块类似,在设置项较少的情况下相对简便

1

2

3

4

5

6

7

8

9

10

11

http {

limit_conn_zone $binary_remote_addr zone=addr:10m; //触发条件

...

server {

...

location /download/ {

limit_conn addr 1; // 限制同一时间内1个连接,超出的连接返回503

}

}

}

三.白名单设置

这两个模块负责控制单IP地址单位时间内的并发请求数量。然而,在位于Nginx之前的服务器上部署了LVS(Load Virtual Server)或haproxy等负载均衡器或反向代理服务器时,则需要特别注意配置问题。这些连接或请求均源自于该负载均衡层,在这种情况下不应限制来自该层的连接数量与请求频率;此时应避免对负载均衡层的连接和请求进行限制,并通过geo和map 模块设置白名单来实现相应的流量管理功能:

1

2

3

4

5

6

7

8

9

10

11

geo $whiteiplist {

default 1;

10.11.15.161 0;

}

map whiteiplist limit {

1 $binary_remote_addr;

0 "";

}

limit_req_zone $limit zone=one:10m rate=10r/s;

limit_conn_zone $limit zone=addr:10m;

该geo模块将whiteiplist变量初始设置为1。当输入的IP地址位于白名单内时,其值将设为0;否则则设为1。

若IP地址存在于白名单中,则当whiteiplist字段值为0时,系统将不会将内容存储到名为10M的会话状态中的任一记录(如'one'或'addr');此类情况无限制。

如果不在白名单中,则whiteiplist=1,并且$limit设置为二进制远程地址;数据被存储到一个最大容量为10m的会话状态中;来自外部的数据接收受到限制。

四.测试

通过使用ab命令进行CC攻击模拟,在实际操作中应分别对http_limit_conn和http_limit_req模块进行测试。特别注意的是,在此过程中只有那些已完全读取头信息且仍在处理中的请求才会触发对http_limit_conn模块的计数。若请求已全部处理完毕且尚未关闭该连接,则该情况不会触发计数。此时通过netstat检查发现,在这种情况下即使超出限制也会有相应的机制防止超限行为的发生。

1

2

ab -n 请求数 -c 并发 http://10.11.15.174/i.php

当请求从客户端被拒绝时返回的HTTP状态码为503时,在Nginx服务器的日志记录系统中将生成相应的错误日志记录

被限制连接数:

1

2

日****时刻记录下错误信息:第号请求尝试通过IP地址"addr"限制连接数量;请求路径为/GI.PHPE9568F35-D428--A769-*****/?参数包含PHPE9568F35-D428--A769-*****, 来源地址为"addr";目标服务器IP地址为"target IP", 引用来源链接位于"http://target IP/i.php"

被限制请求数:

1

2

2015年一月二十八日 一十四时一十八分五十九秒 [错误日志] 第四零九六号请求 [请求数量超出限制] 在地理区域 "one" 发送至客户端 IP 地址 一零点一一点一五点一六一秒处无服务器响应请通过以下路径访问该条目 /i.php?=PHPE9568F34-D428-¹¹d²-A769-⁰⁰AA⁰⁰¹ACF⁴² 来自 IP 地址 一零点一一点一五点一七四的链接

五.其它一些防CC的方法

1.Nginx模块 ModSecurity、http_guard、ngx_lua_waf

ModSecurity 应用层WAF,功能强大,能防御的攻击多,配置复杂

ngx_lua_waf 基于ngx_lua的web应用防火墙,使用简单,高性能和轻量级

http_guard 基于openresty

2.软件+Iptables

fail2ban 通过分析日志来判断是否使用iptables拦截

DDoS Deflate 通过netstat判断ip连接数,并使用iptables屏蔽

在讨论中提到抗DDoS是一个系统工程,在网络安全领域是一项复杂的系统性工作,在这种情况下我们通常会采取一些措施来应对持续性分布式拒绝服务(DDoS)攻击但受限于现有技术与资源限制这种方法往往只能有效抵御较低强度的持续性分布式拒绝服务(DDoS)攻击面对大规模DDoS攻击四层流量DDoS等更为复杂的威胁时现有的防护措施已经无法发挥应有的效果因为这些系统的运行状态并未受到影响而网络带宽被完全占用

高端防护型服务器以及具备流量清洗功能的ISP多为美韩厂商提供。某些主要供应商提供流量清洗服务,例如香港的PCCW公司。一般情况下能够抵御约10G至20G的数据包 monthly 的小规模攻击。

我们最高承受了80G的数据流量攻击,并成功进行了清洗处理。然而这些处理的成本都非常高。

例如常见的CDN服务商包括蓝讯科技、网宿科技以及Cloudflare等企业。这些CDN服务商针对DDoS攻击的特性设计了分发策略:通过流量分发策略将访问流量分散至多个服务器节点以提高安全性;同时为网站提供加速服务,并具有良好的性能表现且运营成本较低的特点。

总结一下:发动攻击易,防御难。七层好防,四层难防;小型能防,大型烧钱

微点阅读 - 范文大全 - 免费学习网站

http://m.weidianyuedu.com/

————————————————

全部评论 (0)

还没有任何评论哟~