基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站

基于 NGINX 的 ngx_http_geoip2 模块 来禁止国外 IP 访问网站

一、安装 geoip2 扩展依赖

[root@fxkj ~]# yum install libmaxminddb-devel -y

二、下载 ngx_http_geoip2_module 模块

[root@fxkj tmp]#  git clone https://github.com/leev/ngx_http_geoip2_module.git

三、解压模块到指定路径

我这里解压到/usr/local 目录下

[root@fxkj tmp]# mv ngx_http_geoip2_module/ /usr/local/
[root@fxkj local]# ll ngx_http_geoip2_module/
total 60
-rw-r--r-- 1 root root  1199 Aug 13 17:20 config
-rw-r--r-- 1 root root  1311 Aug 13 17:20 LICENSE
-rw-r--r-- 1 root root 23525 Aug 13 17:20 ngx_http_geoip2_module.c
-rw-r--r-- 1 root root 21029 Aug 13 17:20 ngx_stream_geoip2_module.c
-rw-r--r-- 1 root root  3640 Aug 13 17:20 README.md

四、安装 nginx 模块

首先说明下环境,我的 nginx 版本是 1.16 , 在网上查了下 安装 ngx_http_geoip2 模块至少需要 1.18 版本及以上,因此此次安装我是 升级 nginx1.18,添加 ngx_http_geoip2 模块。

下载 nginx 1.18 版本

[root@fxkj ~]# yum install libmaxminddb-devel -y

解压 nginx1.18 软件包并 升级为 nginx1.18 ,添加 ngx_http_geoip2 模块
需要注意:

1、升级 nginx, 添加 nginx 模块 只需要 编译 然后 make 不需要 make instll 不然线上的 nginx 会被新版本 nginx 完完整整的替换掉

2、编译前 需要看下 nginx 当前安装了哪些模块

[root@fxkj tmp]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.16.0

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)

built with OpenSSL 1.0.2k-fips 26 Jan 2017

TLS SNI support enabled

configure arguments: –with-http_stub_status_module –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_ssl_module –with-stream

编译安装

[root@fxkj tmp]# tar -xf nginx-1.18.0.tar.gz
[root@fxkj tmp]# cd nginx-1.18.0/
[root@fxkj nginx-1.18.0]# ./configure --with-http_stub_status_module \
 --prefix=/usr/local/nginx \
 --user=nginx --group=nginx --with-http_ssl_module --with-stream \
 --add-module=/usr/local/ngx_http_geoip2_module
[root@fxkj nginx-1.18.0]# make
[root@fxkj nginx-1.18.0]# cp /usr/loca/nginx/sbin/nginx /usr/loca/nginx/sbin/nginx1.16    #备份
[root@fxkj nginx-1.18.0]# cp objs/nginx /usr/local/nginx/sbin/    #用新的去覆盖旧的
[root@fxkj nginx-1.18.0]# pkill nginx     #杀死nginx
[root@fxkj nginx-1.18.0]# /usr/local/nginx/sbin/nginx    #再次启动Nginx

查看 nginx 版本 以及安装的模块

[root@fxkj nginx-1.18.0]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.18.0

built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)

built with OpenSSL 1.0.2k-fips 26 Jan 2017

TLS SNI support enabled


configure arguments: –with-http_stub_status_module –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_ssl_module –with-stream –add-module=/usr/local/ngx_http_geoip2_module

五、下载最新的 IP 地址数据库文件

模块安装成功后,还要在 Nginx 里指定数据库,在安装运行库时默认安装了两个,位于 /usr/share/GeoIP/ 目录下,一个只有 IPv4,一个包含 IPv4 和 IPv6:

登录 www.maxmind.com 网址,创建账户 下载最新的库文件(账户创建就不演示了)

点击左侧 ,Download Files

图片

选择 GeoLite2 Country ,点击 Download GZIP 下载即可

图片

上传到 /usr/share/GeoIP/ 下并解压

[root@fxkj local]# cd /usr/share/GeoIP/
[root@fxkj GeoIP]# ll
total 69612
lrwxrwxrwx. 1 root root       17 Mar  7  2019 GeoIP.dat -> GeoIP-initial.dat
-rw-r--r--. 1 root root  1242574 Oct 30  2018 GeoIP-initial.dat
lrwxrwxrwx. 1 root root       19 Mar  7  2019 GeoIPv6.dat -> GeoIPv6-initial.dat
-rw-r--r--. 1 root root  2322773 Oct 30  2018 GeoIPv6-initial.dat
-rw-r--r--  1 root root  3981623 Aug 12 02:37 GeoLite2-Country.mmdb

六、配置 nginx 配置文件

修改前 先备份配置文件

[root@fxkj ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak
[root@fxkj ~]# vim /usr/local/nginx/conf/nginx.conf

在 http 中添加 几行,定义数据库文件位置

geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5m;
$geoip2_data_country_code country iso_code;
}
  map $geoip2_data_country_code $allowed_country {
                default yes;
                CN no;
}

图片

在 server 中的 location 下 添加 条件

如果满足 IP 是国外 IP 就 执行下面的 return 动作,我这里定义了 3 种, 注释了其中两个。

当访问 IP 是国外 IP ,直接返回 404

if ($allowed_country = yes) {
       # return https://www.baidu.com;
       # return /home/japan;
        return 404;
 }

修改完毕后, 检测下配置文件,重新加载下 nginx

