日常小记

使用Nginx屏蔽国内或某一地区的IP访问

1.禁止特定国家IP访问

ngx_http_geoip_module模块可以让Nginx根据来访者的IP实现不同的需要,这里我们利用ngx_http_geoip_module模块来阻止特定IP地址访问网站。
首先是将ngx_http_geoip_module编译到Nginx中。

安装geoip库

yum -y install epel-release
yum -y install geoip-devel

先查看一下本机的Nginx配置情况

[root@izj6cfobw28nuhpf6q8q2kz ~]# nginx -V

nginx version: nginx/1.14.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2l 25 May 2017
TLS SNI support enabled
configure arguments: --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 --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_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-pcre=pcre-8.40 --with-ld-opt=-ljemalloc

开始下载Nginx,这里用的是1.15.1,你也可以下载其它的版本

wget http://nginx.org/download/nginx-1.15.1.tar.gz
tar -xzvf nginx-1.15.1.tar.gz
cd nginx-1.15.1

下面的命令只是复制上面的Nginx -V得到的配置详情后加上了--with-http_geoip_module,目的是为了保持原来的配置不变同时又增加新的模块

./configure arguments: --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 --add-module=/www/server/nginx/src/nginx-sticky-module --add-module=/www/server/nginx/src/nginx-http-concat --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_image_filter_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-pcre=pcre-8.40 --with-ld-opt=-ljemalloc --with-http_geoip_module

只编译不安装

make

启用Nginx-ngx_http_geoip_module模块前先停用Nginx。

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

我这边是用宝塔安装的环境,目录是/www/server/nginx,如果不是宝塔安装的环境,请换成自己服务器上的目录

先停止 nginx 再替换二进制文件,提示 overwrite 的话记得输入 y 后回车。

cp /www/server/nginx/sbin/nginx /www/server/nginx/sbin/nginx.bak
cp ./objs/nginx /www/server/nginx/sbin/

替换成功后,重启 Nginx。然后再使用nginx -V命令查看一下 GeoIP 模块加载情况。如果后面包含了–with-http_geoip_module 就说明成功了。

到你的宝塔面板点击Nginx,修改配置文件,加入以下代码:
geoip_country /usr/share/GeoIP/GeoIP.dat;
微信图片_20190830210731.png

现在启动Nginx,你可以往网站的Nginx配置中添加规则了,例如你可以将特定国家的IP访问返回指定错误或者导向另一个页面和网站,代码示例:

返回403 502 404等错误

location / {
default_type text/html;
charset utf-8;
if ($geoip_country_code = CN) {
return 403;
}
}

导向另一个网站目录

location / {
default_type text/html;
charset utf-8;
if ($geoip_country_code = CN) {
root /home/www/wzfou.com-cn/;#可以把这个网站目录指向网站的404文件或者自己写好的界面
}
}

这是添加网站配置
微信图片_20190830211118.png

最后效果如下
微信图片_20190830211554.png

2.仅允许指定国家IP访问

方法和上面是一样的,只是配置文件中的配置代码不同,在网站的Nginx配置中加入阻止任何国家IP但允许指定国家IP的代码,示例如下 :
# 引入IP库

geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;
map $geoip_country_code $allowed_country {

            default no;
            CN yes;
    }

在配置中阻止IP

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

回复

This is just a placeholder img.