宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

宝塔面板1 字数 2199阅读模式

如果我们用Cloudfalre来实现禁止特定国家的ip访问,就简单很多,如果网站是Nginx,则可以直接使用ngx_http_geoip2模块,该模块可以精确到国家、省、市等一级的IP,并且全部由Nginx执行识别和阻止访问,但是Nginx编译起来比较费事。

因为大鸟用的是宝塔面板,如果是专业版防火墙插件里面有禁止国外访问,禁止中国大陆以外的地区访问站点。不过大鸟觉得也不是太好用。

这篇文章,我们来说说如何编译ngx_http_geoip2模块来阻止特定IP地址访问网站。以下以 Nginx + geoip2为例,基于宝塔面板6.8.9。

一:安装geoip2扩展依赖

yum install libmaxminddb-devel -y

安装好之后如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

二:下载ngx_http_geoip2_module

这里我们需要下载ngx_http_geoip2模块,下载命令:

git clone https://github.com/leev/ngx_http_geoip2_module.git

若是压缩包请解压,此处直接从git拉取,可以看到源码目录,可以用[code]ls[/code]命令来查看文件是否完整,如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

2.1进入目录检查文件完整性

进入此目录看下文件是否完整,如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

共有5个文件,这稍微注意下。

2.2输入pwd 获取源码目录路径

因为编译的时候需要路径,所以我们可以用[code]pwd[/code]命令来查看文件路径,如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

三:编译Nginx

这里可以直接vi编辑,命令如下:

vi /www/server/panel/install/nginx.sh

如果是Nginx 1.15.8在167行即可找到。,在./configure后面添加如下命令即可。

--add-module=/root/ngx_http_geoip2_module

大鸟这里用宝塔面板编辑nginx.sh文件,路径:/www/server/panel/install

在./configure后面添加如下命令即可:--add-module=/root/ngx_http_geoip2_module,如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

四:编译Nginx

重新编译Nginx,我们需要选择好自己的版本,大鸟的是Nginx1.15.8。命令如下:

sh /www/server/panel/install/nginx.sh install 1.15

安静等待编译完成。安装完成输入nginx -V 检查编译参数 如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

已经看到了geoip2,编译完成。

五:验证是否启用成功

安装好之后,基本就可以使用了,不过要验证是否成功启用模块,可以使用如下命令:

ldd /www/server/nginx/sbin/nginx

有显示如上字样说明安装成功。如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

六:修改配置

模块安装成功后,还要在 Nginx 里指定数据库,在安装运行库时默认安装了两个,位于 /usr/share/GeoIP/ 目录下,一个只有 IPv4,一个包含 IPv4 和 IPv6:

# ls /usr/share/GeoIP/
GeoIP.dat  GeoIP-initial.dat  GeoIPv6.dat  GeoIPv6-initial.dat

数据库地址:

http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz

http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

我这是放在 /usr/local/share/GeoIP/ 里面。

这两个数据库,我们直接可以 在/usr/local/share/GeoIP/ 里面用远程下载的方式来下载,如图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

找到数据库文件,并且下载好数据库之后,就要修改 nginx 配置,因为geoip2和geoip是不一样的,我们可以在 http 段增加国家代码的map映射:

        geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    		$geoip2_data_country_code country iso_code;
  		}
        map $geoip2_data_country_code $allowed_country {
         default no;
         CN yes;
        }

如图过不会,可以看图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

站点的server段里面加一下代码拒绝所有不是国内ip:

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

这段规则是默认拒绝,只允许中国,可以根据情况调整。如果不会放可以看图:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

 

最后效果如下:

宝塔面板编译添加第三方模块(ngx_http_geoip2)-禁止特定国家IP访问

七:总结

网络上Nginx + GeoIP 的教程比较多,大家如果需要可以自行搜索,大鸟这篇文章是基于Nginx + GeoIP2,稍稍有点不一样,但是肯定是GeoIP2的效果会优秀点,而且基于Nginx 端的拦截也非常节省资源。Nginx的Geo IP模块应用范围比较广泛,结合Nginx你可以实现对不同的IP用户展现不同的内容。

由于 IP 广播泛滥,所以 GeoIP 并不是那么准确,如果觉得 GeoIP 库太旧了,可以自行到官网下载最新版,将上述配置的路径改一下即可。

GeoIP不光可以屏蔽国家,还可以屏蔽身份、城市,如果有需要可以自行了解。

weinxin
我的微信
微信公众号
关注大鸟博客公众号
 
大鸟
    • loser
      loser 0

      建议博主更新 nginx-ipip-module 的教程,GeoIP 的 城市 ip 库 错误率90%

    匿名

    发表评论

    匿名网友

    :?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

    确定