Zuallererst habe ich nichts dagegen, dass andere den Inhalt meiner Website crawlen. Ich schränke das Crawlen anderer Leute nicht unbedingt ein, aber das Crawlen einiger Leute hat überhaupt keinen Sinn. Sie verwenden ein Skript oder sogar mehrere Skripte zum Crawlen Der Inhalt eines Servers unterscheidet sich nicht von DDoS.
Auf meinem Server kommt es derzeit zu einer solchen Situation. Böswilliges Crawlen ohne Pause hat unsere Protokollanalyse erheblich beeinträchtigt und auch die Belastung des Servers erhöht.
Wie kann man ein solches Verhalten verhindern? Ich verwende einen Nginx-Server, der nur eine bestimmte IP verwenden kann, aber „deny“ wird auch in Zukunft im Protokoll erscheinen, aber es wird 403 sein. Darüber hinaus ist die manuelle Ablehnung zu passiv. Können Sie intelligent feststellen, dass die Anzahl der Besuche auf einer bestimmten IP stark zugenommen hat, und diese dann verbieten?deny
1. ngx_http_limit_conn_module 可以用来限制单个IP的连接数
http://nginx.org/en/docs/http/ngx_htt...
2. ngx_http_limit_req_module 可以用来限制单个IP每秒请求数
http://nginx.org/en/docs/http/ngx_htt...
3. nginx_limit_speed_module 可以用来对IP限速
https://github.com/yaoweibin/nginx_li...
我也来提供一种解决思路,主要是利用fail2ban(http://www.fail2ban.org/)来解决。fail2ban是通过扫描log来异步判断是否用iptable封禁的,所以对原系统影响比较小,而且不需要重新配置nginx。不过不知道访问量太大是否撑得住。
首先在
/etc/fail2ban/jail.conf
里加入然后找到
/etc/fail2ban/filter.d/nginx-bansniffer.conf
,把里面针对404的判断改成最后重启
fail2ban
服务即可,在上面的配置中,我们对每120秒有超过120次访问的ip,封禁1小时。1. 根据User-Agent阻止spider抓取
2. 在操作系统Firewall建立规则,限制同一个IP的同时连接数
以Linux下的iptables为例,如下配置将限制同一个IP一分钟内最多建立15个连接,超出的连接会被iptables丢弃,不会到达nginx
3. 自己写个bash脚本统计各IP访问频率,自动将频率超过你设定的上限的IP扔到黑名单里
黑名单里的IP,用脚本自动写入iptables或者nginx.conf,封禁它几分钟,或者降低他的许可访问频率
我以前在yahoo的时候用一个叫YDoD(Yahoo! Department of Defense)的apache模块,可以自定义规则防止外部滥用我们的WEB服务,到了淘宝后改了个名字叫tdod,找了一圈,没找到开源的。不过原理跟我上面说得也差不多。
试试ngx_lua_waf
https://github.com/loveshell/ngx_lua_waf
功能: