如何用Nginx实现对国家/城市以及指定IP的访问限制?

news2024/11/18 5:38:27

1.前言

在【如何用Nginx代理MySQL连接,并限制可访问IP】一文中,我们实现了通过Nginx代理MySQL连接,并限制了指定IP才能通过Nginx进行连接,以提高数据安全性。

该场景适用于根据具体的IP地址来进行访问限制,假如我们要上线一个新的功能,但是只想在某些地区进行小规模的测试,就无能为力了。

我们可以通过添加第三方模块ngx_http_geoip2_module来实现,其实Nginx也提供了ngx_http_geoip_module,至于我们为什么不使用它,我们后续揭晓。

2.限制指定IP

我们先来回顾一下,如何通过指定IP来进行访问限制。

Nginx提供了ngx_http_access_modulengx_stream_access_module模块,前者针对http请求,后者针对stream连接,它们的指令非常简单,仅包含allowdeny指令,唯一区别就是作用域不同。

我们这里就以ngx_http_access_module模块为例。

1)allow

该指令设置指定的IP允许访问。可以和deny指令配合使用

作用域:http, server, location, limit_except

语法:allow address | CIDR | unix: | all;

示例:

# 允许192.168.110.1访问
allow 192.168.110.1;

# 允许192.168.110.1到192.168.255.254
allow 192.168.110.0/16;

# 允许192.168.110.1到192.168.110.254
allow 192.168.110.0/24;

# 允许所有的IP访问
allow all;

2)deny

该指令设置指定的IP禁止访问。可以和allow指令配合使用。

作用域:http, server, location, limit_except

语法:deny address | CIDR | unix: | all;

# 禁止192.168.110.1访问
deny 192.168.110.1;

# 禁止192.168.110.1到192.168.255.254
deny 192.168.110.0/16;

# 禁止192.168.110.1到192.168.110.254
deny 192.168.110.0/24;

# 禁止所有的IP访问
deny all;

3)配置示例

禁止所有的IP访问,192.168.110.100除外。

http {
	server {
		listen 80;
		server_name localhost;
		allow 192.168.110.100;
		deny all;
	}
}

🔔Tips:如果指定了allow,需要配合deny使用,否则就是允许所有的IP地址访问。

3.限制国家/城市

前面我们提到了Nginx也提供了ngx_http_geoip_module来实现根据国家/城市进行访问限制。

官当文档:https://nginx.org/en/docs/http/ngx_http_geoip_module.html

从上图可以得知该模块需要maxmind的数据库,并且格式为.dat,那好,我们来看看maxmind提供的数据,如下图:

其格式为.mmdb,与该模块的数据格式不匹配,因此我们使用第三方模块ngx_http_geoip2_module

下载地址:https://github.com/leev/ngx_http_geoip2_module/archive/refs/heads/master.zip

3.1 安装maxminddb library

首先,我们需要安装用于读取.mmdb的文件的依赖。

apt install libmaxminddb0 libmaxminddb-dev mmdb-bin

3.2 构建模块

对于添加第三方模块,我们需要在configure时使用--add-module来实现。例如:

./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid --with-stream --add-module=/home/stone/nginx-1.22.1/module/ngx_http_geoip2_module

其余步骤,可参照【Nginx基本命令&不停机版本升级】一文进行,这里不再赘述。

3.3 GEOIP数据下载

下载地址(需注册账号):https://dev.maxmind.com/geoip/geolite2-free-geolocation-data

国家库:

城市库:

通过解压缩得到GeoLite2-Country.mmdbGeoLite2-City.mmdb数据库文件。

3.4 配置

3.4.1 初体验

在进行配置之前,我们先通过第一步安装的依赖库来体验一下。

mmdblookup --file /usr/local/nginx/GeoLite2-City.mmdb --ip 183.195.99.161

可以看到,其识别出这是一个来自上海的IP地址。

3.4.2 配置示例

接下来,我们开始配置。

http {
	include       mime.types;
	default_type  application/octet-stream;

	# 自定义日志格式
	log_format geoip '$http_x_forwarded_for_temp - $remote_user [$time_local] - $request - $status - $geoip2_country_name_en - $geoip2_city_name_en';

	geoip2 /usr/local/nginx/GeoLite2-Country.mmdb {
		auto_reload 5m;
		$geoip2_metadata_country_build metadata build_epoch;
		$geoip2_country_code source=$http_x_forwarded_for_temp country iso_code;
		$geoip2_country_name_en source=$http_x_forwarded_for_temp country names en;
		$geoip2_country_name_zh source=$http_x_forwarded_for_temp country names zh-CN;
	}

	geoip2 /usr/local/nginx/GeoLite2-City.mmdb {
		auto_reload 5m;
		$geoip2_city_name_en source=$http_x_forwarded_for_temp city names en;
		$geoip2_city_name_zh source=$http_x_forwarded_for_temp city names zh-CN;
	}

	server {

		listen       80;
		server_name  localhost;

		access_log logs/geoip.log geoip;
		default_type text/html;
		# 正则匹配取反
		if ($geoip2_city_name_en !~ 'Shanghai'){
			return 403 "<h1>Forbidden!</h1><p>You don't have permission to access the URL on this server.</p>";
		}

		location / {
			return 200 '<p>Real IP:  $http_x_forwarded_for_temp</p><p>Country:  $geoip2_country_name_en</p><p>City:  	$geoip2_city_name_en</p>';
		}
	}
}

