如果我们用Cloudfalre来实现禁止特定国家的ip访问,就简单很多,如果网站是Nginx,则可以直接使用ngx_http_geoip2模块,该模块可以精确到国家、省、市等一级的IP,并且全部由Nginx执行识别和阻止访问,但是Nginx编译起来比较费事。
因为大鸟用的是宝塔面板,如果是专业版防火墙插件里面有禁止国外访问,禁止中国大陆以外的地区访问站点。不过大鸟觉得也不是太好用。
推荐文章: 宝塔面板利用Cloudflare在nginx中屏蔽所有来自国外的IP地址访问
这篇文章,我们来说说如何编译ngx_http_geoip2模块来阻止特定IP地址访问网站。以下以 Nginx + geoip2为例,基于宝塔面板6.8.9。
一:安装geoip2扩展依赖
yum install libmaxminddb-devel -y
安装好之后如图:
二:下载ngx_http_geoip2_module
这里我们需要下载ngx_http_geoip2模块,下载命令:
git clone https://github.com/leev/ngx_http_geoip2_module.git
若是压缩包请解压,此处直接从git拉取,可以看到源码目录,可以用[code]ls[/code]命令来查看文件是否完整,如图:
2.1进入目录检查文件完整性
进入此目录看下文件是否完整,如图:
共有5个文件,这稍微注意下。
2.2输入pwd 获取源码目录路径
因为编译的时候需要路径,所以我们可以用[code]pwd[/code]命令来查看文件路径,如图:
三:编译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,如图:
四:编译Nginx
重新编译Nginx,我们需要选择好自己的版本,大鸟的是Nginx1.15.8。命令如下:
sh /www/server/panel/install/nginx.sh install 1.15
安静等待编译完成。安装完成输入nginx -V 检查编译参数 如图:
已经看到了geoip2,编译完成。
五:验证是否启用成功
安装好之后,基本就可以使用了,不过要验证是否成功启用模块,可以使用如下命令:
ldd /www/server/nginx/sbin/nginx
有显示如上字样说明安装成功。如图:
六:修改配置
模块安装成功后,还要在 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/ 里面用远程下载的方式来下载,如图:
找到数据库文件,并且下载好数据库之后,就要修改 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; }
如图过不会,可以看图:
站点的server段里面加一下代码拒绝所有不是国内ip:
if ($allowed_country = no) { return 403; }
这段规则是默认拒绝,只允许中国,可以根据情况调整。如果不会放可以看图:
最后效果如下:
七:总结
网络上Nginx + GeoIP 的教程比较多,大家如果需要可以自行搜索,大鸟这篇文章是基于Nginx + GeoIP2,稍稍有点不一样,但是肯定是GeoIP2的效果会优秀点,而且基于Nginx 端的拦截也非常节省资源。Nginx的Geo IP模块应用范围比较广泛,结合Nginx你可以实现对不同的IP用户展现不同的内容。
由于 IP 广播泛滥,所以 GeoIP 并不是那么准确,如果觉得 GeoIP 库太旧了,可以自行到官网下载最新版,将上述配置的路径改一下即可。
GeoIP不光可以屏蔽国家,还可以屏蔽身份、城市,如果有需要可以自行了解。