Nginx实践之使用MaxMind的GeoIP2实现处理不同国家的访问

news2024/12/23 19:59:42

场景:
因防火墙到期,原网站接入的需要回到公网的解析,经过分析,站点只需要国内访问。于是想到了用地址过滤,目前比较火的是nginx的allow和deny,另外一种是geoip,geoip2
区别:
GeoIP用于通过IP获取地理位置信息,但精度有限,更适用于大致定位。
GeoIP已经发展到GeoIP2,文件格式从.dat变为.mmdb。
MaxMind提供免费的GeoLite数据库,但已经停止更新GeoIP格式(.dat),只维护GeoIP2格式(.mmdb)。
GeoIP可以动态加载到Nginx等软件,GeoIP2需要重新编译。
GeoLite2是GeoIP2的免费版本,准确性较差,每周更新一次。
从2019年开始,GeoLite2数据库需要注册账户和License Key才能下载。
GeoIP的优点是可以动态加载到软件中,而GeoIP2需要重新编译。

需要的软件:
Nginx+GeoIP2:

nginx-1.22.0.tar.gz
libmaxminddb-1.6.0.tar.gz
ngx_http_geoip2_module-3.4.tar.gz
GeoLite2-City_20220802.tar.gz
GeoLite2-Country_20220802.tar.gz

=====
好的,把安装libmaxminddb库和编译Nginx with GeoIP2模块的两个脚本合并起来,注意顺序如下:

#!/bin/bash

# 安装libmaxminddb依赖
wget -c https://github.com/maxmind/libmaxminddb/releases/download/1.6.0/libmaxminddb-1.6.0.tar.gz
tar -zxvf libmaxminddb-1.6.0.tar.gz 
cd libmaxminddb-1.6.0
./configure
make && make install

# 配置动态库目录
tee -a /etc/ld.so.conf.d/libc.conf <<EOF
/usr/local/lib
EOF
ldconfig

# 创建Nginx目录 
mkdir /data/app/nginx -p

# 安装Nginx依赖
yum install gcc zlib-devel pcre-devel openssl-devel -y

# 下载和解压
wget http://nginx.org/download/nginx-1.22.0.tar.gz
tar xf nginx-1.22.0.tar.gz

# 下载和解压GeoIP2模块
wget -c https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.4.tar.gz -O ngx_http_geoip2_module-3.4.tar.gz
tar -zxf ngx_http_geoip2_module-3.4.tar.gz

# 编译配置
cd nginx-1.22.0/
./configure --with-http_ssl_module --add-module=../ngx_http_geoip2_module-3.4

# 编译、安装 
make && make install

# 设置PATH
export PATH=/data/app/nginx/sbin:$PATH

# 检查并启动
/data/app/nginx/sbin/nginx -t
/data/app/nginx/sbin/nginx

# 检查是否启动
netstat -nltp | grep nginx

主要注意点:

  1. 首先安装libmaxminddb库依赖

  2. 再编译包含GeoIP模块的Nginx

  3. Nginx编译需要GCC和相关开发库

  4. 设置PATH并启动Nginx

================

如果Nginx已经部署运行,只需要新增GeoIP模块,可以只重新编译并替换nginx二进制文件,无需完全重新安装。

具体操作步骤可以是:

  1. 备份当前运行的nginx二进制文件,例如 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

  2. 下载Nginx源码,解压到指定目录

  3. 配置时只添加GeoIP模块,例如:–add-module=ngx_http_geoip2_module-3.4

  4. 编译生成的nginx二进制文件会在nginx源码的objs目录下

  5. 拷贝objs/nginx到现有nginx的sbin目录下,覆盖原有二进制

  6. 重新加载nginx,加载新的模块

  7. 用nginx -V 确认模块加载成功

这种方式可以避免重复编译其他模块以及完全重新安装配置。只需要替换新增模块的二进制文件即可轻松实现模块热加载。

=============================================================

下载对应的数据库文件:
https://www.maxmind.com/en/accounts/902941/geoip/downloads
在这里插入图片描述
下载好之后,测试下
mmdblookup --file /usr/local/GeoIP2/GeoLite2-Country.mmdb --ip 8.8.8.8
在这里插入图片描述

验证GeoIP模块部署环境,我们需要针对nginx相关配置文件进行如下配置

1.在 nginx.conf 中进行如下几个关键部分配置。

load_module modules/ngx_http_geoip2_module.so;


user  deploy;
worker_processes  4;




