java配置nginx网络安全,防止国外ip访问,自动添加黑名单,需手动重新加载nginx

在这里插入图片描述

通过访问日志自动添加国外ip黑名单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建一个类,自己添加一个main启动类即可测试

import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.json.JSONArray;
import org.json.JSONObject;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;import static java.lang.Character.LINE_SEPARATOR;@Slf4j
@Component
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class SecurityIp {private final static String[] privinces = {"北京市", "天津市", "河北省", "山西省", "内蒙古", "辽宁省", "吉林省", "黑龙江省", "上海市", "江苏省", "浙江省", "安徽省", "福建省", "江西省", "山东省", "河南省", "湖北省", "湖南省", "广东省", "广西", "海南省", "重庆市", "四川省", "贵州省", "云南省", "西藏", "陕西省", "甘肃省", "青海省", "宁夏", "新疆", "台湾省", "香港", "澳门", "此IP属于本地局域网","本地局域网"};//nginx的工作空间private final static String nginxPath = "F:/zty/testlinux/usr/local/nginx/";//nging的access.log路径private final static String logPath = nginxPath + "logs/access.log";//黑名单配置文件路径private final static String blackListPath = nginxPath + "conf/blackListIp.conf";private final static String blackListLogPath = nginxPath + "conf/blackListIpLog.log";//启动脚本文件路径private final static String binPath = nginxPath + "";private static String getAddressByIp(String ip) {try {URL url = new URL("http://opendata.baidu.com/api.php?query=" + ip + "&co=&resource_id=6006&t=1433920989928&ie=utf8&oe=utf-8&format=json");URLConnection conn = url.openConnection();BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));String line = null;StringBuffer result = new StringBuffer();while ((line = reader.readLine()) != null) {result.append(line);}reader.close();JSONObject jsStr = new JSONObject(result.toString());JSONArray jsData = (JSONArray) jsStr.get("data");JSONObject data = (JSONObject) jsData.get(0);//位置return (String) data.get("location");} catch (IOException e) {log.error("getAddressByIp error, ip={},msg={}", ip, e);return null;}}/*** 扫描非法IP* 每隔30秒扫描一次非法IP并加入黑名单*/@Scheduled(fixedDelay = 3000)public void scanForIllegalIP() throws Exception {List<String> ips = getIps();// 将当前检测国外ip加入黑名单并且返回if(ips.size() > 0) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("deny,国外ip:" + ips + "已写入nginx黑名单列表"+sdf.format(new Date()));}}/*** 获取国外ip** @return*/private List<String> getIps() {File file = new File(logPath);if (!file.exists()) {log.error("{} not exists", logPath);return null;}try {List<String> lines = new ArrayList<>();try (BufferedReader reader = new BufferedReader(new FileReader(file))) {String line;while ((line = reader.readLine()) != null) {// 获取access.log中ipString ip = line.substring(0, line.indexOf(" - - ["));if (!ip.equals("127.0.0.1")) {String securityIps = securityIps(ip);// 校验ip是否是国外ip,如果是的写入黑名单if (Objects.nonNull(securityIps) && !securityIps.isEmpty()) {lines.add(securityIps);// 国外ip加入黑名单的相应}}}}return lines;} catch (IOException e) {throw new RuntimeException(e);}}/*** 将ip写入黑名单** @param ip* @return*/private String securityIps(String ip) {String location = getAddressByIp(ip);if (Objects.nonNull(location) && privinces.length > 0) {List<String> lines = new ArrayList<>();List<String> notIps = Arrays.stream(privinces).filter(p -> p.contains(location)).collect(Collectors.toList());if (Objects.nonNull(notIps) && notIps.size() == 0) {// 写入黑名单时先查询此ip是否写入黑名单File isExsitfile = new File(blackListPath);if (!isExsitfile.exists()) {log.error("{} not exists", logPath);return null;}try {try (BufferedReader reader = new BufferedReader(new FileReader(isExsitfile))) {String line;while ((line = reader.readLine()) != null) {// 获取blackListIp.conf,判断是否已经写入if (Objects.nonNull(line) && !line.isEmpty() && !line.contains("127.0.0.1") && !line.contains("#")) {String newLines = line.replace(" deny ", "").replace(";", "");lines.add(newLines);}}}} catch (IOException e) {throw new RuntimeException(e);}}//第二步,写入非法IP进nginx的blackList文件try {List<String> isExit = lines.stream().filter(line -> line.contains(ip)).collect(Collectors.toList());if (notIps.size()==0&&isExit.size() == 0) {// 国外ip不在白名单中并且没有写入黑名单File file = new File(blackListPath);FileWriter out = new FileWriter(file, true);BufferedWriter bw = new BufferedWriter(out);bw.write(LINE_SEPARATOR);bw.write(" deny " + ip + ";");bw.flush();bw.close();log.info("国外:" + location + "IP:{} 已写入nginx黑名单列表", ip);// 写入nginx黑名单日志File blackListLog = new File(blackListLogPath);FileWriter blackListout = new FileWriter(blackListLog, true);BufferedWriter blackListbw = new BufferedWriter(blackListout);blackListbw.write(LINE_SEPARATOR);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");blackListbw.write("deny,国外:" + location + ip + "已写入nginx黑名单列表"+sdf.format(new Date()));blackListbw.flush();blackListbw.close();return ip;}} catch (IOException e) {throw new RuntimeException(e);}}return "";}
}

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

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

