前言:先来说说为啥要写这篇文章,然后小编看了下nginx的访问日志,发现每天有好多国外的IP地址来访问我的网站,并且访问的内容基本上都是恶意的。因此我决定禁止国外IP来访问我的网站
想要实现这个功能有很多方法,下面我就来介绍基于NGINX的ngx_http_geoip2模块来禁止国外IP访问网站
一,安装geoip2扩展依赖
[root @fxkj〜 ] #yum安装libmaxminddb-devel -y
二,下载ngx_http_geoip2_module模块
[根@fxkj TMP]#GIT中克隆的https://github.com/leev/ngx_http_geoip2_module.git
[RO TMP]#
三,解压模块到指定路径
我这里解压到/ usr / local目录下
[根@fxkj TMP]#MV ngx_http_geoip2_module / / USR /本地/
[根@fxkj 本地]#LL ngx_http_geoip2_module /
总 60
-rw-R - R-- 1 根根 1199 年08月 13 17:20 配置
-rw-R --r-- 1 根根 1311 八月 13 17:20 LICENSE
-rw-R - R-- 1 根根 23525 月 13 17:20 ngx_http_geoip2_module.c
-rw-R - R-- 1 根根 21029 八月 13 17:20 ngx_stream_geoip2_module.c
-rw-R - R-- 1 根根 3640 年08月 13 17:20 README.md
四,安装nginx模块
首先说明下环境,我的nginx版本是1.16,在网上查了下安装ngx_http_geoip2模块至少需要1.18版本及以上,因此此次安装我是升级nginx1.18,添加ngx_http_geoip2模块。
- 下载nginx 1.18版本
[root @fxkj〜 ] #yum安装libmaxminddb-devel -y
- 解压nginx1.18扩展并升级为nginx1.18,添加ngx_http_geoip2模块
需要注意:
1,升级nginx,添加nginx模块只需要编译然后make不需要make instll不然线上的nginx会被新版本nginx完完整整的的替换掉
2,编译前需要看下nginx当前安装了哪些模块
[根@fxkj TMP]#的/ usr /本地/ nginx的/ sbin目录/ nginx的-V
nginx的版本:nginx的/ 1.16.0
通过gcc构建 4.8.5 20150623 (红帽 4.8.5 - 39)(GCC)
与OpenSSL的内置 1.0 .2 k 跳2017年 1 月26日
启用TLS SNI支持的
配置参数:–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版本以及安装的模块
[根@fxkj nginx- 1.18.0 ]#的/ usr /本地/ nginx的/ sbin目录/ nginx的-V
nginx的版本:nginx的/ 1.18.0
通过gcc构建 4.8.5 20150623 (红帽 4.8.5 - 39)(GCC)
使用OpenSSL 1.0.2 k-fips 构建的 协议2017年 1 月26日
启用TLS SNI支持的
配置参数:–with-http_stub_status_module –prefix = / usr / local / nginx –user = nginx –group = nginx –with-http_ssl_module –with-stream –add -模块= / usr / local / ngx_http_geoip2_module
五,下载最新的IP地址数据库文件
模块安装成功后,还要在Nginx里指定数据库,在安装运行时库中安装了两个,位于/ usr / share / GeoIP /目录下,一个只有IPv4,一个包含IPv4和IPv6:
登录www.maxmind.com网址,创建帐户下载最新的库文件(帐户创建就不演示了)
发布到/ usr / share / GeoIP /下并解压
[root @fxkj local]#cd / usr / share / GeoIP /
[root @fxkj GeoIP] #ll
共计 69612 lrwxrwxrwx
。 1 个根 17 Mar的 7 2019年 GeoIP.dat - >的GeoIP-initial.dat
-rw-R - R--。 1 根root 1242574 2018年 10月 30 日 GeoIP-initial.dat lrwxrwxrwx
。 1 root root 19 Mar 7 2019 GeoIPv6.dat-> GeoIPv6-initial.dat
-rw-r--r--。 1 root root 2322773 2018年 10月 30 日 GeoIPv6-initial.dat
-rw-R - R-- 1 根根 3981623 年08月 12 版本02:37 GeoLite2-Country.mmdb
六,配置nginx配置文件
修改前先备份配置文件
[根@ fxkj〜]# CP 的/ usr /本地/ nginx的/ CONF / nginx的。conf / usr / local / nginx / conf / nginx。CONF -bak
[根@ fxkj〜]# VIM 的/ usr /本地/ nginx的/ CONF / nginx的。conf
在http中添加几行,定义数据库文件位置
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
auto_reload 5 m;
$ geoip2_data_country_code国家iso_code;
地图$ geoip2_data_country_code $ allowed_country {
默认为 是;
CN号;
在服务器中的位置下添加条件
如果满足IP是国外IP就执行下面的return动作,我这里定义了3种,注释了其中两个。
当访问IP是国外IP,直接返回404
如果 ($ allowed_country = yes){
# 返回 https://www.baidu.com ;
# 返回 /主页/日本;
返回 404 ;
}
修改完毕后,检测下配置文件,重新加载下nginx
[root @fxkj〜 ]#/ usr / local / nginx / sbin / nginx -t
nginx:配置文件/usr/local/nginx/conf/nginx.conf的语法是可以的
nginx:配置文件/ usr / local / nginx / conf / nginx.conf测试成功
[roo @fxkj〜 ]#/ usr / local / nginx / sbin / nginx -s重新加载
7,模拟测试验证
使用海外上游的服务器去访问网站
这里我的IP是来自于韩国
可以看到访问网站报错404未找到
我们再来看下nginx的访问日志
“ 13.125.1.194 - - [ 14 /8/ 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,例如Gecko)Chrome / 84.0.4147.125 Safari / 537.36”
至此,我们通过Nginx来实现禁止国外IP访问网站就结束了〜
热门跟贴