当前位置 主页 > 服务器问题 > nginx问题汇总 > 最大化 缩小

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

    栏目:nginx问题汇总 时间:2018-10-12 16:02

    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;