通过监控Nginx日志来实时屏蔽高频恶意访问的IP

 

目前在我的VPS上主要通过两种方式来限制ip的访问次数。

  • 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数
  • 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚本)

一、limit_req配置

Nginx 提供了两个模块:ngx_http_limit_req_module 和 ngx_http_limit_conn_module,前者是限制同一ip在一段时间内的访问总次数,后者是限制同一ip的并发请求次数。

我的配置主要如下:

http {
limit_req_zone $binary_remote_addr zone=onelimit:10m rate=20r/m; server {
...
location / {
limit_req zone=onelimit burst=5 nodelay;
limit_req_log_level warn;
}
}
}

$binary_remote_addr 根据客户端ip作为键值,zone设置唯一标识并设置存储内存大小,每分钟请求不超过20次,否则返回503错误。
burst=5 表示如果超过频率限制后可缓冲的等待请求数。nodelay表示burst部分不需要等待,nginx会直接处理等待部分的请求。
limit_req_log_level warn 将匹配到的拦截请求日志等级设置为warn级别。

看下日志内容:

2019/03/31 17:57:32 [warn] 9672#9672: *431036 limiting requests, excess: 5.695 by zone "onelimit", client: 183.210.197.101, server: yun.xxx.com, request: "GET /download/ring/b649b722df3c4c86d405d8deb272a59b.mp3 HTTP/1.1", host: "yun.xxx.com", referrer: "http://m.xxx.com/id/61610.html"
2019/03/31 17:57:39 [warn] 9672#9672: *431038 limiting requests, excess: 5.267 by zone "onelimit", client: 183.210.197.101, server: yun.xxx.com, request: "GET /download/ring/b649b722df3c4c86d405d8deb272a59b.mp3 HTTP/1.1", host: "yun.xxx.com", referrer: "http://m.xxx.com/id/61610.html"

二、Nginx deny配置及监控脚本实现

limit_req 模块不足的地方在于它只能控制瞬时请求的次数,每秒的请求数 (r/s) 或 每分钟的请求数 (r/m)。这对于恶意访问来源能比较容易的通过控制访问频率来绕过这个检测,这种情况下我主要通过deny配置来直接禁止一天内超过指定次数的ip来源(比如一天访问次数超过100次直接返回403)。设置步骤如下:

1. 创建blocksip.conf

在nginx.conf同级目录下创建文件blocksip.conf,在http节点增加以下配置(也可以设置在server节点对单个网站起作用,或location节点只针对特定访问路径的限制)

include blocksip.conf;

可以在blocksip.conf文件中添加一条测试记录,如服务器ip

deny 127.0.0.1;

然后重新加载nginx,nginx -s reload,测试下是否生效。

2. 编写监控脚本,定时更新blocksip.conf文件

根据nginx请求日志来计算出各ip的top访问次数,根据访问次数将符合条件的ip加入到blocksip.conf文件中,然后重新加载nginx使配置生效即可。

PHP脚本blocksip.php:

<?php
$blockFile = "/etc/nginx/blocksip.conf";
$logs = ["/var/log/nginx/access-site1.log", "/var/log/nginx/access-site2.log"];
$blocks = file_get_contents($blockFile);
$n = 0;
foreach($logs as $log) {
$data = shell_exec("cat $log | awk -F ' ' '{print $1}'| sort | uniq -c | sort -n -r | head -n 20");
$lines = explode("\n", $data); foreach($lines as $line) {
$line = trim($line);
if (empty($line)) continue;
$line = explode(" ", $line);
list($num, $ip) = $line; if ($num > 100) {
if (!stristr($blocks, $ip)) {
var_dump("[".date("Y-m-d H:i:s")."] New Match $ip");
$newBlock = "deny {$ip};" . PHP_EOL;
file_put_contents($blockFile, $newBlock, FILE_APPEND);
$n++;
} else {
var_dump("Blocked > $ip > $num");
}
}
}
} if($n > 0) {
$r = shell_exec("nginx -s reload");
var_dump("nginx -s reload", $r);
}

3. 将监控脚本放入crontab定时执行

每十分钟执行一次

*/10 * * * * /usr/bin/php /etc/nginx/blocksip.php >> /tmp/blocksip.log;

看下拦截日志内容:

