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 相关文章推荐
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
Mar 09 Servers
查看nginx配置文件路径和资源文件路径的方法
Mar 31 Servers
nginx结合openssl实现https的方法
Jul 25 Servers
使用 Apache 反向代理的设置技巧
Jan 18 Servers
Nginx实现会话保持的两种方式
Mar 18 Servers
忘记Grafana不要紧2种Grafana重置admin密码方法详细步骤
Apr 07 Servers
Nginx配置根据url参数重定向
Apr 11 Servers
Windows Server 2012 R2 磁盘分区教程
Apr 29 Servers
使用Nginx+Tomcat实现负载均衡的全过程
May 30 Servers
在虚拟机中安装windows server 2008的图文教程
Jun 28 Servers
Nginx报404错误的详细解决方法
Jul 23 Servers
keepalived + nginx 实现高可用方案
Dec 24 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
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
2016/11/25 PHP
使用正则替换变量
2007/05/05 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
xml文档转换工具,附图表例子(hta)
2010/11/17 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
jQuery ajax方法传递中文时出现中文乱码的解决方法
2016/07/25 Javascript
JS监听微信、支付宝等移动app及浏览器的返回、后退、上一页按钮的事件方法
2016/08/05 Javascript
jQuery过滤选择器经典应用
2016/08/18 Javascript
Vue方法与事件处理器详解
2016/12/01 Javascript
Three.js基础部分学习
2017/01/08 Javascript
js实现多行文本框统计剩余字数功能
2017/03/28 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
python爬取安居客二手房网站数据(实例讲解)
2017/10/19 Javascript
axios发送post请求,提交图片类型表单数据方法
2018/03/16 Javascript
深入理解Vue Computed计算属性原理
2018/05/29 Javascript
Vue 中的受控与非受控组件的实现
2018/12/17 Javascript
vue将data恢复到初始状态 && 重新渲染组件实例
2020/09/04 Javascript
解决elementui表格操作列自适应列宽
2020/12/28 Javascript
Python中的模块导入和读取键盘输入的方法
2015/10/16 Python
轻松掌握python设计模式之访问者模式
2016/11/18 Python
python将excel转换为csv的代码方法总结
2019/07/03 Python
django框架F&Q 聚合与分组操作示例
2019/12/12 Python
python getopt模块使用实例解析
2019/12/18 Python
在TensorFlow中屏蔽warning的方式
2020/02/04 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
美国五金商店:Ace Hardware
2018/03/27 全球购物
六一儿童节园长致辞
2015/07/31 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
浅谈spring boot使用thymeleaf版本的问题
2021/08/04 Java/Android
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers