春节之前公司某个站点的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
世界安静了!