当前位置:首页 > CN2资讯 > 正文内容

nginx 禁止IP地址伪造

3天前CN2资讯

通过监控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: , request: "GET /download/ring/b649b722df3c4c86d405d8deb272a59b.mp3 HTTP/1.1", host: "", referrer: "http:///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: , request: "GET /download/ring/b649b722df3c4c86d405d8deb272a59b.mp3 HTTP/1.1", host: "", referrer: "http:///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: , request: "GET /music/979744fb8eb9055f77f3db2a3f3189a8.mp3 HTTP/1.1", host: "" 2019/03/31 17:57:34 [error] 9672#9672: *431037 access forbidden by rule, client: 59.80.44.46, server: , request: "GET /music/979744fb8eb9055f77f3db2a3f3189a8.mp3 HTTP/1.1", host: ""

OK, 搞定!




目前在我的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: , request: "GET /download/ring/b649b722df3c4c86d405d8deb272a59b.mp3 HTTP/1.1", host: "", referrer: "http:///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: , request: "GET /download/ring/b649b722df3c4c86d405d8deb272a59b.mp3 HTTP/1.1", host: "", referrer: "http:///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: , request: "GET /music/979744fb8eb9055f77f3db2a3f3189a8.mp3 HTTP/1.1", host: "" 2019/03/31 17:57:34 [error] 9672#9672: *431037 access forbidden by rule, client: 59.80.44.46, server: , request: "GET /music/979744fb8eb9055f77f3db2a3f3189a8.mp3 HTTP/1.1", host: ""

OK, 搞定!

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/19769.html

    分享给朋友:

    “nginx 禁止IP地址伪造” 的相关文章

    如何获取Cloudflare API Token并设置权限指南

    什么是Cloudflare API Token 在使用Cloudflare提供的各种服务时,我常常需要进行自动化管理。此时,Cloudflare API Token便成为了我的好帮手。它是一种安全凭证,专门用来访问和操作Cloudflare的多个功能。这使得我能够在编程和自动化中灵活运用Cloudf...

    RackNerd IPv6 设置指南:轻松配置高效网络体验

    在探索虚拟私有服务器(VPS)时,RackNerd成为了很多用户的首选。作为一家专注于高性能VPS服务的公司,RackNerd以其可靠的服务器托管解决方案而闻名。它的服务器主要部署在ColoCrossing和Multacom机房,这让RackNerd在提供服务时具备了很多灵活性和优势。 RackNe...

    国内VPS安装Docker的详细步骤与优化技巧

    在决定开始安装Docker之前,首先需要为你的国内VPS做好一些准备工作。准备工作不仅可以帮助我们顺利完成Docker的安装,还能让过程更加高效。 首先,选择一个适合的VPS服务提供商至关重要。目前市场上有很多VPS服务商,例如阿里云、腾讯云、Linode等。在选择时,可以根据自己的需求考虑价格、性...

    如何有效利用闲置VPS:再利用与出租的最佳实践

    闲置VPS,这个词可能对很多人来说并不陌生,尤其是在互联网和云计算技术快速发展的今天。说白了,闲置VPS就是那些购买了却没有得到充分利用的虚拟私人服务器。很多用户在购买VPS后,可能由于项目需求的变化或者个人时间的限制,最终导致这些资源被闲置。这不仅仅是浪费金钱,也让我们的资源没有得到最好的应用。...

    PacificRack低价VPS服务评测与用户体验分析

    在云计算和虚拟主机服务日益普及的今天,PacificRack作为QuadraNET旗下的全资子品牌,逐渐在低价VPS市场中崭露头角。它的主要定位是为那些对性能要求不高,且对价格敏感的用户提供解决方案。PacificRack通过严格的资源管理,致力于为用户提供一种经济实惠的选择,适合希望以最低成本体验...

    探索美国冷门VPS:高性价比与个性化服务的优选

    在谈论VPS(虚拟专用服务器)时,人们往往会联想到那些知名的品牌和服务,而美国冷门VPS市场却是一个值得关注的领域。这些冷门VPS提供商虽然在整体市场中的知名度较低,但却为特定的用户群体和需求提供了颇具价值的服务。我在研究这个市场时,发现不少提供商在某些方面有着相当的优势,让我对这个冷门领域充满了好...