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 重定向到系统维护页面
Jun 08 Servers
nginx安装以及配置的详细过程记录
Sep 15 Servers
Windows下用Nginx配置https服务器及反向代理的问题
Sep 25 Servers
教你使用Jenkins集成Harbor自动发布镜像
Apr 03 Servers
Linux中如何安装并部署Redis
Apr 18 Servers
阿里云ECS云服务器快照的概念以及如何使用
Apr 21 Servers
apache ftpserver搭建ftp服务器
May 20 Servers
V Rising 服务器搭建图文教程
Jun 16 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
彻底卸载VMware虚拟机的超详细步骤记录
Jul 15 Servers
apache虚拟主机配置的三种方式(小结)
Jul 23 Servers
Zabbix6通过ODBC方式监控Oracle 19C的详细过程
Sep 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
thinkphp普通查询与表达式查询实例分析
2014/11/24 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP CURL 多线程操作代码实例
2015/05/13 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): ...
2016/02/14 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
2017/06/27 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
使用 JScript 创建 .exe 或 .dll 文件的方法
2011/07/13 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
nodejs 整合kindEditor实现图片上传
2015/02/03 NodeJs
javascript实现unicode与ASCII相互转换的方法
2015/12/10 Javascript
jquery实用技巧之输入框提示语句
2016/07/28 Javascript
RequireJs的使用详解
2017/02/19 Javascript
Puppet的一些技巧
2018/09/17 Javascript
关于layui 下拉列表的change事件详解
2019/09/20 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
Python 异常处理的实例详解
2017/09/11 Python
Python 支付整合开发包的实现
2019/01/23 Python
pytorch 实现删除tensor中的指定行列
2020/01/13 Python
在Python 的线程中运行协程的方法
2020/02/24 Python
利用Python将多张图片合成视频的实现
2020/11/23 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
Elemis美国官网:英国的第一豪华护肤品牌
2018/03/15 全球购物
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
迪斯尼假期(欧洲、中东及非洲):Disney Holidays EMEA
2021/02/15 全球购物
运动会广播稿200字
2014/01/15 职场文书
会议主持词
2014/03/17 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
公司车辆管理制度
2015/08/04 职场文书
诚实守信主题班会
2015/08/13 职场文书
2016年第二十五次全国助残日活动总结
2016/04/01 职场文书
深入理解Vue的数据响应式
2021/05/15 Vue.js
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript