GeoIP2 ngx_http_geoip2_module 屏蔽指定城市或国家访问网站

为什么要研究这个东西,因为公司要上线一个网站。要把国内和国外的网站区分开,禁止同行或者竞争对手访问。公司也有外贸业务,网站上针对外贸的资料比较多一点,国内一般有人跟进所以网站放的资料也相对少一点。度娘谷歌了一下好多外贸网站都是这么干的。最初不知道在什么地方看到 GeoIP 分国家和城市屏蔽IP访问,但是看了几篇文章说GeoIP官方已经停止了开发,已经下载不到了。现在有 GeoIP2 但是没有 nginx 模块,还好有大神做了这个 ngx_http_geoip2_module 废话不多说开始;

0x01 安装 libmaxminddb 库

装 libmaxminddb 库,这个是用来读取ip数据文件的。也是主要组件,下载到任意目录即可,我这里在root

cd /root
wget https://github.com/maxmind/libmaxminddb/releases/download/1.3.2/libmaxminddb-1.3.2.tar.gz    # 下载 libmaxminddb 库,最新的已经构建好的,当然你也可以自己构建一个;
tar -xzf libmaxminddb-1.3.2.tar.gz     # 解压到当前目录;
cd libmaxminddb-1.3.2    # 进入到解压的目录;
./configure    # 开始安装,当然也有参数具体参数查看 ./configure --help ;
make    # 编译程序;
make check    # 编译检查,这一步可以跳过;
make install    # 编译安装;
ldconfig    #  连接动态库;

0x02 下载 ngx_http_geoip2_module

由于GeoIP 没有提供,但是Github上已经有大神做好,我们只需要下载下来用即可,所以没事还是去Github逛逛,有很多好玩的。我的服务器环境是LNMP1.6;

# 把 ngx_http_geoip2_module 下载到lnmp1.6/src目录,具体根据自己的情况来;
cd /root/lnmp1.6/src
wget https://github.com/leev/ngx_http_geoip2_module/archive/3.2.tar.gz    # 下载 ngx_http_geoip2_module ;
tar -xzf 3.2.tar.gz    # 解压到当前文件夹;
Nginx_Modules_Options='--add-module=/root/lnmp1.6/src/ngx_http_geoip2_module-3.2'     # 编辑 lnmp.conf ;
./upgrade.sh nginx    # 升级 Nginx 脚本;
nginx -V 2>&1 | grep -o ngx_http_geoip2_module    # 验证模块是否编译成功,出现ngx_http_geoip2_module 说明成功;

0x03 下载 GeoIP 数据库文件

mkdir /root/geoip    # 在 root 目录创建geoip目录;
cd /root/geoip    # 进入到 geioip 目录;
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz    # 下载城市 IP 数据库文件;
wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz    # 下载国家 IP 数据库文件;
tar -xzf GeoLite2-City.tar.gz    # 解压城市 IP 数据库文件;
tar -xzf GeoLite2-Country.tar.gz    # 解压国家 IP 数据库文件;
mv GeoLite2-City/GeoLite2-City.mmdb   /root/geoip    # 将 GeoLite2-City.mmdb 移动到 /root/geoip 目录;
mv GeoLite2-Country/GeoLite2-Country.mmdb /root/geoip    # 将 GeoL untry.mmdb 移动到 /root/geoip 目录;

0x04 配置Nginx.conf

这一步我们需要配置 Nginx.conf 文件,lnmp1.6的文件路径为:/usr/local/nginx/conf/nginx.conf,将一下代码添加到 nginx.conf 的http段;代码中有很多的参数可选,具体自行搜索,这里我选择能达到我要求的即可;

        geoip2 /root/geoip/GeoLite2-Country.mmdb {
                $geoip2_data_country_code country iso_code;
                }
        map $geoip2_data_country_code $allowed_country {
                default yes;    # 默认允许访问;
                CN no;    # 禁止 CN 访问;
        }

0x05 配置站点 Nginx conf 文件

这里是最后一步,lnmp站的的配置文件路径为:/usr/local/nginx/conf/vhost/www.xxx.com.conf;将一下代码插入到server { } 即可;

# 以下代码 # 以后为注释,实际使用请去掉,免得出现未知错误;
        location / {
        if ($allowed_country = no) {    # 判断 等于 no 的国家;
        return https://www.xxrj.net;    # 如果 IP 属于 CN 跳转到我的博客,这个自定义;
        return /home/wwwroot/www.xxx.cn;  # 可以跳转到同服务器的其他目录;
        return 404;    # 直接显示404,三个 return 选择一个即可;
          }
        }
相关推荐
python ERROR: Command errored out with exit status 1:
Windows Server 2016 搭建 SMB 共享文件
Windows Server 2019 域环境搭建 SMB 共享文件服务
Parallels Desktop 15.1.3