🔔Tips:由于我们这里没有外网环境,因此使用$http_x_forwarded_for_temp变量来模拟,只需在请求头中加入X-Forwarded-For-Temp字段即可。实际环境还是使用$http_x_forwarded_for变量用来获取请求的真实IP。

3.4.3 实战

1)发起请求,X-Forwarded-For-Temp=183.195.99.161,上海IP,响应码200。

2)发起请求,X-Forwarded-For-Temp=221.192.127.124,唐山IP,响应码403。

3)日志记录:

以上就是Nginx限制可访问IP的全部内容,Nginx是多模块化的,还有很多高级功能,我们后面继续探索。

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

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

相关文章

synchronized优化原理

文章目录 一、Monitor1.1 Monitor结构 二、轻量级锁三、锁膨胀四、自旋优化五、偏向锁 一、Monitor Monitor的工作原理也是synchronized底层原理 每个Java对象都可以关联一个Monitor对象&#xff0c;如果使用synchronized给对象上锁之后&#xff0c;该对象头的MarkWord中就被设…

怎样从“点点点”进阶到自动化测试?

为什么要学习自动化测试 在讨论这个问题之前&#xff0c;先来聊一下测试人员的职业发展路线&#xff0c;无非就是两条&#xff0c;技术路线和管理路线&#xff0c;技术路线一般就是功能测试&#xff08;60%&#xff09;-->自动化测试&#xff08;25%&#xff09;-->测试…

fio引发的一些问题

fio引发的一些问题 奇怪的255扇区在nvme驱动中插入打印语句直接编译模块加载源码编译内核 查找内核源码 奇怪的255扇区 由于块设备驱动项目需要测试读写速度&#xff0c;故使用fio工具&#xff0c;没想着深入了解&#xff0c;简单测个速就可以 使用tldr命令得到测试磁盘读写的…

linux内核篇-文件系统(硬盘、虚拟文件系统、文件缓存)

文件系统的意义 之前说的都是在进程在物理内存保存的数据&#xff0c;内存就像一个纸箱子&#xff0c;仅仅是一个暂存数据的地方&#xff0c;而且空间有限。如果我们想要进程结束之后&#xff0c;数据依然能够保存下来&#xff0c;就不能只保存在内存里&#xff0c;而是应该保存…

Nacos-04-@RefreshScope自动刷新原理

Nacos动态刷新原理 Nacos做配置中心的时候&#xff0c;配置数据的交互模式是有服务端push推送的&#xff0c;还是客户端pull拉取的&#xff1f; 短轮询 不管服务端的配置是否发生变化&#xff0c;不停发起请求去获取配置&#xff0c;比如支付订单场景中前端JS不断轮询订单支…

hadoop启动,缺少RM的进程:Error starting ResourceManager【已解决】

Error starting ResourceManager【已解决】 现象解决思路报错内容解决总结 现象 Hadoop启动后 执行jps 查看进程&#xff0c;缺少了 ResourceManager 解决思路 start-all.sh分别会有五个日志产生 缺少哪个进程&#xff0c;就去看谁的日志 报错内容 resourcemanager的log文…

基于 Linux 下的生产者消费者模型

目录 传统艺能&#x1f60e;概念&#x1f618;特点&#x1f60d;优点&#x1f601;基于阻塞队列的生产者消费者模型&#x1f923;模拟实现&#x1f602;基于计算任务的生产者消费者模型&#x1f44c; 传统艺能&#x1f60e; 小编是双非本科大二菜鸟不赘述&#xff0c;欢迎米娜…

chatgpt赋能Python-python3_date

Python 3 Date介绍 Python 3是一种非常流行的编程语言&#xff0c;其中涉及到日期处理的功能非常强大。Python 3支持处理日期、时间和时间刻度&#xff0c;因此可以在各种情况下使用它来管理日期。 日期格式 Python 3支持多种日期格式&#xff0c;如下所示&#xff1a; “Y…

不怕得罪人地推荐这9本黑客书籍

