转载:通过监控Nginx日志来实时屏蔽高频恶意访问的IP
通过监控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的更多相关文章
- 通过监控Nginx日志来实时屏蔽高频恶意访问的IP
目前在我的VPS上主要通过两种方式来限制ip的访问次数. 通过Nginx的limit_req配置来限制同一ip在一分钟内的访问次数 通过Nginx deny封禁一天内超过指定次数的ip(需要一个监控脚 ...
- zabbix监控nginx日志状态码
监控需求 监控Nginx常见的状态码并对其进行监控,对常见的错误状态码创建相对应的触发器以下按照分钟对数据进行抓取 Zabbix_Agentd创建监控脚本 1)创建脚本之前核对Nginx日志格式我这里 ...
- 使用ELK监控Nginx日志实现接口流量访问统计
前段时间自己看书学习了一下elasticSearch,后面自己实践了使用elasticSearch.logStash.kibana搭建一个网站接口流量访问统计的监控看板.在这里做一些记录学习. 先看一 ...
- PHP实现简单的监控nginx日志文件功能
此功能是为了实现,定时监控nginx生成的日志数据,并将新增的数据提交到一个接口(比如大数据的接口,让大数据来进行分析) define("MAX_SHOW", 8192*5); / ...
- Grafana和influxdb监控nginx日志中的请求响应时间图形化监控
监控效果如图: 监控方法: 通过logstash过滤nginx日志,然后解析出nginx日志中的request time字段 然后output到influxdb时序数据库中 通过grafana展示数据 ...
- ELK整合Filebeat监控nginx日志
ELK 日志分析 1. 为什么用到 ELK 一般我们需要进行日志分析场景:直接在日志文件中 grep. awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如 ...
- ELK监控nginx日志总结
ELK介绍 ELK即ElasticSearch + Logstash + kibana ES:作为存储引擎 Logstash:用来采集日志 Kibana可以将ES中的数据进行可视化,可以进行数据分析中 ...
- nginx日志分析及其统计PV、UV、IP
一.nginx日志结构 nginx中access.log 的日志结构: $remote_addr 客户端地址 211.28.65.253 $remote_user 客户端用户名称 -- $time_l ...
- 一个小工具帮你搞定实时监控Nginx服务器
Linux运维工程师的首要职责就是保证业务7 x 24小时稳定的运行,监控Web服务器对于查看网站上发生的情况至关重要.关注最多的便是日志变动,查看实时日志文件变动大家第一反应应该是'tail -f ...
随机推荐
- 2018-8-10-Roslyn-节点的-Span-和--FullSpan-有什么区别
title author date CreateTime categories Roslyn 节点的 Span 和 FullSpan 有什么区别 lindexi 2018-08-10 19:16:52 ...
- SDUT-2121_数据结构实验之链表六:有序链表的建立
数据结构实验之链表六:有序链表的建立 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个无序的整数,建立一个有序链 ...
- 阿里云智能数据构建与管理 Dataphin公测,助力企业数据中台建设
阿里云智能数据构建与管理 Dataphin (下简称“Dataphin”)近日重磅上线公共云,开启智能研发版本的公共云公测!在此之前,Dataphin以独立部署方式输出并服务线下客户,已助力多家大型客 ...
- Redis 5.0新功能介绍
Redis 5.0 Redis5.0版是Redis产品的重大版本发布,我们先看一下它的最新特点: 新的流数据类型(Stream data type) https://redis.io/topics/s ...
- Mybatis Generator配置文件完整配置详解
完整的Mybatis Generator(简称MBG)的最完整配置文件,带详解,再也不用去看EN的User Guide了 可以搭配着mybatis generator的中文文档看:http://mbg ...
- 洛谷P1616 疯狂的采药
//完全背包 #include<bits/stdc++.h> using namespace std; ; ; int n,m,v[maxn],w[maxn],f[maxv]; int m ...
- 阿里云Kubernetes服务上使用Tekton完成应用发布初体验
Tekton 是一个功能强大且灵活的 Kubernetes 原生开源框架,用于创建持续集成和交付(CI/CD)系统.通过抽象底层实现细节,用户可以跨多云平台和本地系统进行构建.测试和部署. 本文是基于 ...
- hdu 4419 Colourful Rectangle (离散化扫描线线段树)
Problem - 4419 题意不难,红绿蓝三种颜色覆盖在平面上,不同颜色的区域相交会产生新的颜色,求每一种颜色的面积大小. 比较明显,这题要从矩形面积并的方向出发.如果做过矩形面积并的题,用线段树 ...
- 在Linux/Unix上运行SuperSocket
SuperSocket通过(Mono 2.10或更新版本)来实现跨平台的特性 由于Unix/Linux不同于Windows上的文件路径格式,SuperSocket提供了专用于Unix/Linux系统上 ...
- mysql怎么创建,删除,查看索引?
mysql是一个开源的应用非常广泛的数据库.mysql里面的索引能利用利用指针,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍.那么,怎么创建索引 ...