nginx通过配置防止DDoS攻击
什么是DDoS攻击
DDoS攻击是Distributed Denial of Service的缩写,翻译成中文就是分布式拒绝服务。即不法黑客组织通过控制服务器等资源,发动对包括国家骨干网络、重要网络设施、政企或个人网站在内的互联网上任一目标的攻击,致使目标服务器断网,最终停止提供服务。
举个栗子,我开了一家店生意很好,隔壁邻居看不下去了叫他的七大姑八大姨每天都到我的店里来占着位置却不买东西,这样我的生意自然就不行了。也就是攻击者利用“肉鸡”对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。在线游戏、互联网金融等领域是 DDoS 攻击的高发行业。
如何应对DDoS攻击
防止DDoS攻击有很多种方法,比如使用高防服务器、CDN加速、DDoS清洗等。但是由于经费的限制,我们整不起那些个高大上的玩意,所以只能在我们现有的材料上加工加工来达到应对DDoS攻击的目的。
nginx防止DDoS攻击
限制每秒的请求数
ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制就会返回503错误。
在nginx.conf中新增如下配置:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=100r/s; //触发条件,所有访问ip 限制每秒10个请求
...
server {
...
location ~ \.php$ {
limit_req zone=one burst=5 nodelay; //执行的动作,通过zone名字对应
}
}
}
以上配置用到的一些参数:
参数 | 含义 |
---|---|
$binary_remote_addr | 二进制远程地址 |
zone=one:10m | 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话 |
rate=100r/s | 限制频率为每秒100个请求 |
burst=5 | 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。 |
nodelay | 超过的请求不被延迟处理,设置后15个请求在1秒内处理。 |
由于使用的是漏桶原理,所以其实这个配置不止能用来防止DDoS攻击,还能用作服务器的限流。
限制单个IP的连接数
ngx_http_limit_conn_module模块可以用来限制单个IP的连接数,配置如下:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; //触发条件
...
server {
...
location /download/ {
limit_conn addr 2; // 限制同一时间内2个连接,超出的连接返回503
}
}
}
通过简单的配置使我们的服务能够过滤掉一些DDoS攻击,但是在专业的黑客面前这些确实都只能算是小菜,想要真正提高服务器的抗压能力,还是得使用专业的工具。