nginx批量封禁黑名单ip

news/2024/9/19 9:11:40/文章来源:https://www.cnblogs.com/windysai/p/18326410
nginx批量封禁黑名单ip
  昨天搞到差不多1点,今天又是忙到6点半,连我领导都说“搞得我们加一好憔悴呀”。有很长一段时间没更新博客了,想着怎么做个人IP。。。谋出路
 
一、需求介绍
 废话少说,需求就是怎么批量封禁别人给来的一大堆黑名单ip。甲方每天不定期发来几百、上千个ip,我们的系统前面均有web应用防火墙,之前一直从云厂商的防火墙去封禁,不但要登录云控制台,如果以前添加过一样的ip,会报错重复添加,再者就是ip个数的限制。

 

  如下图就是阿里的自定义规则模版,能添加100个规则,每个规则限制只能添加100个ip。

   所以之前我们手动处理的策略是:

(1)把甲方给来的所有文件 IP 数汇总成一个文件(给来的文件会有中文,然后每个 IP 为一行),然后排序、去重

(2)对 IP 进行分割,阿里、电信用英文逗号,联通是空行

(3)根据平台的限制,手动添加IP数,譬如来了500个 IP,需要先选择处理好的100个 分割好的IP,然后像上图那样设置
可谓烦不胜烦,最恶心的是,人为操作会遗漏、失误,还有最致命一点,基本无法溯源!!!在云控制台查找添加过的重复IP,需要你手动点到每个规则里,逐个查找。阿里是不会告诉你是哪个IP重复添加过的!
 
 昨晚加班就是因为有大范围的IP无法正常访问网站。阿里我们有两个系统需要添加黑名单,其中一个系统添加没事,另一个我已经对着没事的系统比对过,没发出什么端倪,最后折中的方法只能是一边报障一边添加白名单,白名单优先级会高于黑名单。
 
 
二、问题解决

  甲方要我们封禁,不一定要用云厂商的防火墙,封禁可以从操作系统、nginx去处理。试过操作系统的 iptables,没有效果,估计跟防火墙、云安全组的配置有点关系,因为赶着处理,所以决定从nginx出发。

  注意,这里不能直接在location 写 deny,allow,因为服务器前面是防火墙,你这样添加来源都是防火墙的IP。我们应该从真实客户端 IP 去出发。可以通过 nginx 的 X-Forwarded-For 来识别原始请求者的真实 IP 地址,然后提取出第一个 IP 地址,并将其存储在变量 $real_remote_addr,最后定义一个名为 $access_check 的变量映射,用于根据 $real_remote_addr 来决定是否允许或拒绝访问。

  下面是nginx配置文件片段

 1 nginx配置文件nginx.conf,有配置: 
 2 
 3 http {
 4     ...
 5     map $http_x_forwarded_for  $real_remote_addr {
 6     ""    $remote_addr;
 7           ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
 8     }
 9     
10     map $real_remote_addr $access_check {
11         default "allow";
12         "xxx" "deny";
13     }
14     ...
15 }
16 
17 
18 然后虚拟主机配置文件,有配置
19 server
20     ...
21     location / {
22          if ($access_check = "deny") {
23              return 403;
24           }
25     }
26     ...
27 }

  之前 IP 少的时候,我是直接添加  "xxx" "deny";   但如果几千上万的话呢,一会导致文件不好看(密密麻麻的 IP 铺排整个nginx主配置文件),二会维护成本高,于是我问chatgpt,希望以文件方式存储需要封禁 的 黑名单 IP,然后nginx去加载。

  分享链接如下:https://chatgpt.com/share/dbdb364f-7931-4def-ba98-5f7600e1c372

 后面就是它给的参考代码,我直接贴上来,其中需要设置 map 的空间大小参数,不然添加不了那么多IP,而且设置的位置也有考究,具体参考文档:nginx: [emerg] “map_hash_bucket_size” directive is duplicate in /etc/nginx/nginx.conf:60

  前面说到需要对原始 IP 进行处理:排序、去重,然后有个数据库存着到当前为止甲方给来的所有 IP,对于新增 IP,我们需要先看下是否在数据库存在过,不存在需要插入数据库,最后会得到一个处理好的 blocked_ips.conf,格式如下:(这是开发帮忙弄的,感激感激~~)

 我只需要加载这个nginx文件,做相应的配置就行。后续说是开发的程序把处理好的文件放到oss上,服务器定时拉取这个文件,重新加载nginx。

1、nginx主配置文件 nginx.conf

 1 http {
 2     ...
 3     ##   map 指令生成的哈希表需要更多的空间来存储映射关系
 4     ## 放在 map $http_x_forwarded_for 前设置
 5     map_hash_max_size 2048;   
 6     map_hash_bucket_size 2048;
 7 
 8      map $http_x_forwarded_for  $real_remote_addr {
 9     ""    $remote_addr;
10           ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
11     }
12 
13     include /path/blocked_ips.conf;
14      ...
15 }

 

 2、虚拟主机配置文件

