首页 > 网站 > Nginx > 正文

Nginx服务器中配置GeoIP模块来拦截指定国家IP

2024-08-30 12:22:04
字体:
来源:转载
供稿:网友
Nginx中自带GeoIP模块可以屏蔽指定IP的请求,只不过默认没有被编译,打开以后我们只要再下载一个IP规则就行,Nginx服务器中配置GeoIP模块来拦截指定国家IP

最近有一个网站项目需求:需要屏蔽国内的方问请求。花时间研究了一下这方面的资料。目前找到的最佳方法就是使用 Nginx 的 GeoIP 模块来实现地区的识别。然后配置相关国家的 ISO 名称,禁止访问即可。记录一下相关过程。

编译 GeoIP 组件

maxmind 提供的免费版数据库已经可以满足需求,在使用数据库前,需要先编译 GeoIP 组件:

wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP-1.4.8.tar.gz./configuremakemake install

下载 IP 库

从 maxmind 下载 IP 数据包并解压。 这个是国家的ip数据包:

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gzgunzip GeoIP.dat.gz

这个是城市的ip数据包:

wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gzgunzip GeoLiteCity.dat.gz

执行完上面的命令后,会得到 GeoIP.dat 和 GeoLiteCity.dat 文件。将这两个文件复制到 Nginx 的 conf 目录。

编译 Nginx

nginx默认不编译这个模块,需要开启--with-http_geoip_module编译选项。

模块依赖MaxMind GeoIP库。

配置 Nginx

接下来就需要配置 Nginx,首先需要在 Nginx 配置文件中的 http 区块中加载 GeoIP 的数据包:

geoip_country GeoIP.dat;geoip_city GeoLiteCity.dat;

禁止国家访问

只需要在网站的 Nginx 配置中加入下面的示例的代码:

if ($geoip_country_code = CN) {  deny all;}

上面的配置表示只要是国内的 IP,就拒绝访问。

GeoIP 组件配置项参考

GeoIP 中跟国家相关的变量:

$geoip_country_code #两位字符的英文国家码。如:CN, US$geoip_country_code3 #三位字符的英文国家码。如:CHN, USA$geoip_country_name #国家英文全称。如:China, United States

GeoIP 中跟国家下级区域相关的变量:

$geoip_city_country_code #也是两位字符的英文国家码。$geoip_city_country_code3 #上同$geoip_city_country_name #上同.$geoip_region #这个经测试是两位数的数字,如杭州是02, 上海是 23。但是没有搜到相关资料,希望知道的朋友留言告之。$geoip_city #城市的英文名称。如:Hangzhou$geoip_postal_code #城市的邮政编码。经测试,国内这字段为空$geoip_city_continent_code #不知什么用途,国内好像都是AS$geoip_latitude #纬度$geoip_longitude #经度

在 php 中测试 GeoIP

首先需要在 fastcgi_params 或 fastcgi.conf 中引入 GeoIP 的属性:

fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;fastcgi_param GEOIP_CITY_COUNTRY_CODE $geoip_city_country_code;fastcgi_param GEOIP_CITY_COUNTRY_CODE3 $geoip_city_country_code3;fastcgi_param GEOIP_CITY_COUNTRY_NAME $geoip_city_country_name;fastcgi_param GEOIP_REGION $geoip_region;fastcgi_param GEOIP_CITY $geoip_city;fastcgi_param GEOIP_POSTAL_CODE $geoip_postal_code;fastcgi_param GEOIP_CITY_CONTINENT_CODE $geoip_city_continent_code;fastcgi_param GEOIP_LATITUDE $geoip_latitude;fastcgi_param GEOIP_LONGITUDE $geoip_longitude;
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表