如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)

admin 2024年8月2日16:27:31评论68 views字数 2361阅读7分52秒阅读模式
需求:对网站的信息,比如某个访问节点不想国内或者国外的用户使用,禁止国内或者国外或者精确到某个城市的那种情况。
解决方式:
1.Cloudfalre来实现禁止特定国家的ip访问,比较简单,但是需要money!!!
2.nginx,直接使用geoip模块,现在我们使用最新的ngx_http_geoip2,该模块可以精确到国家、省、市等一级的IP,并且全部由Nginx执行识别和阻止访问,但是Nginx编译起来比较费事。
最终解决方式,使用nginx的geoip模块:

部署操作:

一:安装geoip2扩展依赖

安装 libmaxminddb 库,这个是用来读取ip数据文件的。
yum install libmaxminddb-devel -y
如果没有yum源直接使用源码编译
下载 https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz
解压依次执行:
./configuremakemake installecho /usr/local/lib  >> /etc/ld.so.conf.d/local.confldconfig

二:下载ngx_http_geoip2_module

git clone https://github.com/leev/ngx_http_geoip2_module.git

注意要是没有git的话就自己在网上下了然后直接拖到服务器上也行,不过注意格式。

三:查看模块的完整性

查看模块的完整性,将下载好的模块放到指定目录下,方便nginx编译时指定路径,我是放到/usr/local/src/下面的。

如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)

四:编译nginx并检查模块是否安装成功

nginx建议选择最新版本,我选的是1.18。

注意:在编译时,我们只要加上--add-module=/usr/local/src/ngx_http_geoip2_module这个参数或者命令就行了,注意一定要加上额,不加等于没有geoip模块,就更没有这个功能了,为了简化,具体的nginx编译参数我就不写了,如下。

./configure --add-module=/usr/local/ngx_http_geoip2_module --user=www --group=www --prefix=......................................

之后的功能make && make install 等照常规流程来就行了,如果是之前已经安装过nginx只是后来想添加上geoip这个模块执行make后就不需要执行make install命令。
nginx整体安装完就检查下模块是否都有:

如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)

五:验证是否成功

ldd ldd /usr/bin/nginx

如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)

六:修改nginx配置

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

如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)

数据库地址:

GeoIP是一种数据库,用于将IP地址映射到地理位置信息。它可以提供IP地址的国家、地区、城市、经度和纬度等详细信息。GeoIP数据库通常由专业的地理位置数据提供商收集和维护,以便网站、应用程序和系统能够根据用户的IP地址提供定位服务。
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gzwget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

修改nginx配置文件,因为geoip2和geoip是不一样的,我们可以在 http 段增加国家代码的map映射:

在http端中添加如下代码:

geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {$geoip2_data_country_code country iso_code;}map $geoip2_data_country_code $allowed_country { default yes; CN no; }#geoIP的白名单geo $remote_addr $ip_whitelist {    default 0;    include ip.conf;}

站点的server段里面加一下代码拒绝所有不是国内ip:

    if ($ip_whitelist = 1) {       break;    }   if ($allowed_country = yes)    { return 403; }

这里显示的是允许国内的ip访问,国外直接返回403。
在 conf 下新建一个 ip.conf 作为 Geoip 的白名单,支持 ip 段,内容和格式为:

8.8.8.8 1;8.8.8.8/24 1;

这样就配置好了 nginx, 并且通过 GeoIP 限制了国家和城市的访问,并且支持白名单。

七:测试
在国内可以访问网站,在国外访问失败。

如此测试,是成功了的,如果是相反的,禁止国内访问, 那么server段里if ($allowed_country = yes) { return 403; }的yes改成no即可。

总结:

由于 IP 广播泛滥,所以 GeoIP 并不是那么准确,如果觉得 GeoIP 库太旧了,需要自行到官网下载最新版,将上述配置的路径改一下即可。(这个要持续更新的)
有兴趣的粉丝可以看看下面开源工具:
https://github.com/Hackl0us/GeoIP2-CN
可以去更新最新库
GeoIP不光可以屏蔽国家,还可以屏蔽身份、城市,如果有需要可以自己研究下。

原文始发于微信公众号(三沐数安):如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月2日16:27:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   如何使用nginx精准禁止特定国家或者地区IP访问和设置白名单(回复粉)https://cn-sec.com/archives/3026633.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息