• 2020年,最新NGINX的ngx_http_geoip2模块以精准禁止特定国家或者地区IP访问


    1.0 geoip2核心识别库

        安装geoip2 lib步骤:

    cd /usr/local/src
    rm -f libmaxminddb-1.4.2.tar.gz
    wget https://github.com/maxmind/libmaxminddb/releases/download/1.4.2/libmaxminddb-1.4.2.tar.gz
    tar -xzf libmaxminddb-1.4.2.tar.gz
    cd libmaxminddb-1.4.2
    yum install gcc gcc-c++ make -y
    ./configure
    make
    make check
    sudo make install
    
    echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
    sudo ldconfig

    2.0 下载ngx_http_geoip2_module 模块

    cd /usr/local/src
    wget https://github.com/leev/ngx_http_geoip2_module/archive/3.3.tar.gz
    tar -xzf 3.3.tar.gz
    mv ngx_http_geoip2_module-3.3 ngx_http_geoip2_module 

    nginx集成步骤:

    cd /usr/local/src
    wget http://nginx.org/download/nginx-1.16.1.tar.gz
    tar -zxf nginx-1.16.1.tar.gz
    cd nginx-1.16.1
    useradd -M -s /sbin/nologin www
    yum install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel -y ./configure --user=www --group=www --prefix=/usr/local/nginx --with-ld-opt="-Wl,-rpath -Wl,/usr/local/lib" --with-http_sub_module --with-http_realip_module --with-http_gzip_static_module --with-http_ssl_module --with-http_v2_module --add-module=/usr/local/src/ngx_http_geoip2_module make make install

    geoip2 IP地址库下载:

    2020年最新GeoLite2-City.mmdb 无法直接下载,必须注册maxmind账号
    
    01. 需要在maxmind 后台注册账号,并且生成Account/User ID 和 License key
    02. 安装geoipupdate, 下载地址https://github.com/maxmind/geoipupdate/releases
    03. 配置geoipupdate的GeoIP.conf , 填写maxmind账号的User ID 和 License key 和 EditionIDs
    
    博主使用的是centos 7
    安装如下
    cd /usr/local/src/
    wget https://github.com/maxmind/geoipupdate/releases/download/v4.2.0/geoipupdate_4.2.0_linux_amd64.rpm rpm -ivh geoipupdate_4.2.0_linux_amd64.rpm rpm -ql geoipupdate vi /etc/GeoIP.conf #填写AccountID XXXX #填写LicenseKey XXXX #EditionIDs可以不修改,系统默认有填 GeoLite2-Country GeoLite2-City #笔者EditionIDs只保留GeoLite2-City #保存退出 运行geoipupdate /usr/bin/geoipupdate cd /usr/share/GeoIP/ 会看到GeoLite2-City.mmdb 把GeoLite2-City.mmdb文件cp到需要使用的目录
    sudo mkdir -p /usr/local/nginx/geoip/
    cp -rf /usr/share/GeoIP/GeoLite2-City.mmdb /usr/local/nginx/geoip/maxmind-city.mmdb

    注意GeoLite2 City 和GeoLite2 Country 两个IP库,请下载City的mmdb数据文件,较于其他两者信息更丰富

    nginx 配置geoip2 样例,geoip2的配置字段在http

    http {
        ...
    geoip2 /usr/local/nginx/geoip/maxmind-city.mmdb {
        $geoip2_data_country_code default=US source=$remote_addr country iso_code;
        $geoip2_data_country_name country names en;
        $geoip2_data_city_name default=London city names en;
        $geoip2_data_province_name subdivisions 0 names en;
        $geoip2_data_province_isocode subdivisions 0 iso_code;
    }
        ....
    
        fastcgi_param COUNTRY_CODE $geoip2_data_country_code;
        fastcgi_param COUNTRY_NAME $geoip2_data_country_name;
        fastcgi_param CITY_NAME    $geoip2_data_city_name;
        ....
    }
    
    stream {
        ...
    geoip2 /usr/local/nginx/geoip/maxmind-city.mmdb {
        $geoip2_data_country_code default=US source=$remote_addr country iso_code;
        $geoip2_data_country_name country names en;
        $geoip2_data_city_name default=London city names en;
        $geoip2_data_province_name subdivisions 0 names en;
        $geoip2_data_province_isocode subdivisions 0 iso_code;
        }
        ...
    }

    nginx配置中的变量名如,geoip2_data_country_code,geoip2_data_country_name 等等,都是自定义的名称,可以加在日志字段中

    添加 Nginx 配置 获取访问者的IP和国家代码。

    location /get_ip {
        default_type text/plain;
        return 200 "$remote_addr $geoip2_data_country_code
    ";
    }

    3.0 在nginx 中配置黑名单国家的变量 $blacklist_country

    在http{} 字段,任何include之前,添加如下配置

    [...]
        map geoip2_data_country_code $allowed_country {
            default yes;
            US no;
            JP no;
            SG no;
        }
    [...]

    以上配置将允许所有的国家,除了美国,日本,和新加坡 (您可以查看所有国家代码的列表,点这里

    相反的,如果你想阻止所有国家,除了少数几个国家可以访问,请参考如下的配置

    [...]
        map geoip2_data_country_code $allowed_country {
            default no;
            CN yes;
            HK yes;
            US yes;
        }
    [...]

    现在,你做了如上配置,并不会阻止任何的国家,那只是设置了一个变量$allowed_country
    想要实际阻止国家/地区,必须修改vhost的配置
    把下面的代码放到server{}字段, 这个代码也可以放到location{}字段

    [...]
            if ($allowed_country = no) {
                return 403;
            }
    [...]

    任何从黑名单国家的用户访问,都会收到403错误代码,

    修改完配置,不要忘记reload nginx

    /usr/local/nginx/sbin/nginx -s reload

    4.0 通过如下命令可以直接本地查询IP信息

    /usr/local/bin/mmdblookup --file /usr/local/nginx/geoip/maxmind-city.mmdb --ip 8.8.8.8

    会出来许多信息,用json格式展示

      {
        "country":
          {
            "geoname_id":
              6252001 <uint32>
            "iso_code":
              "US" <utf8_string>
            "names":
              {
                "de":
                  "USA" <utf8_string>
                "en":
                  "United States" <utf8_string>
              }
          }
      }

    如果IP 后面可以跟不同的查询,如下面查询了国家的英文名

    /usr/local/bin/mmdblookup --file /usr/local/nginx/geoip/maxmind-city.mmdb --ip 8.8.8.8 country names en
      "United States" <utf8_string>
     
  • 相关阅读:
    每天备份数据库中的表
    IE9相容問題-childNodes行為改變
    查找含有某字符的存儲過程
    弹出SQL报表的时候,出现空白的解决方法
    转:Page.ClientScript.RegisterStartupScript(me.GetType(),"script1","<script>alert('111');</script>")
    java核心技术记录之java术语
    Head First 设计模式笔记:单例模式
    多对一关系实体中,多的一方所关联的一实体的实例化问题
    ajax请求返回json数据弹出下载框的解决方法
    java核心技术记录
  • 原文地址:https://www.cnblogs.com/faberbeta/p/nginx_geoip2.html
Copyright © 2020-2023  润新知