通过监控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 = "/usr/local/etc/nginx/blocksip.conf";
$logs = ["/usr/local/var/log/nginx/access-site1.log", "/usr/local/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. ELK集群部署(八)之监控nginx日志

    监控nginx日志 103上安装nginx yum install -y nginx启动nginx systemctl start nginx访问 http://192.168.56.103/ 配置n ...

  2. php 监控nginx日志文件,Nginx 日志分析及实时监控

    本文档以 Nginx 日志为例,介绍如何使用日志分析服务来分析 Nginx 日志中的各种指标. 许多个人站长选取了 Nginx 作为服务器搭建网站,在对网站访问情况进行分析时,需要对 Nginx 访问 ...

  3. php 监控nginx日志,nginx启用status监控服务器状态的方法详解

    nginx和php-fpm一样内建了一个状态页,对于想了解nginx的状态以及监控nginx非常有帮助. 在Nginx中的stub_status模块主要用于查看Nginx的一些状态信息.本模块默认是不 ...

  4. ELK 6下日志平台监控Nginx日志构建实践

    整体架构 整体架构主要分为 4 个模块,分别提供不同的功能 Filebeat:轻量级数据收集引擎.基于原先 Logstash-fowarder 的源码改造出来.换句话说:Filebeat就是新版的 L ...

  5. grafana监控nginx日志

    先展示下grafana 的一张大图. 看图还是比较炫酷的,那怎么才能够展示这样的大屏,咱们一步一步拆解 用到组件:nginx ,filebeat,logstash,elasticsearch,graf ...

  6. Zabbix4.4 技术解决方案(实战篇) 监控 Nginx 日志 统计WEB网站PV和UV

    PV(Page View)访问量, 即页面浏览量或点击量,衡量网站用户访问的网页数量:在一定统计周期内用户每打开或刷新一个页面就记录1次,多次打开或刷新同一页面则浏览量累计. UV (unique v ...

  7. 【lnmp+ELK+Nginx+GeoIP】超详细新版ELK8.5.0解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版

    超详细新版ELK8.5.0+lnmp1.9解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版 前言 1.基础环境和所需要的软件包 1.1服务器配置(仅供参考) 1.2 ...

  8. 部署filebeat收集nginx日志

    搭建filebeat自动发现日志 在上一篇博客我们部署了logstash去读取日志,但是logstash需要消耗的资源较大.在每台客户端安装logstash不现实. Filebeat是一个轻量级的日志 ...

  9. ELK 收集 Nginx 日志

    01 安装 Nginx 和 ab 工具 1.1 安装 nginx sudo apt-get install nginx -y # 安装Nginx sudo apt-get install apache ...

最新文章

  1. Pycharm去掉项目所有 # 注释
  2. 查询前10条_阿里开发强制要求的10条ORM映射查询规范,开发人员值得看
  3. php怎么添加框架,PHPWind 给默认的风格添加大框架
  4. 写博客一定程度上是在刷存在感~
  5. 用友伟库“抢劫”金算盘,调研数据究竟谁说了算?
  6. redis和kafka比较
  7. 使用聚合的方式实现静态代理
  8. PKU A Simple Problem with Integers 3468
  9. 深入理解Java虚拟机(类文件结构)
  10. 模糊推理机制 matlab,基于模糊综合评判推理机制的学生素质评价系统设计与实现...
  11. c++面向对象高级编程 学习十六 vptr和vtbl
  12. 技术需求趋势报告:移动、社会化、电子商务最热
  13. Android8.0适配-Only fullscreen opaque activities can request orientation
  14. 2017IEC计算机第二次作业
  15. 商汤物语:全球最大AI独角兽的雄心与优雅
  16. 根据IP获取国家地区
  17. Web前端课程设计-疫情解读网页
  18. 1G PHP免费空间
  19. 后台实现查找附近的人接口
  20. lvm 多个硬盘合成一个_linux使用LVM合并硬盘

热门文章

  1. 如何设置STM32 IO端口输入输出
  2. 信息安全的前景如何?就业渠道有哪些?
  3. 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
  4. 为什么说区块链是新的博弈竞技场
  5. 逃离迷宫的路径(打印路径)
  6. CS入门学习笔记3-廖雪峰python教程-函数
  7. 编程练习:编写一个函数,用于计算某长方形面积的函数
  8. vmware上ubuntu虚拟机调整分辨率
  9. linux Qt 复制文件至剪切板
  10. qemu 的 win98 plus 镜像