[利益声明] 1、这9本都和我有些关系或缘分&#xff0c;也是我至少过了一遍的&#xff0c;虽然并没都仔细推敲&#xff0c;但是这些书&#xff0c;我还是不得不点个赞。 2、其中一本是我和 xisigr 写的:-)我并不觉得在这不能推荐&#xff0c;因为这本书毕竟卖得很好。 然后&am…

torch.nn.functional.normalize参数说明

torch.nn.functional.normalize参数说明 函数定义参数及功能官方说明三维数据实例解释参数dim0参数dim1参数dim2参数dim-1 参考博文及感谢 函数定义 torch.nn.functional.normalize(input, p2.0, dim1, eps1e-12, outNone) # type: (Tensor, float, int, float, Optional[Tens…

chatgpt赋能Python-python3_9怎么安装jieba库

Python3.9怎么安装jieba库 随着大数据时代的到来&#xff0c;中文分词是一个愈发重要的问题。而jieba是一个基于Python的中文分词工具包&#xff0c;具有高速、易用、解耦的特点&#xff0c;广受开发者的青睐。本文将介绍如何在Python3.9环境下安装jieba库。 什么是jieba库 …

微服务: Seata AT 分布式事务以及配置方式(上篇)

目录 前言简介: 1. 安装seata-at -> 1.1 先看版本, 全局搜一下 -> 1.2 版本说明 alibaba/spring-cloud-alibaba Wiki -> 1.3 选择seata-at版本 -> 1.4 下载后按照下图进行创建文件 ---> 1.4.0 先在nacos创建命名空间seata ---> 1.4.1 registry.conf…

Chrome 的骑士盾,谷歌 Security Princess 访谈

童话故事里的公主都有一种需要被保护的感觉&#xff0c;就像马里奥大叔在这么多年来都要在库巴手上拯救出碧姬公主一样。不过在谷歌的这位 Security Princess 却手执盾牌&#xff0c;守护着大家的 Chrome 浏览器免受恶意程序攻击。小编这次就乘着世界网络安全日的机会&#xff…

微信小程序-生命周期

为什么今天突然总结一下微信小程序的生命周期呢&#xff1f;因为突然发现这个知识点忘得有点干净。所以今天就看一下微信小程序的生命周期是怎么个事吧&#xff01; 目录 生命周期 生命周期的分类 生命周期函数的作用 生命周期函数的分类 生命周期是指一个对象从创建->…

Docker -- m1芯片 macOS 安装 nginx - 03

m1芯片 macOS 安装 nginx 一、安装docker提前准备二、下载nginx相关镜像三、运行相关容器四、运行并验证 一、安装docker提前准备 查看 d o c k e r \color{#FF7D00}{docker} docker版本&#xff1a;在 c o m m e n t \color{#FF7D00}{comment} comment 中输入 docker -version…

小红薯笔记/帖子采集工具

小红书【笔记/帖子】采集工具 链接&#xff1a; http://106.53.68.168:9920/xhs-keyword-spider 规则及操作 &#xff08;1&#xff09;规则&#xff1a; 按照关键词抓取规则&#xff1a;标题中或者正文内容中包含该关键词都能被抓取下来。多种搜索模式可选&#xff0c;分别…

字节跳动10年经验,10W字228道软件测试经典面试题总结(附答案)

前言 最近有很多粉丝问我&#xff0c;有什么方法能够快速提升自己&#xff0c;通过阿里、腾讯、字节跳动、京东等互联网大厂的面试&#xff0c;我觉得短时间提升自己最快的手段就是背面试题&#xff0c;最近总结了软件测试常用的面试题&#xff0c;分享给大家&#xff0c;希望…

【mpvue】小程序开发入门

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍mpvue的使用。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习知识&#xff0c;共同进步。 &#x1f95e;喜欢的朋友可以关注一下&#xff0c;下次更…

Atlassian攻略:如何将Jira和Confluence的数据平稳迁移上云

迁移到云端相当于一次专业的冒险旅⾏。过程中肯定会经历一些颠簸&#xff0c;但只要有正确的心态和充分的准备&#xff0c;您就能完美应对。最终的目的地一定会让你感觉值得。当Atlassian调查了最近迁移的客户时&#xff0c;有89%的客户表示在他们不到6个月的时间内就意识到了迁…

chatgpt赋能Python-python3_9_7怎么换行

Python3.9.7是一款强大的编程语言&#xff0c;它具有许多优点&#xff0c;例如易于学习和使用&#xff0c;适用于不同的应用程序&#xff0c;以及具有丰富的第三方库支持。但是&#xff0c;许多人可能会面临一个问题&#xff1a;如何在Python3.9.7中正确换行&#xff1f; 在本…