events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
     
    geoip2 /usr/local/GeoIP2/GeoLite2-Country.mmdb {
    $geoip2_country_code country names en;
    $geoip2_data_country_code country iso_code;                  # CN
    $geoip2_data_country "default=中国" source=$remote_addr country names zh-CN;  # 中国
    $geoip2_data_country_continent continent names zh-CN;        # 亚洲

    }

    map  $geoip2_data_country_code $allowed_country {
        default no;
        CN yes;
    }

    
     # 定义新的日志格式geo_access,包含原有访问信息和GeoIP信息
  log_format geo_access '$remote_addr - $remote_user [$time_local] ' 
                    '"$request" $status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" $http_x_forwarded_for $request_time '
                    '$upstream_response_time $upstream_addr $http_host '
                    '$geoip2_data_country_code';
                    



    access_log  logs/access.log  geo_access;

变量要对应的上,server模块

    server {
        listen       80;
        listen 443 ssl;
        server_name  ban.test.com;
      
      #证书
        #ssl on;
        ssl_certificate /data/app/nginx/conf/ssl/server.pem;
        ssl_certificate_key /data/app/nginx/conf/ssl/server.key; 

        access_log  logs/host.access.log  geo_access;
        location / {
            if ($allowed_country = no) {
                return 403;
            }
}
}

日志打印:
在这里插入图片描述
tips: 范例

geoip2 /etc/maxmind/GeoLite2-Country.mmdb {
  $geoip2_data_country_code country iso_code;
}

server {
  if ($geoip2_data_country_code = CN) {
    rewrite ^ http://cn.example.com$request_uri?;
  }

  if ($geoip2_data_country_code = US) { 
    rewrite ^ http://us.example.com$request_uri?;
  }

  location / {
    proxy_pass http://default.example.com; 
  }
}

server {
...
location / {
     #本地网段白名单
     if ($allow-ip = yes ) {
           set $allowed_country yes;
     }
     #国家地区白名单
     if ($allowed_country = no) {
            return 403;
     }
     #指定国家跳转到指定域名
     if ($geoip2_data_country_code = CN) {
         return 301 https://www.domain.cn$request_uri;
     }
  }
...
}