2019/03/31 17:57:26 [error] 9672#9672: *431024 access forbidden by rule, client: 59.80.44.46, server: yun.xxx.com, request: "GET /music/979744fb8eb9055f77f3db2a3f3189a8.mp3 HTTP/1.1", host: "yun.xxx.com"
2019/03/31 17:57:34 [error] 9672#9672: *431037 access forbidden by rule, client: 59.80.44.46, server: yun.xxx.com, request: "GET /music/979744fb8eb9055f77f3db2a3f3189a8.mp3 HTTP/1.1", host: "yun.xxx.com"

OK, 搞定!

转载:通过监控Nginx日志来实时屏蔽高频恶意访问的IP的更多相关文章

  1. 通过监控Nginx日志来实时屏蔽高频恶意访问的IP

    目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚 ...

  2. zabbix监控nginx日志状态码

    监控需求 监控Nginx常见的状态码并对其进行监控,对常见的错误状态码创建相对应的触发器以下按照分钟对数据进行抓取 Zabbix_Agentd创建监控脚本 1)创建脚本之前核对Nginx日志格式我这里 ...

  3. 使用ELK监控Nginx日志实现接口流量访问统计

    前段时间自己看书学习了一下elasticSearch,后面自己实践了使用elasticSearch.logStash.kibana搭建一个网站接口流量访问统计的监控看板.在这里做一些记录学习. 先看一 ...

  4. PHP实现简单的监控nginx日志文件功能

    此功能是为了实现,定时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比如大数据的接口,让大数据来进行分析) define("MAX_SHOW", 8192*5); / ...

  5. Grafana和influxdb监控nginx日志中的请求响应时间图形化监控

    监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...

  6. ELK整合Filebeat监控nginx日志

    ELK 日志分析 1. 为什么用到 ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep. awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如 ...

  7. ELK监控nginx日志总结

    ELK介绍 ELK即ElasticSearch + Logstash + kibana ES:作为存储引擎 Logstash:用来采集日志 Kibana可以将ES中的数据进行可视化,可以进行数据分析中 ...

  8. nginx日志分析及其统计PV、UV、IP

    一.nginx日志结构 nginx中access.log 的日志结构: $remote_addr 客户端地址 211.28.65.253 $remote_user 客户端用户名称 -- $time_l ...

  9. 一个小工具帮你搞定实时监控Nginx服务器

    Linux运维工程师的首要职责就是保证业务7 x 24小时稳定的运行,监控Web服务器对于查看网站上发生的情况至关重要.关注最多的便是日志变动,查看实时日志文件变动大家第一反应应该是'tail -f ...

随机推荐

  1. Java练习 SDUT-1689_斐波那契?

    斐波那契? Time Limit: 1000 ms Memory Limit: 32768 KiB Problem Description 给出一个数列的递推公式,希望你能计算出该数列的第N个数.递推 ...

  2. 20-2 orm分组和聚合以及在项目中执行的一些方法

    一  orm分组和聚合 参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 1 表结构: # 第一张表 class Employee1(models ...

  3. @bzoj - 3836@ [Poi2014]Tourism

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个n个点,m条边的无向图,其中你在第i个点建立旅游站点的费 ...

  4. 学习canvas画布

    我们可以用画布(Canvas)绘制各种图形,下面代码是绘制的一个圆形: <!DOCTYPE html> <html> <head> <title>Can ...

  5. Top 10 open source projects of 2015

    Top 10 open source projects of 2015 Posted 15 Dec 2015Jen Wike Huger (Red Hat)Feed 188 up 31 comment ...

  6. CSS画矩形、圆、半圆、弧形、半圆、小三角、疑问框

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. java 两种进程创建方式比较

    A extends Thread: 简单 不能再继承其他类了(Java单继承) 同份资源不共享 A implements Runnable:(推荐) 多个线程共享一个目标资源,适合多线程处理同一份资源 ...

  8. phpStudy中升级MySQL版本到5.7.17的方法步骤

    http://www.jb51.net/article/120263.htm 前言 今天在工作发现一个错误,在往本地导数据表的时候老是报错: ? 1 [Err] 1294 - Invalid ON U ...

  9. 5-1rquests模拟登陆知乎之httpcode

    1,状态码: 400错误:请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里 2,requests库:python常用的库,有空仔细阅读一下官方文档

  10. Mockito 使用

    1. 算术测试类 package com.smart.test.mockito; public interface Calculator { public int add(int a, int b); ...