awk '{print \$1}' nginx_access.log |sort |uniq -c|sort -n
nginx.access.log 为nginx访问日志文件所在路径
会到如下结果,前面是ip的访问次数,后面是ip,很明显我们需要把访问次数多的ip并且不是蜘蛛的ip屏蔽掉,如下面结果,
若 66.249.79.84 不为蜘蛛则需要屏蔽:
89 106.75.133.167
90 118.123.114.57
91 101.78.0.210
92 116.113.124.59
92 119.90.24.73
92 124.119.87.204
119 173.242.117.145
4320 66.249.79.84
Nginx的deny
和allow
指令是由ngx_http_access_module模块提供,Nginx安装默认内置了该模块。
在nginx中,allow和deny的规则是按顺序执行的。
示例1:
location /
{
allow 192.168.0.0/24;
allow 127.0.0.1;
deny all;
}
说明:这段配置只允许192.168.0.0/24网段和127.0.0.1的请求,其他来源IP全部拒绝。
示例2:
location ~ "admin"
{
allow 192.168.30.7;
deny all
}
说明:访问的uri中包含admin的请求,只允许192.168.30.7这个IP的请求。
在nginx的安装目录下面,新建屏蔽ip文件,命名为 /usr/local/nginx/conf/deny_ip/{项目名}_deny_ip.conf
,以后新增加屏蔽ip只需编辑这个文件即可。
加入如下内容并保存:
deny 66.249.79.84 ;
在nginx的配置文件nginx.conf中加入如下配置,可以放到http, server, location, limit_except语句块,需要注意相对路径,本例当中nginx.conf,guolv_ip.conf在同一个目录中。
include deny_ip/{项目名}_deny_ip.conf ;
保存nginx.conf文件,然后测试现在的nginx配置文件是否是合法的:
nginx -t
如果配置没有问题,就会输出:
the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
configuration file /usr/local/nginx/conf/nginx.conf test is successful
如果配置有问题就需要检查下哪儿有语法问题,如果没有问题,需要执行下面命令,重载 nginx 配置文件:
service nginx reload
3、注意:
屏蔽ip的配置文件既可以屏蔽单个ip,也可以屏蔽ip段,或者只允许某个ip或者某个ip段访问。
//屏蔽单个ip访问
deny IP;
//允许单个ip访问
allow IP;
//屏蔽所有ip访问
deny all;
//允许所有ip访问
allow all;
//屏蔽整个段即从123.0.0.1到123.255.255.254访问的命令
deny 123.0.0.0/8
//屏蔽IP段即从123.45.0.1到123.45.255.254访问的命令
deny 124.45.0.0/16
//屏蔽IP段即从123.45.6.1到123.45.6.254访问的命令
deny 123.45.6.0/24
//如果你想实现这样的应用,除了几个IP外,其他全部拒绝,
//那需要你在guolv_ip.conf中这样写
allow 1.1.1.1;
allow 1.1.1.2;
deny all;
单独网站屏蔽IP的方法,把include deny_ip/{项目名}_deny_ip.conf ; 放到网址对应的在server{}语句块,
所有网站屏蔽IP的方法,把include deny_ip/deny_ip.conf ; 放到http {}语句块。
以 PHP 脚本为例
try {
# IP请求频率限制数
$ipLimit = 200;
$log = '/alidata/log/nginx/test.log';
$time = date('H:i:', strtotime('-1 minute'));
$shell = "/usr/bin/tail -n 20000 " . $log . " | grep -v 'play.html' | /usr/bin/awk '/" . $time . "/ {print $1}' | /usr/bin/sort | " .
"/usr/bin/uniq -c | /usr/bin/sort -n | /usr/bin/awk '$1 >= " . $ipLimit . " {print $0}'";
$ipList = shell_exec($shell);
$ipList = explode(PHP_EOL, $ipList);
$data = [];
foreach ($ipList as $value) {
if (!empty(trim($value))) {
$data[] = trim($value);
}
}
if (!empty($data)) {
# 发送报警
dp($data);
}
# 收到报警后去检查ip,若确定这个ip是攻击ip,将其加到nginx封禁ip配置中
# sudo vim /usr/local/nginx/conf/deny_ip/{项目}_deny_ip.conf
# deny {ip};
} catch (\Throwable $e) {
dp($e->getMessage());
dp($e->getTraceAsString());
}
参考:http://www.nginx.cn/2487.html
[1]
http://www.nginx.cn/2487.html: http://www.nginx.cn/2487.html