Nginx配置之禁止指定IP访问


Posted in Servers onMay 02, 2022

用Nginx禁止指定IP、国外IP访问我的网站

 

Nginx配置之禁止指定IP访问

想要实现这个功能有很多方法,下面我就来介绍基于 Nginx 的 ngx_http_geoip2 模块来禁止国外 IP 访问网站。

①安装 geoip2 扩展依赖:

[root@fxkj ~]# yum install libmaxminddb-devel -y

②下载 ngx_http_geoip2_module 模块:

[root@fxkj tmp]#  git clone https://github.com/leev/ngx_http_geoip2_module.git
[ro tmp]#

③解压模块到指定路径

我这里解压到 /usr/local 目录下:

[root@fxkj tmp]# mv ngx_http_geoip2_module/ /usr/local/
[root@fxkj local]# ll ngx_http_geoip2_module/
total 60
-rw-r--r-- 1 root root  1199 Aug 13 17:20 config
-rw-r--r-- 1 root root  1311 Aug 13 17:20 LICENSE
-rw-r--r-- 1 root root 23525 Aug 13 17:20 ngx_http_geoip2_module.c
-rw-r--r-- 1 root root 21029 Aug 13 17:20 ngx_stream_geoip2_module.c
-rw-r--r-- 1 root root  3640 Aug 13 17:20 README.md

Nginx配置之禁止指定IP访问

④安装 nginx 模块

首先说明下环境,我的 nginx 版本是 1.16,在网上查了下安装 ngx_http_geoip2 模块至少需要 1.18 版本及以上,因此此次安装我是升级 nginx1.18,添加 ngx_http_geoip2 模块。

下载 nginx 1.18 版本:

[root@fxkj ~]# yum install libmaxminddb-devel -y

解压 nginx1.18 软件包,并升级为 nginx1.18,添加 ngx_http_geoip2 模块。

需要注意:

  • 升级 nginx,添加 nginx 模块,只需要编译,然后 make。不需要 make instll,不然线上的 nginx 会被新版本 nginx 完完整整的替换掉。
  • 编译前需要看下 nginx 当前安装了哪些模块。
[root@fxkj tmp]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: –with-http_stub_status_module –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_ssl_module –with-stream

编译安装:

[root@fxkj tmp]# tar -xf nginx-1.18.0.tar.gz
[root@fxkj tmp]# cd nginx-1.18.0/
[root@fxkj nginx-1.18.0]# ./configure --with-http_stub_status_module \
 --prefix=/usr/local/nginx \
 --user=nginx --group=nginx --with-http_ssl_module --with-stream \
 --add-module=/usr/local/ngx_http_geoip2_module
[root@fxkj nginx-1.18.0]# make
[root@fxkj nginx-1.18.0]# cp /usr/loca/nginx/sbin/nginx /usr/loca/nginx/sbin/nginx1.16    #备份
[root@fxkj nginx-1.18.0]# cp objs/nginx /usr/local/nginx/sbin/    #用新的去覆盖旧的
[root@fxkj nginx-1.18.0]# pkill nginx     #杀死nginx
[root@fxkj nginx-1.18.0]# /usr/local/nginx/sbin/nginx    #再次启动Nginx

查看 nginx 版本,以及安装的模块:

[root@fxkj nginx-1.18.0]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: –with-http_stub_status_module –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_ssl_module –with-stream –add-module=/usr/local/ngx_http_geoip2_module

⑤下载最新的 IP 地址数据库文件

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

登录 www.maxmind.com 网址,创建账户,下载最新的库文件。(账户创建就不演示了)点击左侧,Download Files:

Nginx配置之禁止指定IP访问

选择 GeoLite2 Country,点击 Download GZIP 下载即可:

Nginx配置之禁止指定IP访问

上传到 /usr/share/GeoIP/ 下并解压:

[root@fxkj local]# cd /usr/share/GeoIP/
[root@fxkj GeoIP]# ll
total 69612
lrwxrwxrwx. 1 root root       17 Mar  7  2019 GeoIP.dat -> GeoIP-initial.dat
-rw-r--r--. 1 root root  1242574 Oct 30  2018 GeoIP-initial.dat
lrwxrwxrwx. 1 root root       19 Mar  7  2019 GeoIPv6.dat -> GeoIPv6-initial.dat
-rw-r--r--. 1 root root  2322773 Oct 30  2018 GeoIPv6-initial.dat
-rw-r--r--  1 root root  3981623 Aug 12 02:37 GeoLite2-Country.mmdb

