当前位置: 首页> 健康> 养生 > 使用 Nginx + GeoIP2 获取客户端地理位置及限制指定地区访问

使用 Nginx + GeoIP2 获取客户端地理位置及限制指定地区访问

时间:2025/8/27 1:55:03来源:https://blog.csdn.net/weimeilayer/article/details/140179610 浏览次数:0次

要实现防火墙只允许单个城市的访问,您可以采取以下几种方法:

1、IP地理位置过滤:
使用GeoIP数据库(如MaxMind的GeoIP2)来确定IP地址的地理位置。
配置防火墙规则,只允许来自特定城市的IP地址访问。
2、内容分发网络(CDN):
使用支持GeoIP过滤的CDN服务,如Cloudflare。
配置CDN规则,只允许来自特定城市的请求。
3、反向代理服务器:
在反向代理服务器上配置GeoIP模块,如Nginx的ngx_http_geoip2_module。
配置规则,只允许来自特定城市的请求通过。
4、Web应用防火墙(WAF):
使用支持GeoIP功能的WAF,如ModSecurity。
配置规则,只允许来自特定城市的请求。

要在Nginx中使用GeoIP2模块获取客户端的地理位置并限制访问到指定地区(如重庆),可以按照以下步骤进行配置。
准备工作
首先需要安装 ngx_http_geoip2_module 模块,注意和官方文档中的 ngx_http_geoip_module 模块是不一样的,区别在于后者不支持新的 GeoIP2 数据库。文档中列出了详细的编译步骤这里就不赘述,编译和运行都需要 libmaxminddb 库;也可以使用 nginx-geoip2 镜像 进行容器化部署,该镜像支持在stream 指令中使用 geoip2。
源码:https://github.com/mandala5741/GeoIP2-CN
安装好 ngx_http_geoip2_module 模块后还需要下载 [GeoIP2 数据库](https://dev.maxmind.com/geoip/geolite2-free-geolocation-data),注册好账号后即可免费下载,注意要选择 mmdb 格式的数据库,如需获取客户端的城市信息要选择 City 数据库下载:
也可以直接去镜像站下载:https://download.lin2ur.cn/GeoLite2/
在这里插入图片描述
安装GeoIP2模块和数据库

首先,您需要安装GeoIP2模块及其所需的数据库文件。

对于Ubuntu/Debian系统:

sudo apt-get update
sudo apt-get install nginx-module-geoip2
sudo apt-get install libnginx-mod-http-geoip2
sudo wget -O https://download.lin2ur.cn/GeoLite2/GeoLite2-City_20240628.tar.gz
sudo tar -zxf GeoLite2-City_20240628.tar.gz
sudo mv GeoLite2-City.mmdb /usr/share/GeoIP/GeoLite2-City.mmdb

对于CentOS/RHEL系统:

sudo yum install nginx-module-geoip2
sudo wget -O https://download.lin2ur.cn/GeoLite2/GeoLite2-City_20240628.tar.gz
sudo tar -zxf GeoLite2-City_20240628.tar.gz
sudo mv GeoLite2-City.mmdb /usr/share/GeoIP/GeoLite2-City.mmdb

步骤 2: 配置Nginx
编辑Nginx配置文件

打开Nginx配置文件(例如 /etc/nginx/nginx.conf 或者 /etc/nginx/conf.d/default.conf),并添加GeoIP2配置来设置GeoIP2模块的路径,以及配置地理位置访问规则。

http {# 加载GeoIP2模块load_module modules/ngx_http_geoip2_module.so;# 配置GeoIP2数据库路径geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {$geoip2_city_name city names en;$geoip2_country_name country names en;}# 配置限制规则map $geoip2_city_name $allow_access {default no;"Chongqing" yes;  # 允许来自重庆的访问}server {listen 80;server_name example.com;if ($allow_access = no) {return 403;  # 拒绝所有非重庆的访问}location / {proxy_pass http://backend_server;}}
}

这个配置做了以下几件事情:
加载了GeoIP2模块。
配置了GeoIP2数据库的路径。
通过 $geoip2_city_name 获取城市名称,并根据城市名称设置 $allow_access 变量。
如果 $allow_access 变量是 no,则返回403错误,拒绝访问。

步骤 3: 然后重启Nginx
重启有很多种方式,k8s或者docker 或者宿主机部署的,需要自己去根据环境解决,容器化的只需要复制到容器即可。

进阶配置
如果您需要更复杂的地理位置控制(例如,允许多个城市或国家),可以在map指令中添加更多的条件,或者使用更复杂的GeoIP2数据库配置。

map $geoip2_city_name $allow_access {default no;"Chongqing" yes;"Beijing" yes;"Shanghai" yes;
}
关键字:使用 Nginx + GeoIP2 获取客户端地理位置及限制指定地区访问

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: