使用 Nginx 屏蔽部分国家或地区IP,禁止访问网站

2018年6月1日星期五

使用 Nginx 屏蔽部分国家或地区IP,禁止访问网站



博主的环境是用宝塔搭建的,所以安装目录会和正常的LNMP目录不太一样。


使Nginx支持GeoIP


我们先检查一下Nginx 是否有GeoIP模块。

nginx -V

看下输出界面有没有包含 --with-http_geoip_module ,如果有的话就说明Nginx 已经编译了GeoIP模块,直接到安装GeoIP检查GeoIP这一步。

安装GeoIP


如果没有安装GeoIP模块,先安装GeoIP

wget http://geolite.maxmind.com/download/geoip/api/c/GeoIP.tar.gz
tar -zxvf GeoIP.tar.gz
cd GeoIP-1.4.8
./configure
make
make install
echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf
ldconfig

添加未编译安装模块


cd 到Nginx 源码目录,因为我是用宝塔安装的环境,所以目录在/www/server/nginx

cd /www/server/nginx/src

使用参数从新配置,注意这里参数是直接复制 nginx -V 显示出来的,把configure arguments: 后面的参数复制出来,后面加上--with-http_geoip_module


./configure --user=www --group=www --prefix=/www/server/nginx --with-openssl=/www/server/nginx/src/openssl --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 --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_gzip_static_module --with-http_gunzip_module --with-stream --with-stream_ssl_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-ld-opt=-ljemalloc --with-http_geoip_module #不要复制这里的,要根据自己的进行修改


等上面执行完了,然后再编译

make

替换Nginx 二进制文件。(最好备份下当前Nginx 文件,避免出问题了没办法恢复)

#我这边是用宝塔安装的环境,目录是/www/server/nginx,如果不是宝塔安装的环境,请换成自己服务器上的目录
#先停止nginx 再替换二进制文件,提示overwrite 的话记得输入y后回车。
service nginx stop
cp /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.bak
cp ./objs/nginx /www/server/nginx/sbin/

替换成功后,重启Nginx。然后查看一下GeoIP模块加载情况。如果后面包含了--with-http_geoip_module 就成功了。

service nginx start
nginx -V


检查GeoIP


检查一下/usr/local/share/GeoIP/目录是否包含GeoIP.dat,如果没有的就直接下一个最新的数据库

cd /usr/local/share/GeoIP/
wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
gunzip GeoIP.dat.gz

配置Nginx,添加变量


打开Nginx 配置文件。

#注意!目录换成自己的Nginx 目录,我这个目录是宝塔安装的 ,或者进入面板修改
vim /www/server/nginx/conf/nginx.conf

添加变量,在http{} 区域任意位置添加如下变量

geoip_country /usr/local/share/GeoIP/GeoIP.dat;
fastcgi_param GEOIP_COUNTRY_CODE $geoip_country_code;
fastcgi_param GEOIP_COUNTRY_CODE3 $geoip_country_code3;
fastcgi_param GEOIP_COUNTRY_NAME $geoip_country_name;


配置规则


在你需要的网站上配置规则
编辑Nginx 网站配置文件,在server {} 区域内添加代码

#返回403
if ($geoip_country_code = CN) {
return 403;
}


#指定页面
if ($geoip_country_code = CN) {
root /451.html;
}

上面那段代码,CN 就是中国大陆地区,如果中国大陆地区的IP 访问网站就返回403,当然你也可以单独写一个界面返回到指定界面。如果你想屏蔽其他国家或地区的IP 访问 那么把RU 改成对应就可以了 ,以此类推。
这样就设置完毕了,可以任意屏蔽某个国家的IP 访问。当然GeoIP还有很多种写法,还可以屏蔽某个城市的IP,想学的话可以去网上找找。

附表:



[v_tips]中国大陆地区编号:
相应的省份代码:

CN,01,”Anhui”
CN,02,”Zhejiang”
CN,03,”Jiangxi”
CN,04,”Jiangsu”
CN,05,”Jilin”
CN,06,”Qinghai”
CN,07,”Fujian”
CN,08,”Heilongjiang”
CN,09,”Henan”
CN,10,”Hebei”
CN,11,”Hunan”
CN,12,”Hubei”
CN,13,”Xinjiang”
CN,14,”Xizang”
CN,15,”Gansu”
CN,16,”Guangxi”
CN,18,”Guizhou”
CN,19,”Liaoning”
CN,20,”Nei Mongol”
CN,21,”Ningxia”
CN,22,”Beijing”
CN,23,”Shanghai”
CN,24,”Shanxi”
CN,25,”Shandong”
CN,26,”Shaanxi”
CN,28,”Tianjin”
CN,29,”Yunnan”
CN,30,”Guangdong”
CN,31,”Hainan”
CN,32,”Sichuan”
CN,33,”Chongqing”


[/v_tips]

0 评论 :

发表评论