⑥配置 nginx 配置文件

修改前先备份配置文件:

[root@fxkj ~]# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf-bak
[root@fxkj ~]# vim /usr/local/nginx/conf/nginx.conf

在 http 中添加几行,定义数据库文件位置:

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

Nginx配置之禁止指定IP访问

在 server 中的 location 下添加条件,如果满足 IP 是国外 IP,就执行下面的 return 动作,我这里定义了 3 种,注释了其中两个。

当访问 IP 是国外 IP,直接返回 404:

if ($allowed_country = yes) {
       # return https://www.baidu.com;
       # return /home/japan;
        return 404;
 }

Nginx配置之禁止指定IP访问

修改完毕后,检测下配置文件,重新加载下 nginx:

[root@fxkj ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[roo@fxkj ~]# /usr/local/nginx/sbin/nginx -s reload

⑦模拟测试验证

使用海外节点的服务器去访问网站,这里我的 IP 是来自于韩国:

Nginx配置之禁止指定IP访问

可以看到访问网站报错 404 Not Found:

Nginx配置之禁止指定IP访问

我们再来看下 nginx 的访问日志:

“13.125.1.194 – – [14/Aug/2020:16:15:51 +0800] “GET /favicon.ico HTTP/1.1” 404 548 “https://www.fxkjnj.com/” “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36”

Nginx配置之禁止指定IP访问

至此,我们通过 Nginx 来实现禁止国外 IP 访问网站就结束了~

Nginx配置之禁止指定IP访问

总结

到此这篇关于用Nginx禁止指定IP、国外IP访问我的网站的文章就介绍到这了!


Tags in this post...

Servers 相关文章推荐
基于nginx实现上游服务器动态自动上下线无需reload的实现方法
Mar 31 Servers
nginx简单配置多个server的方法
Mar 31 Servers
浅谈Nginx 中的两种限流方式
Mar 31 Servers
Nginx Rewrite使用场景及配置方法解析
Apr 01 Servers
Nginx配置文件详解以及优化建议指南
Sep 15 Servers
详解nginx location指令
Jan 18 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
Nginx速查手册及常见问题
Apr 07 Servers
Tomcat执行startup.bat出现闪退的原因及解决办法
Apr 20 Servers
win server2012 r2服务器共享文件夹如何设置
Jun 21 Servers
git stash(储藏)的用法总结
Jun 25 Servers
在windows server 2012 r2中安装mysql的详细步骤
Jul 23 Servers
centos7安装mysql5.7经验记录
May 02 #Servers
使用 Docker Compose 构建复杂的多容器App
Apr 30 #Servers
搭建Yolov5服务器
KVM基础命令详解
Apr 30 #Servers
Win10 Anaconda安装python-pcl
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 #Servers
解决IIS7下无法绑定https主机的问题
You might like
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
2016/10/18 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
得到文本框选中的文字,动态插入文字的js代码
2007/03/07 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jQuery 处理网页内容的实现代码
2010/02/15 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
jQuery下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
2010/10/20 Javascript
{}与function(){}选用空对象{}来存放keyValue
2012/05/23 Javascript
用js的document.write输出的广告无阻塞加载的方法
2014/06/05 Javascript
jQuery+PHP打造滑动开关效果
2014/12/16 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
详解JavaScript 中的 replace 方法
2016/01/01 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
微信小程序实现选项卡功能
2020/06/19 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
Python类的多重继承问题深入分析
2014/11/09 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
使用pyecharts在jupyter notebook上绘图
2020/04/23 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Python将json文件写入ES数据库的方法
2019/04/10 Python
Python对象转换为json的方法步骤
2019/04/25 Python
Python Process多进程实现过程
2019/10/22 Python
Python猜数字算法题详解
2020/03/01 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
30年同学聚会邀请函
2014/01/25 职场文书
街道务虚会发言材料
2014/10/20 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
DQL数据查询语句使用示例
2022/12/24 MySQL