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中ip
                    String 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 "";
    }
}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

复现ORB3-YOLO8项目记录

文章目录 1.编译错误1.1 错误11.2 错误21.3 错误31.4 错误4 1.编译错误 首先ORB-SLAM相关项目已经写过很多篇博客了&#xff0c;从ORB-SLAM2怎么运行&#xff0c;再到现在的项目。关于环境已经不想多说了 1.1 错误1 – DEPENDENCY_LIBS : /home/lvslam/ORB3-YOLO8/Thirdparty…

ActiveMQ-CVE-2023-46604

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActvieMQ5.18.2版本以及以前&#xff0c;OpenWire协议通信过程中存在一处反序列化漏洞&#xff0c;该漏洞可以允许具有网络访问权限的远程攻击者通过操作…

数据库的学习(5)

题目&#xff1a; 1、新增员工表emp和部门表dept create table dept (deptl int,dept name varchar(11)) charsetutf8; create table emp (sid int,name varchar(11),age int,worktime start date,incoming int,dept2 int) charsetutf8; insert into dept values (101,财务), (…

推广员团队分红体系,促进销量,能者多得

商城系统推广员的作用是通过奖励吸引会员成为推广人员&#xff0c;商家后台设置功能体系商品分佣比例&#xff0c;其推广到私域里完成订单获得佣金提现&#xff0c;商家获得更多新订单和新客户。 虽然商家可以招募大量推广员&#xff0c;但对推广员自身来说佣金吸引下还是缺少…

股指期货存在的风险有哪些?

股指期货因其标的物的特殊性&#xff0c;其面临的风险类型十分复杂&#xff0c;主要面临的一般风险和特有风险如下&#xff1a; 一般风险 从风险是否可控的角度&#xff0c;可以划分为不可控风险和可控风险&#xff1b;从交易环节可分为代理风险、流动性风险、强制平仓风险&…

快捷工具(提升工作效率)

文章目录 一、notepad++设置转json1.下载插件二、截图工具(可以将截图并粘贴到窗口)1.下载安装软件:snipaste三、idea 日志控制台查找日志1.idea 安装插件:Grep console四、beyond compare 4项目工程比较工具1.浏览器下载安装。本地运行五、xampp快速部署本地mysql,tomacat1.浏…

微信视频号的视频怎么下载到本地?快速教你下载视频号视频

天来说说市面上常见的微信视频号视频下载工具&#xff0c;教大家快速下载视频号视频&#xff01; 方法一&#xff1a;缓存方法 该方法来源早期视频技术&#xff0c;因早期无法将大量视频通过网络存储&#xff0c;故而会有缓存视频文件到手机&#xff0c;其目的为了提高用户体验…

Win11 Anaconda3卸载与重装(20240714)

0&#xff0c;背景 系统为Win11&#xff0c;遇到了一些不好解决的错误&#xff0c;决定干脆直接卸载重装Anaconda 建议参考官方文档&#xff1a;Uninstalling Anaconda Distribution — Anaconda documentation 1&#xff0c;第一步-卸载软件 找到当前Anaconda安装的路径下…

Java实现数据结构——双链表

目录 一、前言 二、实现 2.1 类的创建 三、对链表操作实现 3.1 打印链表 3.2 插入数据 3.2.1 申请新节点 3.2.2 头插 ​编辑 3.2.3 尾插 3.2.4 链表长度 3.2.5 任意位置插入 3.3 删除数据 3.3.1 头删 3.3.2 尾删 3.3.3 删除指定位置数据 3.3.4 删除指定数据 3…

ensp实现ICMP重定向实验

1 概述 ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下&#xff0c;当路由器检测到一台机器使用非优化路由的时候&#xff0c;它会向该主机发送一个ICMP重定向报文&#xff0c;请求主机改变路由。路由器也会把初始数据包向它的目的地转发。 2 实验复现 拓扑如下 PC1配…

Tomcat部署以及优化