相关文章

【学习笔记】Redis学习笔记——第10章 RDB持久化

第10章 RDB持久化 RDB是用来做持久化的二进制压缩文件 10.1 RDB文件的创建与载入 1>SAVE命令阻塞主线程创建。 2>EGSAVE开子线程创建。 3>优先使用AOF进行初始化数据库&#xff0c;否则&#xff0c;使用RDB文件初始化&#xff0c;因为AOF文件的写入更加频繁&#x…

面试经验之谈

优质博文&#xff1a;IT-BLOG-CN ​通常面试官会把每一轮面试分为三个环节&#xff1a;① 行为面试 ② 技术面试 ③ 应聘者提问 行为面试环节 面试开始的5~10分钟通常是行为面试的时间&#xff0c;面试官会参照简历和你的自我介绍了解应聘者的过往经验和项目经历。由于面试官…

C++catch (...)陈述

catch (...)陈述 例外处理可以有多个catch&#xff0c;如果catch后的小括弧里面放...&#xff0c;就表示不限型态种类的任何例外。 举例如下 #include <iostream>int main() {int i -1;try {if (i > 0) {throw 0;}throw 2.0;}catch (const int e) {std::cout <…

nodejs模板引擎(一)

在 Node.js 中使用模板引擎可以让您更轻松地生成动态 HTML 页面&#xff0c;通过将静态模板与动态数据结合&#xff0c;您可以创建可维护且易于扩展的 Web 应用程序。以下是一个使用 Express 框架和 EJS 模板引擎的基本示例&#xff1a; 安装必要的依赖&#xff1a; 首先&#…

分享浏览器被hao123网页劫持,去除劫持的方式

昨天看python相关的自动化工作代码时&#xff0c;发现谷歌浏览器被hao123劫持了&#xff0c;把那些程序删了也不管用 方法1&#xff1a;删除hao123注册表&#xff0c;这个方式不太好用&#xff0c;会找不到注册表 方法2&#xff1a;看浏览器快捷方式的属性页面&#xff0c;一…

【C++】入门基础(命名空间、缺省参数、函数重载)

目录 一.命名空间&#xff1a;namespace 1.namespace的价值 2.namespace的定义 3.namespace的使用方法 3.1 域解析运算符:: 3.2 using展开 3.3 using域解析运算符 二.输入输出 三.缺省参数 四.函数重载 1.参数类型不同 2.参数个数不同 3.参数顺序不同 一.命名空间&…

APP专项测试之网络测试

背景 当前app网络环境比较复杂&#xff0c;越来越多的公共wifi&#xff0c;网络制式有2G、3G、4G网络&#xff0c;会对用户使用app造成一定影响&#xff1b;当前app使用场景多变&#xff0c;如进地铁、上公交、进电梯等&#xff0c;使得弱网测试显得尤为重要&#xff1b; 网络正…

链路追踪系列-02.演示zipkin

当本机启动docker es zipkinServer之后&#xff1a; 启动3个项目&#xff1a;先eureka-server&#xff0c;再 PaymentMain8001,… 浏览器打开&#xff1a;http://localhost:9001/consumer/payment/zipkin consumer代码 &#xff1a; provider: 此时查询es:

uboot如何选择启动设备

