一、前言
前几天突然收到腾讯云发来的短信,说我服务器流量已经用尽,那时候我还想着难道我的网站火了?流量这么高?结果打开百度统计一看,根本就没浏览量,查看腾讯云监控才发现公网出流量一直维持在5-8mbps/s,查看nginx日志发现一直有不同的美国IP在请求服务器。然后我就直接给服务器关机了。。。。。。当然不是这样,还是得解决一下这个问题的,起初是想通过cloudflare来做人机交互验证,但是又搜到个更有用的,那就是GeoIP,它可以通过访问庞大的IP地址数据库,将IP地址与地理位置信息进行匹配并拦截。那么接下来就记录下使用Nginx+GeoIP的过程吧。
二、Nginx+GeoIP2实现对美国IP的拦截
环境:CentOS7、Nginx1.24、宝塔面板
1. 安装 GeoIP 相关依赖
GeoIP 模块需要 GeoIP 库支持,因此需要先安装 GeoIP 开发库。
sudo yum install libmaxminddb-devel2.下载GeoIP2模块
可以选择从git仓库下载
# 进入常用的目录
cd /www/wwwroot/
# 下载3.4版本,根据你的nginx选择,我这里访问github太慢所以是下载好再上传到服务器
wget https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.4.tar.gz
# 解压
tar -zxvf ngx_http_geoip2_module-3.4.tar.gz3.配置Nginx
# 检查已安装的Nginx是否包含了geoip模块,此命令会返回已编译的模块信息
nginx -V
# 如果没安装,可以重新编译一下nginx,xxxx(这里是你上面返回的模块信息)这里我使用的宝塔就跳过了
./configure xxxx --add-module=/www/wwwroot/ngx_http_geoip2_module-3.4
# 编译
make我这里是使用的宝塔面板,直接可以在安装时选择添加模块

4.下载GeoIP2 数据库文件
进入https://www.maxmind.com/官网,注册并生成一个license-key。这里需要注意的是密钥只有在生成的时候可以看到
像我第一次没注意看又生成了一次。

有了license-key后,我们就可以下载了,进入下载页面后可以看到不同的版本,我们这里下载GeoLite2-Country。

# 下载到/www/wwwroot/ngx_http_geoip2_module-3.4
wget --content-disposition --user=YOUR_ACCOUNT_ID --password=YOUR_LICENSE_KEY 'https://download.maxmind.com/geoip/databases/GeoLite2-Country/download?suffix=tar.gz'
# 解压
tar -zxf xxxx.tar.gz5.配置 Nginx 使用 GeoIP2 模块
在nginx.conf文件中的http代码块区域添加以下配置
# 配置 GeoIP2 数据库路径
geoip2 /www/wwwroot/ngx_http_geoip2_module-3.4/GeoLite2-Country_20250204/GeoLite2-Country.mmdb {
$geoip2_data_country_code country iso_code;
}
# 配置访问规则
map $geoip2_data_country_code $allowed_country {
default yes;
US no; # 禁止美国的访问
}在server代码块中进行拦截返回403
# 拒绝来自美国的访问
if ($allowed_country = no) {
return 403; # 返回 403 禁止访问
}6.测试
使用vpn的美国节点访问网站,可以发现已经成功,nginx日志也可以看到大量的请求都是403。

7.自动更新 GeoIP2 数据库(推荐)
为了确保 GeoIP2 数据库保持最新,可以使用 geoipupdate 工具自动更新数据库。一开始我使用的并不是最新的数据,所以还有拦截失败的情况。
安装 geoipupdate:
sudo yum install geoipupdate配置 geoipupdate: 编辑 /etc/GeoIP.conf 文件,添加以下内容:
AccountID YOUR_ACCOUNT_ID
LicenseKey YOUR_LICENSE_KEY
EditionIDs GeoLite2-Country GeoLite2-City也可以直接执行
设置自动更新任务: 编辑 crontab 文件,添加定时任务:
crontab -e添加以下内容:
0 0 * * 0 geoipupdate -d /www/wwwroot/ngx_http_geoip2_module-3.4/GeoLite2-Country这将每周日自动更新 GeoIP2 数据库。