Nginx阻止DDoS攻击的教程收集(转)(待实践)
DDoS估计是一个非常头痛的问题。
分布式拒绝服务攻击(DDoS)指的是通过多台机器向一个服务或者网站发送大量看似合法的数据包使其网络阻塞、资源耗尽从而不能为正常用户提供正常服务的攻击手段。随着互联网带宽的增加和相关工具的不断发布,这种攻击的实施难度越来越低,有大量IDC托管机房、商业站点、游戏服务商一直饱受DDoS攻击的困扰,那么如何缓解甚至解决DDoS呢?最近Rick Nelson在Nginx的官方博客上发表了一篇文章,介绍了如何通过Nginx和Nginx Plus缓和DDoS攻击。
Rick Nelson首先介绍了DDoS攻击的一些特点,例如攻击的流量通常来源于一些固定的IP地址,每一个IP地址会创建比真实用户多得多的连接和请求;同时由于流量全部是由机器产生的,其速率要比人类用户高的多。此外,进行攻击的机器其User-Agent头也不是标准的值,Referer头有时也会被设置成能够与攻击关联起来的值。针对这些特点,Rick Nelson认为Nginx和Nginx Plus有很多能够通过调节或控制流量来应对或者减轻DDoS攻击的特性。
限制请求率
将Nginx和Nginx Plus可接受的入站请求率限制为某个适合真实用户的值。例如,通过下面的配置让一个真正的用户每两秒钟才能访问一次登录页面:
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; server {
...
location /login.html {
limit_req zone=one;
...
}
}
在该配置中,limit_req_zone
指令配置了一个名为one
的共享内存zone
用来存储$binary_remote_addr
的请求状态,location块中/login.html的limit_req
指令引用了共享内存zone
。
限制连接的数量
将某个客户端IP地址所能打开的连接数限制为真实用户的合理值。例如,限制每一个IP对网站/store部分打开的连接数不超过10个:
limit_conn_zone $binary_remote_addr zone=addr:10m; server {
...
location /store/ {
limit_conn addr ;
...
}
}
该配置中,limit_conn_zone
指令配置了一个名为addr
的共享内存zone
用来存储 $binary_remote_addr
的请求,location块中/store/的limit_conn
指令引用了共享内存zone
,并将最大连接数设置为10.
关闭慢连接
关闭那些一直保持打开同时写数据又特别频繁的连接,因为它们会降低服务器接受新连接的能力。Slowloris就是这种类型的攻击。对此,可以通过client_body_timeout
和client_header_timeout
指令控制请求体或者请求头的超时时间,例如,通过下面的配置将等待时间控制在5s之内:
server {
client_body_timeout 5s;
client_header_timeout 5s;
...
}
设置IP黑名单
如果能识别攻击者所使用的客户端IP地址,那么通过deny
指令将其屏蔽,让Nginx和Nginx Plus拒绝来自这些地址的连接或请求。例如,通过下面的指令拒绝来自123.123.123.3、123.123.123.5和123.123.123.7的请求:
location / {
deny 123.123.123.3;
deny 123.123.123.5;
deny 123.123.123.7;
...
}
设置IP白名单
如果允许访问的IP地址比较固定,那么通过allow
和deny
指令让网站或者应用程序只接受来自于某个IP地址或者某个IP地址段的请求。例如,通过下面的指令将访问限制为本地网络的一个IP段:
location / {
allow 192.168.1.0/;
deny all;
...
}
通过缓存削减流量峰值
通过启用缓存并设置某些缓存参数让Nginx和Nginx Plus吸收攻击所产生的大部分流量峰值。例如,通过proxy_cache_use_stale
指令的updating
参数告诉Nginx何时需要更新过期的缓存对象,避免因重复发送更新请求对后端服务器产生压力。另外,proxy_cache_key
指令定义的键通常会包含嵌入的变量,例如默认的键$scheme$proxy_host$request_uri
包含了三个变量,如果它包含$query_string
变量,那么攻击者可以通过发送随机的query_string
值来耗尽缓存,因此,如果没有特别原因,不要在该键中使用$query_string
变量。
阻塞请求
配置Nginx和Nginx Plus阻塞以下类型的请求:
- 以某个特定URL为目标的请求
- User-Agent头中的值不在正常客户端范围之内的请求
- Referer头中的值能够与攻击关联起来的请求
- 其他头中存在能够与攻击关联在一起的值的请求
例如,通过下面的配置阻塞以/foo.php为目标的攻击:
location /foo.php {
deny all;
}
或者通过下面的配置阻塞已识别出的User-Agent头的值是foo或者bar的DDoS攻击:
location / {
if ($http_user_agent ~* foo|bar) {
return ;
}
...
}
限制对后端服务器的连接数
通常Nginx和Nginx Plus实例能够处理比后端服务器多得多的连接数,因此可以通过Nginx Plus限制到每一个后端服务器的连接数。例如,通过下面的配置限制Nginx Plus和每一台后端服务器之间建立的连接数不多于200个:
upstream website {
server 192.168.100.1: max_conns=;
server 192.168.100.2: max_conns=;
queue timeout=30s;
}
另外,Rick Nelson还提到了如何处理基于范围的攻击和如何处理高负载的问题,以及如何使用Nginx Plus Status模块发现异常的流量模式,定位DDoS攻击。
题外:
其实DDoS这种话题用Nginx不一定能解决,应该在实战中随机应变才是对的,因为DDoS往往集中在网络的第四和第七层,而且又是借助全球的肉鸡不断的发起攻击,可以说是全球顶尖的分布式来袭。只有在实战中摸清来的套路,不断的去优化网络才是真的。且Nginx只能做到第七层上,对于第四层根本没办法防止,但是也不一定是没有用的。
所以,Nginx防DDoS没有绝对,只有合理的应对。
下面是收集的教程:
http://www.infoq.com/cn/news/2016/01/Nginx-AntiDDoS(以上内容转自此篇文章)
https://www.nginx.com/blog/mitigating-ddos-attacks-with-nginx-and-nginx-plus/
http://nginx.org/en/docs/http/ngx_http_status_module.html?_ga=1.187642144.967276342.1451228467
https://www.nginx.com/blog/tuning-nginx/?_ga=1.87178896.967276342.1451228467
https://www.nginx.com/blog/nginx-protect-cve-2015-1635/?_ga=1.144784956.967276342.1451228467
http://www.freebuf.com/articles/system/92907.html
http://www.52os.net/articles/nginx-anti-ddos-setting.html
https://www.52os.net/articles/nginx-anti-ddos-setting-2.html
https://www.zhihu.com/question/19581905
http://www.voidcn.com/article/p-cxeuhssk-vz.html
http://huli.logdown.com/posts/774229-the-battle-against-ddos-nginx-iptables-and-fail2ban
Nginx阻止DDoS攻击的教程收集(转)(待实践)的更多相关文章
- 通过Nginx和Nginx Plus阻止DDoS攻击
分布式拒绝服务攻击(DDoS)指的是通过多台机器向一个服务或者网站发送大量看似合法的数据包使其网络阻塞.资源耗尽从而不能为正常用户提供正常服务的攻击手段.随着互联网带宽的增加和相关工具的不断发布,这种 ...
- 如何使用Nginx对抗DDoS攻击?
时不时的就有客户会被DDoS一下.很多时候攻击很简单也容易封堵,但是攻击的目标是应用的时候就更难防御.在这里云端卫士介绍一下使用Nginx作为代理过滤器来封堵一些这种攻击. Apache DDoS攻击 ...
- 转:nginx防DDOS攻击的简单配置
文章来自于: 近期由于工作需要,做了些防DDOS攻击的研究,发现nginx本身就有这方面的模块ngx_http_limit_req_module和ngx_http_limit_conn_module. ...
- Spring Boot实现多个数据源教程收集(待实践)
先收集,后续实践. http://blog.csdn.net/catoop/article/details/50575038 http://blog.csdn.net/neosmith/article ...
- nginx防止DDOS攻击配置
转自:http://www.escorm.com/archives/452 防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈.DDOS的特点是分布式,针对带宽和服务攻击 ...
- nginx防止DDOS攻击
防御DDOS是一个系统工程,攻击花样多,防御的成本高瓶颈多,防御起来即被动又无奈.DDOS的特点是分布式,针对带宽和服务攻击,也就是四层流量攻击和七层应用攻击,相应的防御瓶颈四层在带宽,七层的多在架构 ...
- Mac 10.12高级防火墙pfctl教程收集(待实践)
在Mac 10.10之前使用ipfw.之后升级为pfctl.由于Mac自带的GUI防火墙只能针对软件进行放开,且无法针对特定端口入站及出站进行管理.所以使用pfctl能解决这类问题. 收集教程如下: ...
- MongoDB集群搭建教程收集(待实践)
先收集,后续再实践. MongoDB的集群应该和MySQL的定位保持一致,因为要认为它就是一个数据库. 集群方式有也是有很多,比如分库,分片,主从,主主等等. 下面是收集的一些教程: http://b ...
- Maven插件开发教程收集(待实践)
官方教程:http://maven.apache.org/plugin-developers/index.html http://blog.csdn.net/csfreebird/article/de ...
随机推荐
- 文件读写FILE类
1. 新建一个文件: FILE *f = fopen("a.txt","w+"); (1)fopen()函数介绍fopen的原型是:FILE *fopen(co ...
- 什么是php?php的优缺点有哪些?与其它编程语言的优缺点?
身为一个PHP开发者,有必要了解一下PHP的缺点,知道每种语言的优点和缺点,才能知道某种语言在什么场景下适合使用,在什么场景下不适合使用. 这个问题我曾经面试的时候遇到过,我之前没总结过,第一问大部分 ...
- I2C驱动框架(一)
参考:I2C子系统之内核中I2C子系统的结构 结合vmlinux.lds和Makefile可确定i2c初始化函数的执行顺序如下: 1./dricer/i2c/i2c-core.c中的函数:i2c_in ...
- LIN总线协议
汽车电子类的IC有的采用LIN协议来烧录内部NVM,如英飞凌的TLE8880N和博世的CR665D. LIN总线帧格式如下,一个LIN信息帧有同步间隔.同步域.标示符域(PID域).数据域.校验码域. ...
- Codeforces Round #877 (Div. 2) E. Danil and a Part-time Job
E. Danil and a Part-time Job 题目链接:http://codeforces.com/contest/877/problem/E time limit per test2 s ...
- Jmeter下载安装配置
一,进入官网:http://jmeter.apache.org/ 1.第一步进入官网如下图 2.选择进行下载,下载下来为一个压缩包,解压即可. 3.我下载的是jmeter4.0版本,对应jdk1.8. ...
- Linux下dpkg的用法
转自:http://blog.csdn.net/fireblue1990/article/details/52627952 dpkg是一个Debian的一个命令行工具,它可以用来安装.删除.构建和管理 ...
- 【Kubernetes】离线业务:Job与CronJob
Deployment.StatefulSet和DaemonSet这三个编排概念编排的对象主要都是在线业务(Long Running Task,这些应用一旦运行起来,除非出错或者停止,它的容器进程会一直 ...
- nginx的报错500
500:服务器内部错误,也就是服务器遇到意外情况,而无法履行请求. 500错误一般有几种情况: 1. web脚本错误,如php语法错误,lua语法错误等. 2. 访问量大的时候,由于系统资源限制,而不 ...
- shell的until循环
until 循环执行一系列命令直至条件为 true 时停止.until 循环与 while 循环在处理方式上刚好相反.一般while循环优于until循环,但在某些时候,也只是极少数情况下,until ...