最近公司上线了一个APP,过段时间发现告警群总有些莫名的异常,通过排查发现是被攻击了,并且攻击IP全是国外的,基于APP业务全在国内,最简单办法就是屏蔽这些IP。云上虽有产品但收费,自己动手才是王道。
目录
一、实现思路
二、配置方法
2.1 软件下载
2.1.1 Nginx下载
2.1.2 IP识别模块下载
2.1.3 IP库下载
2.2 安装步骤
2.2.1 安装geoip2依赖
2.2.2 nginx配置IP库
2.2.3 添加IP拦截逻辑
一、实现思路
实现方法需要使用到ngx_http_geoip2模块,对于未装过Nginx环境的步骤可以参考阿里云上的一篇文章 https://developer.aliyun.com/article/982261。如果对于已经有Nginx情况下再添加新模块,过程会有些不一样,当初在配置时还是踩了一些坑。所以本文重点是介绍已有Nginx情况怎么升级。
二、配置方法
2.1 软件下载
2.1.1 Nginx下载
添加新的Nginx Module必须要用到Nginx源程序对Module进行编译,所以还需要下载Nginx,版本要和当前运行的Nginx版本一致。若下载其它版本,直接修改链接中的版本号即可,如果机器上已经有Nginx安装源文件可以无须下载。
http://nginx.org/download/nginx-1.20.1.tar.gz
2.1.2 IP识别模块下载
ngx_http_geoip2_module模块是实现IP拦截的一个Nginx 模块,必须下载。
模块官方git地址:https://github.com/leev/ngx_http_geoip2_module
模块下载地址https://codeload.github.com/leev/ngx_http_geoip2_module/zip/refs/heads/master
2.1.3 IP库下载
geoip2 module仅是一个模块程序并不包含IP库数据,所以还需要单独下载IP库。IP没有好的规则可以直接判断是哪个国家的,所以只能使用IP库进行判断,这个库可以去maxmind官网免费下载,但要先注册账号。
https://www.maxmind.com/en/geoip2-databases?utm_source=kb&utm_medium=kb-link&utm_campaign=kb-create-account
下面文件是2023-04-20号新下载的,ip库比较新,如果要保证拦截准确率的话后面定期更新即可,理论上来说变化不会太大。
文件大家可以在下面链接下载 https://download.csdn.net/download/caizi1288/88665724
下载ip到国家的库就行,会比较小点,比如要精确到城市的话,文件有60m
2.2 安装步骤
阿里云文档提供的是新搭建nginx时的安装方法,对于已经安装好nginx的系统再添加该Module时,坑稍微有点多。
2.2.1 安装geoip2
依赖
1、给系统安装geoip2扩展依赖
yum install libmaxminddb-devel -y
2、对module进行编译
进入到nginx源文件中,执行以下命令
./configure --add-dynamic-module=/path/to/ngx_http_geoip2_module make
make install
#make install 命令只是用来编译可以生成Module.so文件,并不是真正的就安装到nginx上了
3、配置Module到nginx中
编译成功会生成ngx_http_geoip2_module.so,此时要配置到nginx中
load_module "/usr/lib64/nginx/modules/ngx_http_geoip2_module.so";
配置好后此时执行nginx -t有可能会遇到以下问题
nginx -t shows: nginx: [emerg] module "/usr/share/nginx/modules/ngx_http_geoip2_module.so" is not binary compatible in /etc/nginx/nginx.conf:5
出现该问题是因为给已经安装过的nginx添加新的Module时需要把之前已经安装过的module信息全部加进来一起编译,这个问题可以见 Issues https://github.com/leev/ngx_http_geoip2_module/issues/82
需要使用以下方式重新编译,编译后再重新执行nginx -t
nginx -V 2>&1 | egrep "^configure" | cut -d: -f2 > /tmp/nginx_build_options.txt sh -c "./configure $(cat /tmp/nginx_build_options.txt) --add-dynamic-module=../ngx_http_geoip2_module-master"
2.2.2 nginx配置IP库
在nginx 的http 中加入ip库及字典变量配置
GeoLite2-Country.mmdb ip库文件需要下载后传到服务器上
#从geoip2文件中加载数据,1000分钟自动reload一次数据
geoip2 /home/geoip2/GeoLite2-Country.mmdb {
auto_reload 1000m;
$geoip2_data_country_code country iso_code;
}
# 如果是CN IP返回yes,其它国家都返回no
map $geoip2_data_country_code $allowed_country {
default no;
CN yes;
}
2.2.3 添加IP拦截逻辑
可以把以下规则放到一个文件中,其它server引用该配置: deny-ip.conf
#如果变量值为no,则直接返回403
if ($allowed_country = no) {
return 403;
}
在server中引用以上规则(哪个server要拦截,哪个server去加上就行了,http、https要分别添加)
include /etc/nginx/deny-ip.conf;
三、常见问题
编译Module可能会遇到一些问题,缺少的model重新安装即可
1、 ./configure: error: SSL modules require the OpenSSL library.
重新安装
sudo yum install openssl-devel
2、 ./configure: error: the HTTP XSLT module requires the libxml2/libxslt文章来源:https://www.toymoban.com/news/detail-794052.html
sudo yum install libxml2-devel libxslt-devel
文章来源地址https://www.toymoban.com/news/detail-794052.html
到了这里,关于基于Geoip2实现Nginx拦截国外IP访问网站的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!