server{...location / {if ($access_check = "deny") {return 403;}proxy_pass http://后端服务;...error_page   404 403 /haha_404;location ~* /haha_404 {root /path;index index.html;}
}

 

最后我贴下 chatgpt 的脚本 generate_nginx_conf.sh

blocked_ips.txt 是一个你去重完的 ip 文件,格式是

1.11.11.11
192.168.1.100
10.0.0.1
...

 

 generate_nginx_conf.sh

 1 #!/bin/bash
 2 
 3 # 定义输入和输出文件路径
 4 INPUT_FILE="blocked_ips.txt"
 5 OUTPUT_FILE="blocked_ips.conf"
 6 
 7 # 初始化输出文件
 8 echo "map \$real_remote_addr \$access_check {" > $OUTPUT_FILE
 9 echo "    default \"allow\";" >> $OUTPUT_FILE
10 
11 # 读取输入文件并生成输出文件内容
12 while IFS= read -r ip
13 do
14   echo "    \"$ip\" \"deny\";" >> $OUTPUT_FILE
15 done < "$INPUT_FILE"
16 
17 # 关闭 map 块
18 echo "}" >> $OUTPUT_FILE

 实际就是把 ip 文件变成 这种方式:

map $real_remote_addr $access_check {
default "allow";
"被封禁 IP" "deny";
"被封禁 IP-2" "deny";

}

 只是现在都让开发帮处理了,哈哈
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/772225.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基础教程】Tutorial on Pytorch 结合官方基础文档和个人经验

参考与前言 此教程首次书写于2021年12月份 至 2022年4月份间不断补充;阅读本文时可以对着代码运行查看官方网址:https://pytorch.org/tutorials/ 【基本从这里翻译而来 更简洁版+碎碎念】 https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-begi…

kettle从入门到精通 第八十一课 ETL之kettle kettle中的json对象字段写入postgresql中的json字段正确姿势

1、上一节可讲解了如何将json数据写入pg数据库表中的json字段,虽然实现了效果,但若客户继续使用表输出步骤则仍然无法解决问题。 正确的的解决方式是设置数据库连接参数stringtype=unspecified 2、stringtype=unspecified 参数的作用: 当设置为 unspecified 时,pg JDBC 驱动…

C++文件系统操作6 - 跨平台实现文件和文件夹的拷贝

1. 关键词 2. fileutil.h 3. fileutil.cpp 4. filesystem_win.h 5. filesystem_win.cpp 6. filesystem_unix.cpp 7. 源码地址1. 关键词 C++ 文件系统操作 拷贝文件 拷贝文件夹 跨平台 2. fileutil.h#pragma once#include <string> #include <cstdio> #include <…

ArchLinux 问题集锦

电脑使用Android的网络 sudo pacman -S usb_modeswitch 手机打开网络共享 Android使用usb连接电脑网络 yay -S gnirehte gnirehtet runAndroid 投屏到电脑 sudo pacman -S scrcpy scrcpyPlasma KDE Screen Locking Picture of the Day 每日一图的图片缓存位置~/.cache/plasma_e…

Manjaro Linux安装

安装分区以及配置方案 manjaro 安装分区以及配置方案 根分区/:看成Windows的C分区,在重装系统时只格式化根分区/ /home分区:要存放用户目录及用户日积月累的数据,要尽量大些 /boot:不使用 UEFI 时,/boot 的建议大小时 200 MB,使用 UEFI 时,需要至少 512 MiB 空间 /var:…

雷达气象学(1)——雷达电磁波的散射

目录1.0 电磁波的特征1.1 散射的概念及类型1.2 散射函数——表示粒子的散射能力1.3 瑞利后向散射函数1.4 后向散射截面——更好地表示粒子的散射能力1.5 反射率因子 1.0 电磁波的特征 雷达的探测方式为电磁波。电磁波是在空间传播的电场和磁场两者结合,它在时空上呈现正弦与余…

雷达气象学(2)——雷达电磁波的衰减

目录2.1 衰减的概念2.2 气体对电磁波的衰减2.3 云对电磁波的衰减2.4 雨对电磁波的衰减2.5 雪对电磁波的衰减2.5.1 干雪对电磁波的衰减2.5.2 湿雪对电磁波的衰减2.6 冰雹对电磁波的衰减参考文献 2.1 衰减的概念 衰减是电磁波能量沿传播路径减弱的现象。造成衰减的原因是当电磁波…

将手机作为服务器运行docker服务

前言 目前手机的配置并不低,即使是2019年生产的一加七Pro,配置也有12+256,CPU是骁龙855,作为服务器运行着配置绰绰有余了,二手的价格现在是400左右也能接受。相对于是自带ups电源的便携低耗docker服务器,还能同时使用安卓系统,配上adb远程做云手机也可以。 要想原生支持…

Profinet远程IO模块:模拟量模块_安装与接线说明

Profinet远程IO模块由兴达易控研发,包含耦合器、多种I/O模块和辅助模块如:PROFINET、EtherCAT、Ethernet/IP、Cclink IE以及modbus/TCP等。支持多种通讯协议,提供多种数字量和模拟量输入输出模块,适用于不同现场需求。安装简便,需正确接线并检查电源。XD系列插片式远程 IO…

四边形不等式优化

四边形不等式优化 应用于类似以下dp转移方程。 \[f_{i}=\min_{1\le j\le i}(w_{i,j},f_{i}) \]假设 \(w_{i,j}\) 可以在 \(O(1)\) 的时间内进行计算。 在正常情况下,此状态转移方程的时间复杂度是 \(O(n^2)\)。 对于问题 \(i\),我们需要考虑所有的有关决策 \(j\),但是当其满…