在WordPress wp上,阻止暴力攻击

・4 分钟阅读

昨晚,我们托管网络中的一个站点受到攻击。

以下配置成功地使用Nginx Limit Req Module 成功地解决了暴力攻击。

Nginx设置

全局设置

http{..}块下的/etc/nginx/nginx.conf文件中,添加以下内容,

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

10m的区域大小,1MB可以保存16000状态,我想这意味着16000个唯一的IP地址,如果你有太多网站或流量非常高的站点,你可能希望将它增加到20MB或100MB 。

1r/s表示允许每秒1个请求,

每个站点设置

你可以向服务器{..}块添加如下内容:

location = /wp-login.php {
 limit_req zone=one burst=1 nodelay;
 include fastcgi_params;
 fastcgi_pass 127.0.0.1:9000;
}

或者

location ~ .php$ {
 location ~* wp-login.php {
 limit_req zone=one burst=1 nodelay;
 include fastcgi_params;
 fastcgi_pass 127.0.0.1:9000;
 }
 #other rules
}

nodelay确保超过请求限制后,返回HTTP状态代码503 (服务不可用)。

其他更改

如果要返回444 (推荐)或其他代码在http {..}块中使用全局效果,或者使用location {..}块进行局部效果:

limit_req_status 444;

你可以使用error_page指令来设置自定义错误页面。

测试

日志

使用以下命令监视日志。 如果使用limit_req_status则将503替换为任何其他错误代码

tail -f /var/www/example.com/logs/*.log | egrep "login|503"

如果你的站点已经受到攻击,你将看到如下所示的行:

2013/08/23 04:17:03 [error] 256554#0: *99927 limiting requests, excess: 1.852 by zone "one", client: 1.2.3.4, server: example.com, request: "GET /wp-login.php HTTP/1.0", host: "exmaple.com"

1.2.3.4是被阻止的IP 。

模拟攻击

你可以使用apache-bench来攻击服务器:

ab -n 100 -c 10 example.com/wp-login.php

其他备注

白名单IP地址

对于本文中的wp-login示例,您不需要白名单,因为真正的人类无法随时向wp-login.php发送多个请求。

但是,出于其他目的,您可能需要将IP地址列入白名单。

http{..}块下的/etc/nginx/nginx.conf文件中,添加如下所示的map{..}块:

map $remote_addr $rt_filtered_ip {
 default $binary_remote_addr;
 1.2.3.4 "";
 4.4.4.4 "";
}

1.2.3.4和4.4.4.4是白名单的示例IP 你可以有任意数量,在单独的行上添加每个IP ,请确保在每个IP中都使用了 "" ,速率限制模块忽略空值。

那么你需要使用变量$rt_filtered_ip

limit_req_zone $rt_filtered_ip zone=one:10m rate=1r/s;

如果你想覆盖某一范围的IP,那么上述简单方法可能无法工作,你需要为它 geo模块 。

geo $rt_filtered_ip {
 default $binary_remote_addr;
 127.0.0.1 "";
 192.168.1.0/24 "";
 10.1.0.0/16 "";
 ::1 "";
 2001:0db8::/32 "";
 1.2.3.4 ""
}

重要:我们还没有测试geo模块示例,所以你得自己承担风险。

Zhongy0410 profile image