#允许本地网段访问
    geo $allow-ip{
        default no;
        192.168.10.0/24

港澳台地区:
map $geoip2_data_country_code $CN {
    CN yes;
    TW yes;
    HK yes;
    MO yes;
    default no;       
  }

达到效果了,国内访问200.国外访问403,city模块也可以使用,具体的暂时还未用到。
总结:要修改日志格式,以及nginx的版本和模块的版本不要相差太远

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

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

相关文章

ssm班主任助理系统源码和论文

ssm班主任助理系统源码和论文054 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1、课题背景 由于当今社会科学技术不断发展,科学技术不断发展&#xff0c;21世纪的今天是一个讲究质量和效率的时代&#xff0…

8、Vue 核心技术与实战 智慧商城项目 DAY8~10

1、 项目演示 2、 项目收获 3、 创建项目 4、调整初始化目录 1、删掉&#xff08;1&#xff09;assets中的文件&#xff08;2&#xff09;components中的文件&#xff08;3&#xff09;views中的文件2、(1)修改路由配置&#xff0c;默认的路由是个空数组即可&#xff0c;把路由…

医疗中心疫苗保存,隐藏这招你不知道的技法!

由于疫苗对温度敏感&#xff0c;如果没有在规定温湿度下储存&#xff0c;疫苗的药性很可能发生改变&#xff0c;从疫苗制造的部门到疫苗使用的现场之间的每一个环节&#xff0c;都可能因温度过高而失效。 为了保证从生产、贮存、运输、分发到使用的整个过程中&#xff0c;疫苗始…

销售客户拜访时要获取客户的哪些信息?

俗话说“马无夜草不肥”&#xff0c;信息是销售过程中的关键&#xff0c;谁拿下了信息战谁就占据了市场的制高点。 只有深入了解客户各方面信息&#xff0c;才能有针对性地提供解决方案并达成销售目标。根据我们团队的多年经验&#xff0c;我总结出了两个需要重点考虑的方面&a…

OLED透明屏费用分析报告:尺寸和分辨率对价格的影响

OLED透明屏作为一项创新的显示技术&#xff0c;其透明度和高清晰度的特点使其在各个领域得到了广泛应用。 然而&#xff0c;对于许多人来说&#xff0c;了解OLED透明屏的费用以及其性价比是购买和应用该技术时的重要考虑因素。 本文将通过相关数据和报告&#xff0c;详细介绍…

什么是自助服务知识库?

自助服务知识库是一个自助式客户服务库&#xff0c;其中包含有关产品、服务或主题的内容。通常&#xff0c;它是公司自助服务门户或网站的一部分。 客户每次需要查找产品相关问题的答案、产品使用/故障排除的分步指导或了解有关公司产品的更多信息时&#xff0c;都可以访问知识…

PHP实践:获取网络上图片的长宽以及图片类型

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…

高温老化实验箱选什么软件好

为什么要使用老化监控软件采集数据&#xff0c;老化房老化室软件的十大优点如下&#xff1a; 1. 自动化控制&#xff1a;老化室软件可以实现对老化房的自动化控制&#xff0c;无需人工干预&#xff0c;提高了老化过程的准确性和稳定性。 2. 精确的参数设置&#xff1a;软件可以…

长胜证券:ETF规模持续增长!增量资金加速入市,正“借道埋伏”A股

据了解&#xff0c;ETF是助力普惠金融、服务居民财富办理的重要产品。ETF产品参加门槛较低&#xff0c;且费率较低&#xff0c;便于投资者买卖。ETF产品不断创新&#xff0c;不断满意投资者日益增加的财富办理需求&#xff0c;已成为一般投资者共享我国资本商场开展红利的重要方…

RTSP流媒体服务器EasyNVR安防视频云平台视频流分享到iOS设备上但画面出现拉伸的问题解决方案

EasyNVR是基于RTSP/Onvif协议的视频接入、处理及分发的安防视频云平台&#xff0c;可提供丰富且灵活的视频能力&#xff0c;包括&#xff1a;设备接入、实时视频直播、录像、云存储、录像回放与检索、告警、级联等。平台部署轻快、功能强大&#xff0c;在安防视频监控领域有着广…

【LeetCode75】第三十五题 统计二叉树中好节点的数目

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一棵二叉树&#xff0c;让我们统计这棵二叉树中好节点的数目。 那么什么是好节点&#xff0c;题目中给出定义&#xff0c;从根节点…

如何提取视频的音频到手机?这个音频提取方法很简单

提取视频中的音频可以帮助您获得视频的声音部分&#xff0c;而无需观看整个视频。这对于那些只想听视频的声音或想将视频的声音与其他音频内容混合使用的人来说非常方便。此外&#xff0c;提取音频也可以为需要创建音频剪辑或混音的音频制作者提供帮助。那么怎么提取呢&#xf…

创建git项目并提交

1.创建仓库 2.点击创建 3复制gitee码云的HttpS连接 4 提交上传 打开项目并点击菜单栏上的【CVS】–》【Import into version control】–》【Create Git Repository】创建本地仓库 在打开的【Create Git Repository】对话框内选择本地仓库的位置&#xff0c;这里我选择…

如何在Pandas中根据条件替换列中的值

错误语法&#xff1a;data["当日平均温"].loc[data["当日平均温"] > ub] ub 正确语法&#xff1a;df.loc[ df["column_name"] "some_value", "column_name" ] "value" dataframe.loc[]函数可以用一个条件…

全头条最详细——通达信指标公式大全-神奇指标网

市净率越低公司股价越有被低估的可能这类股票从理论上讲具有更高的安全性 全头条最详细——通达信指标公式大全 一、K线的基本形态 1、当天收阳&#xff1a;CLOSE&#xff1e;OPEN&#xff1b; 2、当天收阴&#xff1a;CLOSE&#xff1c;OPEN&#xff1b; 3、当天股价高开&…

javaWeb第一课

前言&#xff1a; 先来说说本来写完了的聊天室的项目&#xff0c;然后后面凡尔赛不小心改错了的然后一个上午才发现的问题&#xff0c;真的很有必要总结一下&#xff0c;气死我了&#xff1a;关于要将这个ArrayList的某个类型要转换为数组&#xff0c;我刚开始这么写的&#x…

Python(八十五)格式化字符串

❤️ 专栏简介&#xff1a;本专栏记录了我个人从零开始学习Python编程的过程。在这个专栏中&#xff0c;我将分享我在学习Python的过程中的学习笔记、学习路线以及各个知识点。 ☀️ 专栏适用人群 &#xff1a;本专栏适用于希望学习Python编程的初学者和有一定编程基础的人。无…

【算法】手把手学会二分查找

目录 简介 基本步骤 第一种二分 第二种二分 例题 搜索插入位置 数的范围 总结 简介 &#x1f965;二分查找&#xff0c;又叫折半查找&#xff0c;通过找到数据二段性每次都能将原来的数据筛选掉一半&#xff0c;通过这个算法我们能够将一个一个查找的 O(n) 的时间复杂…

从头搭建一个基于webpack的项目

从头搭建一个基于webpack的项目 一、起步 1、创建目录&#xff0c;初始化npm&#xff0c;安装webpack mkdir vue3-spa-templatecd vue3-spa-templatenpm init -ynpm install webpack webpack-cli --save-dev备注&#xff1a;在安装一个 package时&#xff0c;此 package 要…

一篇文章告诉你,为什么要使用Javascript流程图来可视化进程?(下)

DHTMLX Diagram库是有各种类型的图组成的&#xff0c;其中最广泛使用的是JavaScript流程图&#xff0c;它可以显示任何类型的的工作流、过程或系统&#xff0c;您可以下载DHTMLX Diagram的评估版并亲自试用。 在上文中&#xff08;点击这里回顾>>&#xff09;&#xff0…