So verhindern Sie, dass bösartige DDos auf Nginx gecrawlt werden
黄舟
黄舟 2017-05-16 17:30:17
0
4
993

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

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

Antworte allen(4)
某草草

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里加入

[http-get-dos]
enabled = true
port = http,https
filter = nginx-bansniffer
logpath = /usr/local/nginx/logs/segmentfault.log
maxretry = 120
findtime = 120
bantime = 3600
action = iptables[name=HTTP, port=http, protocol=tcp]

然后找到/etc/fail2ban/filter.d/nginx-bansniffer.conf,把里面针对404的判断改成

[Definition]

failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

最后重启fail2ban服务即可,在上面的配置中,我们对每120秒有超过120次访问的ip,封禁1小时。

小葫芦

1. 根据User-Agent阻止spider抓取

## Block download agents ##
     if ($http_user_agent ~* WebZIP|wget) {
            return 403;
     }
##

2. 在操作系统Firewall建立规则,限制同一个IP的同时连接数
以Linux下的iptables为例,如下配置将限制同一个IP一分钟内最多建立15个连接,超出的连接会被iptables丢弃,不会到达nginx

/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
/sbin/iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60  --hitcount 15 -j DROP
service iptables save

3. 自己写个bash脚本统计各IP访问频率,自动将频率超过你设定的上限的IP扔到黑名单里
黑名单里的IP,用脚本自动写入iptables或者nginx.conf,封禁它几分钟,或者降低他的许可访问频率

我以前在yahoo的时候用一个叫YDoD(Yahoo! Department of Defense)的apache模块,可以自定义规则防止外部滥用我们的WEB服务,到了淘宝后改了个名字叫tdod,找了一圈,没找到开源的。不过原理跟我上面说得也差不多。

PHPzhong

试试ngx_lua_waf
https://github.com/loveshell/ngx_lua_waf
功能:

防止sql注入,本地包含,部分溢出,fuzzing测试,xss,SSRF等web攻击
防止svn/备份之类文件泄漏
防止ApacheBench之类压力测试工具的攻击
屏蔽常见的扫描黑客工具,扫描器
屏蔽异常的网络请求
屏蔽图片附件类目录php执行权限
防止webshell上传
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!