京东一面,面试官问我如何用 Nginx 禁止国外 IP 访问网站,我直接凉凉!
程序员的成长之路
互联网/程序员/技术/资料共享
关注
阅读本文大概需要 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 访问网站,我直接凉凉!相关推荐
- 如何用 Nginx 禁止国外 IP 访问网站!
之前看了下 Nginx 的访问日志,发现每天有好多国外的 IP 地址来访问我的网站,并且访问的内容基本上都是恶意的.因此我决定禁止国外 IP 来访问我的网站. 想要实现这个功能有很多方法,下面我就来介 ...
- 京东一面:Nginx 禁止国外 IP 访问网站!
点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 来源:toutiao.com/i6860736292339057156 先来说说为啥要写这篇文章,之前小编看了下ngi ...
- 面试官问:如何用Elasticsearch实现Word、PDF,TXT文件的全文内容检索?
Elasticsearch简介 开发环境 核心问题 文件上传 关键字查询 编码 导入依赖 文件上传 文件查询 多文件测试 还存在的一些问题 简单介绍一下需求 能支持文件的上传,下载 要能根据关键字,搜 ...
- 二面京东,面试官直接问我JVM,我心里一阵暗爽~
二面京东,面试官直接问我JVM,我心里一阵暗爽~简直了,hhhh 明人不说暗话,直接进入主题!!! 一.什么是JVM 二.JAVA代码编译和执行过程 类加载机制 类执行机制 三.JVM内存管理和垃圾回 ...
- 你以为面试官问的是分布式缓存,其实他想问……
最近一个哥们去面试某当红大厂了,其中几个他印象深刻的面试题你们品品: 1.介绍下如何对MySQL SQL语句进行分析和优化? 2.Redis 怎样实现的分布式锁? 3.如何实现本地缓存和分布式缓存? ...
- 面试官问:在读多写少的情况下,如何优化 MySQL 的数据查询方案
作者 | 面试官问 责编 | 张文 来源 | 面试官问(ID:interviewer_asked) 面试官问:假设你负责的某业务在双十一期间要搞运营活动,公司投入了大量的营销费用进行推广,此举 ...
- 面试官问你斐波那契数列的时候不要高兴得太早 搞懂C语言函数指针 搜索引擎还可以这么玩? 那些相见恨晚的搜索技巧...
面试官问你斐波那契数列的时候不要高兴得太早 前言 假如面试官让你编写求斐波那契数列的代码时,是不是心中暗喜?不就是递归么,早就会了.如果真这么想,那就危险了. 递归求斐波那契数列 递归,在数学与计算机 ...
- 面试官问你想找什么工作_找工作时如何面试面试官
面试官问你想找什么工作 在技术面试中要问的十二个问题 (Twelve questions to ask at tech interviews) I've just come off six wee ...
- 面试官问:select......for update会锁表还是锁行?
欢迎关注方志朋的博客,回复"666"获面试宝典 select查询语句是不会加锁的,但是select .......for update除了有查询的作用外,还会加锁呢,而且它是悲观锁 ...
最新文章
- 【直播】李祖贤:集成学习答疑直播之五 -- 常用集成思路
- 3月机器学习在线班第六课笔记--信息熵与最大熵模型
- 面向对象语言的new操作
- 运用Zabbix实现内网服务器状态及局域网状况监控(2) —— 环境配置
- 老年人计算机应用基础,国开电大老年心理健康作业一参考答案
- 漫谈OI中的群论入门
- iOS 如何使用 Block
- JAVA前三章预习总结
- 真是蛋疼,cvet网测
- HTTPS那些事(三)攻击实例与防御(转载)
- 28-地理空间数据云下载
- run.gps+trainer+uv+for+android,android 2.1(三星spica i5700)上的蓝牙问题配对工作但连接不起作用...
- 京东淘宝,拼多多三大电商平台竞品分析
- 使用 Cipher CipherInputStream CipherOutputStream 实现对文件的加解密
- Interval (mathematics)
- 数据分析技术:时间序列分析的AR/MA/ARMA/ARIMA模型体系
- php公众号向多个用户推送消息,如何实现微信公众号给指定互动用户推送多次消息?...
- 计算机自考本科英语二可以用什么代替,自考英语二用什么可以代替免考
- 生活要有新鲜感,麻烦给我来一杯依维世苏打水鸡尾酒
- mysql5.7驱动(tableau,excel)
热门文章
- 计算机工程的突出技能该怎么写,没有科研竞赛,计算机保研简历应该怎么写?...
- SSH Secure Shell Client乱码问题
- 常见类型移动互联网应用程序必要个人信息范围规定(快速解读)
- Anaconda3 2021.05(64bit)安装图文教程
- vue实现打开网页自动播放音乐
- ChatGPT自动化
- 十大排序算法(C语言代码)
- python读取excel生成柱状图
- 人造细胞能模仿天然细胞感知环境
- android归属地显示错误,Android开发【07-18疑问贴】求助大神 来电归属地拖移动问题...