程序员的成长之路

互联网/程序员/技术/资料共享

关注

阅读本文大概需要 4 分钟。

来自:toutiao.com/i6860736292339057156/

之前看了下 Nginx 的访问日志,发现每天有好多国外的 IP 地址来访问我的网站,并且访问的内容基本上都是恶意的。因此我决定禁止国外 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 模块

首先说明下环境,我的 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 -Vnginx version: nginx/1.16.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure 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 -Vnginx version: nginx/1.18.0built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)built with OpenSSL 1.0.2k-fips 26 Jan 2017TLS SNI support enabledconfigure 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:

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

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

[root@fxkj local]# cd /usr/share/GeoIP/[root@fxkj GeoIP]# lltotal 69612lrwxrwxrwx. 1 root root       17 Mar  7  2019 GeoIP.dat -> GeoIP-initial.dat-rw-r--r--. 1 root root  1242574 Oct 30  2018 GeoIP-initial.datlrwxrwxrwx. 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;}

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

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

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

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

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

# 模拟测试验证

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

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

我们再来看下 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 访问网站就结束了~

<END>

推荐阅读:

有了HTTP,为什么还要RPC?

12 个适合做外包项目的开源后台管理系统

互联网初中高级大厂面试题(9个G)
内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取!                                  朕已阅

京东一面,面试官问我如何用 Nginx 禁止国外 IP 访问网站,我直接凉凉!相关推荐

  1. 如何用 Nginx 禁止国外 IP 访问网站!

    之前看了下 Nginx 的访问日志,发现每天有好多国外的 IP 地址来访问我的网站,并且访问的内容基本上都是恶意的.因此我决定禁止国外 IP 来访问我的网站. 想要实现这个功能有很多方法,下面我就来介 ...

  2. 京东一面:Nginx 禁止国外 IP 访问网站!

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 来源:toutiao.com/i6860736292339057156 先来说说为啥要写这篇文章,之前小编看了下ngi ...

  3. 面试官问:如何用Elasticsearch实现Word、PDF,TXT文件的全文内容检索?

    Elasticsearch简介 开发环境 核心问题 文件上传 关键字查询 编码 导入依赖 文件上传 文件查询 多文件测试 还存在的一些问题 简单介绍一下需求 能支持文件的上传,下载 要能根据关键字,搜 ...

  4. 二面京东,面试官直接问我JVM,我心里一阵暗爽~

    二面京东,面试官直接问我JVM,我心里一阵暗爽~简直了,hhhh 明人不说暗话,直接进入主题!!! 一.什么是JVM 二.JAVA代码编译和执行过程 类加载机制 类执行机制 三.JVM内存管理和垃圾回 ...

  5. 你以为面试官问的是分布式缓存,其实他想问……

    最近一个哥们去面试某当红大厂了,其中几个他印象深刻的面试题你们品品: 1.介绍下如何对MySQL SQL语句进行分析和优化? 2.Redis 怎样实现的分布式锁? 3.如何实现本地缓存和分布式缓存? ...

  6. 面试官问:在读多写少的情况下,如何优化 MySQL 的数据查询方案

    作者 | 面试官问     责编 | 张文 来源 | 面试官问(ID:interviewer_asked) 面试官问:假设你负责的某业务在双十一期间要搞运营活动,公司投入了大量的营销费用进行推广,此举 ...

  7. 面试官问你斐波那契数列的时候不要高兴得太早 搞懂C语言函数指针 搜索引擎还可以这么玩? 那些相见恨晚的搜索技巧...

    面试官问你斐波那契数列的时候不要高兴得太早 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归求斐波那契数列 递归,在数学与计算机 ...

  8. 面试官问你想找什么工作_找工作时如何面试面试官

    面试官问你想找什么工作 在技​​术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I've just come off six wee ...

  9. 面试官问:select......for update会锁表还是锁行?

    欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...

最新文章

  1. 【直播】李祖贤:集成学习答疑直播之五 -- 常用集成思路
  2. 3月机器学习在线班第六课笔记--信息熵与最大熵模型
  3. 面向对象语言的new操作
  4. 运用Zabbix实现内网服务器状态及局域网状况监控(2) —— 环境配置
  5. 老年人计算机应用基础,国开电大老年心理健康作业一参考答案
  6. 漫谈OI中的群论入门
  7. iOS 如何使用 Block
  8. JAVA前三章预习总结
  9. 真是蛋疼,cvet网测
  10. HTTPS那些事(三)攻击实例与防御(转载)
  11. 28-地理空间数据云下载
  12. run.gps+trainer+uv+for+android,android 2.1(三星spica i5700)上的蓝牙问题配对工作但连接不起作用...
  13. 京东淘宝,拼多多三大电商平台竞品分析
  14. 使用 Cipher CipherInputStream CipherOutputStream 实现对文件的加解密
  15. Interval (mathematics)
  16. 数据分析技术:时间序列分析的AR/MA/ARMA/ARIMA模型体系
  17. php公众号向多个用户推送消息,如何实现微信公众号给指定互动用户推送多次消息?...
  18. 计算机自考本科英语二可以用什么代替,自考英语二用什么可以代替免考
  19. 生活要有新鲜感,麻烦给我来一杯依维世苏打水鸡尾酒
  20. mysql5.7驱动(tableau,excel)

热门文章

  1. 计算机工程的突出技能该怎么写,没有科研竞赛,计算机保研简历应该怎么写?...
  2. SSH Secure Shell Client乱码问题
  3. 常见类型移动互联网应用程序必要个人信息范围规定(快速解读)
  4. Anaconda3 2021.05(64bit)安装图文教程
  5. vue实现打开网页自动播放音乐
  6. ChatGPT自动化
  7. 十大排序算法(C语言代码)
  8. python读取excel生成柱状图
  9. 人造细胞能模仿天然细胞感知环境
  10. android归属地显示错误,Android开发【07-18疑问贴】求助大神 来电归属地拖移动问题...