cpu选择启动设备有两种方式 1、通过bootpin选择某个设备 比如从SD卡启动、EMMC、USB启动。 2、通过bootpin选择某个顺序 比如&#xff1a; SD、SPI、NANDSPI、NAND、SD

3-2 多层感知机的从零开始实现

import torch from torch import nn from d2l import torch as d2lbatch_size 256 # 批量大小为256 train_iter, test_iter d2l.load_data_fashion_mnist(batch_size) # load进来训练集和测试集初始化模型参数 回想一下&#xff0c;Fashion-MNIST中的每个图像由 28 28 784…

学习C++,应该循序渐进的看哪些书?

学习C是一个循序渐进的过程&#xff0c;需要根据自己的基础和目标来选择合适的书籍。以下是一个推荐的学习路径&#xff0c;包含了从入门到进阶的书籍&#xff1a; 1. 入门阶段 《C Primer Plus 第6版 中文版》 推荐理由&#xff1a;这本书同样适合C零基础的学习者&#xff0…

python运行环境在新旧电脑间迁移

目录 方法1. 直接复制虚拟环境文件夹&#xff1a;方法2. 导出和导入依赖项&#xff1a;方法3. 用 Docker 镜像&#xff1a; 当您需要在不同电脑之间迁移 Python 运行环境时&#xff0c;可以采用以下方法之一&#xff1a; 方法1. 直接复制虚拟环境文件夹&#xff1a; 将整个虚…

[CISCN2018]2ex

啊!好恶心的mips寄存器 好多IDA都查不到,这寄存器~! fuck! 但是这种寄存器一般的题都不难 这道题就是 我用平常的方法,没找到 左边函数一个一个点 看见这里0X3F base64 密文呢? 我giao 外面的txt文件里面 脚本 import base64 import string# 定义你的自定义字符集 st…

PHP语言教程与实战案例

PHP是一种广泛使用的开源脚本语言&#xff0c;尤其适用于Web开发并可嵌入HTML中。它的语法吸收了C语言、Java和Perl的特点&#xff0c;易于学习&#xff0c;功能强大。本文将带领你从基础语法入手&#xff0c;通过一系列实用案例&#xff0c;逐步掌握PHP的核心概念和技巧。 项…

使用JDBC实现事务管理与隔离级别设置

使用JDBC实现事务管理与隔离级别设置 在Java开发中&#xff0c;JDBC&#xff08;Java Database Connectivity&#xff09;是常用的数据库连接方式。在处理数据库操作时&#xff0c;事务管理和隔离级别设置是保证数据一致性和可靠性的关键。本篇博客将通过示例代码&#xff0c;…

并发编程-11线程池详解

一 线程池基础和使用 1.1 什么是线程池 “线程池”&#xff0c;顾名思义就是一个线程缓存&#xff0c;线程是稀缺资源&#xff0c;如果被无限制的创建&#xff0c;不仅会消耗系统资源&#xff0c;还会降低系统的稳定性&#xff0c;因此Java中提供线程池对线程进行统一分配、调优…

聊点基础---Java和.NET开发技术异同全方位分析

1. C#语言基础 1.1 C#语法概览 欢迎来到C#的世界&#xff01;对于刚从Java转过来的开发者来说&#xff0c;你会发现C#和Java有很多相似之处&#xff0c;但C#也有其独特的魅力和强大之处。让我们一起来探索C#的基本语法&#xff0c;并比较一下与Java的异同。 程序结构 C#程序…

美团收银Android一面凉经(2024)

美团收银Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《美团收银Android一面凉经(2024)》。 应聘岗位: 美团餐饮PaaS平台Android开发工程师…

pnpm 如何安装指定版本

要安装特定版本的pnpm&#xff0c;可以使用npm命令来全局安装特定版本的pnpm&#xff0c;例如&#xff1a; npm install -g pnpm2.0.0在上面的命令中&#xff0c;使用了2.0.0来指定安装2.0.0版本的pnpm。您可以将2.0.0替换为您需要安装的版本号。 如果您使用的是yarn&#xf…

【2-1:RPC设计】

RPC 1. 基础1.1 定义&特点1.2 具体实现框架1.3 应用场景2. RPC的关键技术点&一次调用rpc流程2.1 RPC流程流程两个网络模块如何连接的呢?其它特性RPC优势2.2 序列化技术序列化方式PRC如何选择序列化框架考虑因素2.3 应用层的通信协议-http2.3.1 基础概念大多数RPC大多自…