1、tomcat tomcat是用java代码的程序&#xff0c;运行的是java的web服务器 tomcat和php一样都是用来处理动态页面&#xff0c;tomcat也可以做为web应用服务器&#xff0c;开源的 php处理.php为结尾的 tomcat 处理.jsp nginx 处理 .html 2、tomcat的特点和功能 1、servle…

如何将LLM 集成到自动化生产系统

关键词&#xff1a;自动化系统、自主系统、LLM、数字孪生、微服务、多智能体系统 在技术不断发展的背景下&#xff0c;自动化和自主系统这两个术语经常交织在一起&#xff0c;但在影响上有明显的不同。两者都涉及到使用技术执行任务&#xff0c;最小化或不需要人工干预&#x…

Re:从零开始的C++世界——(一)入门基础

文章目录 C发展历史1.命名空间1.1 namespace的价值1.2 namespace的定义1.3 命名空间使⽤ 2.C输⼊&输出3.缺省参数3.1 缺省参数的概念3.2 缺省参数的分类 4.函数重载5.引⽤5.1引⽤的概念和定义5.2 引⽤的特性5.3 const引⽤5.4 使用场景5.5 指针和引⽤的关系 6.内联函数6.1内…

linux_进程周边知识——理解冯诺依曼体系结构

前言&#xff1a; 本篇内容是为了让友友们较好地理解进程的概念&#xff0c; 而在真正了解进行概念之前&#xff0c; 要先了解一下冯诺依曼体系结构。 所以博主会先对冯诺伊曼体系结构进行解释&#xff0c; 然后再讲解进程的概念。 ps&#xff1a; 本篇内容适合了解一些linux指…

【redis操作语句】

1.数据库操作 redis默认有16个数据库&#xff0c;编号为0~15&#xff0c;且默认访问0号数据库 获取当前键值对数量:先set创建一个键值对,再用dbsize获取&#xff0c;flushdb清空再获取。 127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> dbsize (integer) 1 127.0.0.1:…

opencv 中如何通过欧式距离估算实际距离(厘米)

1&#xff1a;这个方法个人测试觉得是正确的&#xff0c;误差较小&#xff0c;目前满足我当前的需求&#xff0c;如果方法不对&#xff0c;请大家评论&#xff0c;完善。 2&#xff1a;确保拍摄的参照物是垂直的&#xff0c;如果不垂直&#xff0c;就会有误差&#xff0c;不垂…

基于SpringBoot+Hadoop+python的物品租赁系统(带1w+文档)

基于SpringBootHadooppython的物品租赁系统(带1w文档) 基于SpringBootHadooppython的物品租赁系统(带1w文档) 物品租赁系统是电子、信息技术相结合&#xff0c;是一种必然的发展趋势。以互联网为基础&#xff0c;以服务于广大用户为目的&#xff0c;发展整体优势&#xff0c;扩…

Flutter实现局部刷新的几种方式

目录 前言 1.局部刷新的重要性 1.概念 2.重要性 2.局部刷新实现的几种方式 1.使用setState方法进行局部刷新 2.使用StatefulWidget和InheritedWidget局部刷新UI 3.ValueNotifier和ValueListenableBuilder 4.StreamBuilder 5.Provider 6.GetX 7.使用GlobalKey 前言 …

游戏三倍补帧工具 Lossless Scaling v2.9.0

运行时请将游戏窗口化或全屏 比如你的显示器是144hz 把游戏限制帧率到48帧后开启三倍补帧 允许撕裂和垂直同步一起来延迟更低 72,48,36&#xff0c;分别对应1/2&#xff0c;1/3&#xff0c;1/4&#xff0c;性能够的话&#xff08;补帧后满144fps&#xff09;就优先锁72fps&a…

自动驾驶中的人机互相接管问题讨论

一、背景 人机接管&#xff08;human takeover&#xff09;是指在自动驾驶过程中&#xff0c;当系统遇到超出其处理能力或预设安全阈值的情况时&#xff0c;将控制权交还给驾驶员的过程。这一环节的设计直接关系到自动驾驶技术的实用性与安全性&#xff0c;是目前研究和实践中…