nginx设置抵御千万级别的DDos攻击

春节之前公司某个站点的nignx记录日志异常多,这是不让人好好过年的节奏啊!

0.161 - IP:xxx.xxx.xxx.xxx - [01/Feb/2017:15:25:18 +0800] GET /index/server/p/176 HTTP/1.1 - 200 - Mozilla/5.0 (compatible; MSIE 9.0; qdesk 2.4.1272.203; Windows NT 6.1; WOW64; Trident/5.0)  - from:http://mydomain.com/index/server

0.120 - IP:xxx.xxx.xxx.xxx - [06/Feb/2017:00:00:05 +0800] GET /index/server/p/199 HTTP/1.1 - 200 - Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0 - from:http://mydomain.com/index/server

异常的请求记录,这个http://mydomain.com/index/server/p/176请求的这个页面是分页,需要请求数据库虽然对服务器影响没有立马表现出现,但是不能不重视,万一哪天....    并且查看日志行数wc -l 请求记录在千万级别

解决思路:

1.攻击的IP不是固定,使用shell脚本判断IP然后加入iptables,这个容易误杀,且服务器节点都需要部署较麻烦。
2.使用nginx 的 deny 91.212.45.0/24,可以使用,但是也很麻烦,如果攻击者改变ip。
3.查看日志规律,从访问日志入手  

解决办法:

a.http_referer为空,则返回禁止访问;

if ($http_referer ~ ^$){
                        return 403;                        
                }

b.http_referer不是本站的来源则禁止访问:

if ($http_referer !~* mydomain) {
                        return 403;                          
                }

到过几天了,攻击者增加了http_referer,并且改变了agent
c.agent如果有wget、curl、qdesk等关键字就禁止访问

if ($http_user_agent ~* (wget|curl|qdesk) ) {
                        return 403;
                } 

整个nginx的设置:

#防止刷http://*.mydomain.com/index/server/p/*
location /index/server/p/ {
                if ($http_referer ~ ^$){
                        return 403;                        
                }
                if ($http_referer !~* mydomain) {
                        rewrite ^/(.*)$ http://127.0.0.1/ redirect;                       
                }
                if ($http_user_agent ~* (wget|curl|qdesk) ) {
                        return 403;
                }                

        }

增加规则之后查看日志:

0.000 - IP:xxx.xxx.xxx.xxx - [10/Feb/2017:15:55:20 +0800] GET /index/server/p/180 HTTP/1.1 - 403 - Mozilla/5.0 (compatible; MSIE 9.0; qdesk 2.4.1272.203; Windows NT 6.1; WOW64; Trident/5.0) - www.mydomain.com - from:http://mydomain.com/index/server

世界安静了!

未经允许不得转载:好玩吧 » nginx设置抵御千万级别的DDos攻击