[root@fxkj ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[roo@fxkj ~]# /usr/local/nginx/sbin/nginx -s reload

7、模拟测试验证

使用海外节点的服务器去访问网站

这里我的 IP 是 来自于韩国

图片

可以看到访问网站报错 404 Not Found

图片
我们再来看下 nginx 的访问日志

“13.125.1.194 – – [14/Aug/2020:16:15:51 +0800] “GET /favicon.ico HTTP/1.1” 404 548 “https://www.fxkjnj.com/” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36”

图片

至此,我们通过 Nginx 来实现禁止国外 IP 访问网站 就结束了~

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

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

相关文章

mysql忘记密码

起因是忘记了mysql的密码,cmd那里显示mysql不是内部命令,于是先把mysql加入到环境变量当中:设置-高级系统设置-环境变量-系统变量那里编辑,将mysql的路径加入到path当中。 然后遇到报错:ERROR 2003 (HY000): Cant conn…

Adobe Bridge 2024:连接创意,探索无限可能 mac/win版

Adobe Bridge 2024,作为Adobe家族中的一款强大的创意管理工具,再次革新了数字资产管理和工作流程优化的标准。这款软件不仅继承了Adobe Bridge一贯的直观界面和强大功能,更在多个方面进行了突破性的改进。 Bridge 2024软件获取 全面的资源管…

iOS开发进阶(十四):xcodebuild 命令应用详解

文章目录 一、前言二、xcodebuild 命令汇总三、xcodebuild 可选命令四、exportOptionsPlist文件内容配置说明五、项目实操六、拓展阅读 一、前言 关于iOS组包,详参博文《ReactNative进阶(三十四):Jenkins 流水线 组包 iOS 应用包…

如何提bug?

很多公司都有提bug的标准,对于新人刚介入测试行业时,提bug的时候,描述的清晰与否就很重要,那一个很明朗清晰的bug应该包含那些呢? bug包含的要素有那些?(以jira工具为例) 1、项目名…

LeetCode每日一题之专题一:双指针 ——移动零

移动零OJ链接:283. 移动零 - 力扣(LeetCode) 题目: 解法(快排的思想:数组划分区间-数组分两块): 算法思路:在本题中,我们可以用一个 dest 指针来扫描整个数组…

应用方案 | 内置ALC的音频前置放大器D2538A和D3308芯片

一、应用领域 D2538A和D3308是芯谷科技推出的两款内置ALC(音频限幅器)的前置音频放大器芯片,其中D2538A为单通道,D3308为双通道,它特别适用于胎心仪、个人医疗防护、立体声收录机、盒式录音机等涉及音频放大与限幅的产…

Java游戏开发基础:从零开始搭建自己的游戏之《人生重开模拟器》简易版

一、引言 人生重开模拟器游戏是一种虚拟角色扮演游戏,玩家通过控制一个虚构的角色,体验与现实生活中不同的选择和结果。玩家的决策将影响角色的生活轨迹,包括他们的职业生涯、社交关系、健康和财富等方面。 游戏的乐趣在于提供了一个虚拟的沙…

1.JavaEE进阶篇 - 为什么要学习SpringBoot呢?

文章目录 1.为什么要学框架?2.框架的优点展示(SpringBoot VS Servlet)2.1 Servlet 项⽬开发2.1.1 创建项⽬2.1.2 添加引⽤2.1.3 添加业务代码2.1.4 运⾏项⽬(配置tomcat)2.1.5 Maven配置2.1.5.1修改本地Maven仓库地址2.1.5.2 配置settings.xml文件2.1.5.3项目 本地仓…

LeetCode 19.删除链表的倒数第N个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 示例 2: 输入:head [1], n 1 输出:[] 示例 3&#x…

大数据实验一,Hadoop安装及使用

目录 一.实验内容 二.实验目的 三.实验过程截图及说明 1、安装SSH,并配置SSH无密码登录 2、配置java环境 3.Hadoop的安装与配置 4、修改四个配置文件: 5、格式化HDFS的NameNode: 6、启动Hadoop 7、…

Polardb MySQL 产品架构及特性

一、产品概述; 1、产品族 参考:https://edu.aliyun.com/course/3121700/lesson/341900000?spma2cwt.28120015.3121700.6.166d71c1wwp2px 2、polardb mysql架构优势 1)大容量高弹性:最大支持存储100T,最高超1000核CPU&#xff0…

PEFT-LISA

LISA是LoRA的简化版,但其抓住了LoRA微调的核心,即LoRA侧重更新LLM的底层embedding和顶层head。 根据上述现象,LISA提出两点改进: 始终更新LLM的底层embedding和顶层head随机更新中间层的hidden state 实验结果 显存占用 毕竟模型…

游戏引擎之高级动画技术

一、动画混合 当我们拥有各类动画素材(clips)时,要将它们融合起来成为一套完整的动画。 最经典的例子就是从走的动画自然的过渡到跑的动画。 1.1 线性插值 不同于上节课的LERP(同一个clip内不同pose之间)&#xff…

STM32学习和实践笔记(4):分析和理解GPIO_InitTypeDef GPIO_InitStructure (c)

第二个成员变量是GPIOSpeed_TypeDef GPIO_Speed;也与int a一样同理。 GPIOSpeed_TypeDef是一个枚举类型,其定义如下: typedef enum { GPIO_Speed_10MHz 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef; #define IS_GPI…

STM32-03基于HAL库(CubeMX+MDK+Proteus)输入检测案例(按键控制LED)

文章目录 一、功能需求分析二、Proteus绘制电路原理图三、STMCubeMX 配置引脚及模式,生成代码四、MDK打开生成项目,编写HAL库的按键检测代码五、运行仿真程序,调试代码 一、功能需求分析 搭建完成开发STM32开发环境之后,开始GPIO…

vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示

由于分辨率不同会导致文本内容显示不全,如下所示: 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示: 这里只演示Vue3版本代码,Vue2版本不再演示 区别就在插槽使用上Vue3使用:#default“”;Vu…

R统计实战:详解机器学习Adaboost的操作步骤与应用

一、引言 机器学习是人工智能的核心领域之一,其重要性体现在其能够从数据中自动学习并改进的能力上。在实际问题中,机器学习已经被广泛应用于各个领域,包括但不限于金融、医疗、电子商务、社交网络等。例如,在金融领域&#xff0c…

spark shuffle 补充概念

spark shuffle 我们在前面的文章说过,所谓shuffle,就是spark RDD的一种宽依赖关系,父RDD的数据会发送给多个子RDD spark中Map和Reduce概念 在Shuffle过程中.提供数据的称之为Map端(Shuffle Write)接收数据的称之为Reduce端(Shuffle Read)&…

使用Excel连接Azure DevOps自动退出的问题

Azure DevOps Server (原名TFS)是微软公司的软件开发管理平台,也是著名的软件开发过程管理工具;系统中记录了软件开发过程中的需求、问题、缺陷和迭代计划等各种软件开发工作项数据。 对于工作项数据的批量操作(例如新增和编辑),Excel是一个非…

springcloud基本使用五(Gateway服务网关)

为什么使用网关? 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。 路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则&#xff…