安基网 首页 系统 Web技术 查看内容

NGINX:nginx精准禁止特定国家或者地区IP访问

2019-10-8 11:39| 投稿: xiaotiger |来自: 互联网


免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

摘要: 要求:对网站的信息,比如某个访问节点不想国内或者国外的用户使用,禁止国内或者国外或者精确到某个城市的那种情况。解决方式:1.Cloudfalre来实现禁止特定国家的ip访问,比较简单,但是需要money!!!2.nginx,直接使用geoip模块,现在我们使用最新的ngx_http_geoip2,该模块可以精确到国家、省、市 ...

要求:对网站的信息,比如某个访问节点不想国内或者国外的用户使用,禁止国内或者国外或者精确到某个城市的那种情况。

解决方式:1.Cloudfalre来实现禁止特定国家的ip访问,比较简单,但是需要money!!!

2.nginx,直接使用geoip模块,现在我们使用最新的ngx_http_geoip2,该模块可以精确到国家、省、市等一级的IP,并且全部由Nginx执行识别和阻止访问,但是Nginx编译起来比较费事。

最终解决方式,使用nginx的geoip模块:

部署操作:

一:安装geoip2扩展依赖

yum install libmaxminddb-devel -y

二:下载ngx_http_geoip2_module

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

注意要是没有git的话就自己在网上下了然后直接拖到服务器上也行,不过注意格式。

三:查看模块的完整性,将下载好的模块放到指定目录下,方便nginx编译时指定路径,我是放到/usr/local/下面的。

四:编译nginx并检查模块是否安装成功

nginx建议选择最新版本,我选的是1.18,也有说1.15都行的,选了1.18.之前选了1.15的没成功。但是为了匹配最新版本,一下就成功了,只能感叹神奇,所以选择1.18是正确的,哈哈!

注意:在编译时,我们只要加上--add-module=/usr/local/ngx_http_geoip2_module这个参数或者命令就行了,注意一定要加上额,不加等于没有geoip模块,就更没有这个功能了,为了简化,具体的nginx编译参数我就不写了,如下。

./configure --add-module=/usr/local/ngx_http_geoip2_module --user=www --group=www --prefix=......................................

之后的功能make && make install 等照常规流程来就行了。

nginx整体安装完就检查下模块是否都有:

[root@nsh install]# nginx -V
Tengine version: Tengine/2.3.2
nginx version: nginx/1.17.3
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.1.1b 26 Feb 2019
TLS SNI support enabled
configure arguments: --add-module=/usr/local/ngx_http_geoip2_module --user=www --group=www --prefix=/www/server/nginx
--add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module
--add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module
--with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream
--with-stream_ssl_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module
--with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module
--with-http_addition_module --with-http_realip_module --with-http_mp4_module
--with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc

五:验证是否成功

ldd /usr/local/nginx/sbin/nginx

六:修改nginx配置

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

数据库地址:

cd /usr/local/share/GeoIP
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.mmdb.gz
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz

之后使用gunzip解压这两个库文件。

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

修改nginx配置文件,因为geoip2和geoip是不一样的,我们可以在 http 段增加国家代码的map映射:

在http端中添加如下代码:

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

如下图:

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

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

这里显示的是允许国内的ip访问,国外直接返回403

如下图:

配置完后重启nginx即可。

七:测试

之前买了国外的联网ip主机,做了vpn。但是国庆期间封了,只能用国内和国外的两台主机测试了。

国内的阿里云主机:

[root@nsh nginx]# curl -I -m 10 -o /dev/null -s -w %{http_code} www.nsh.pub
200

国外的云主机:

[root@LooseGargantuan-VM ~]# curl -I -m 10 -o /dev/null -s -w %{http_code} www.nsh.pub
403

如此测试,是成功了的,如果是相反的,禁止国内访问, 那么server段里“if ($allowed_country = yes) { return 403; }”的yes改成no即可。

总结:

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

GeoIP不光可以屏蔽国家,还可以屏蔽身份、城市,如果有需要可以自己研究下。

作者:水墨-丹青

原文:https://www.cnblogs.com/nsh123/p/11626651.html



小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:https://www.toutiao.com/a6744950218640327172/

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

 最新
返回顶部