前言

处于安全性考虑,网站需要屏蔽国外IP的访问,仅开放内网和国内网络访问。 nginx原来的geo模块ngx_http_geoip已经因为太老而被抛弃了,官方也停止了数据库的维护和更新,推荐使用更新的ngx_http_geoip2替换。

1、安装 libmaxminddb

源码编译安装

官方地址: https://github.com/maxmind/libmaxminddb , 在里面找到最新的版本下载

wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz
tar -xf libmaxminddb-1.7.1.tar.gz
cd libmaxminddb 
./configure 
make && make install 
sudo ldconfig

debian apt 安装

资料来源 https://packages.debian.org/source/buster/libmaxminddb apt install libmaxminddb* mmdb-bin -y

rh系 yum安装

yum install libmaxminddb* mmdb-bin -y

FAQ

如果提示缺少libmaxminddb.so.0文件

sudo sh -c "echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf"
ldconfig

2、安装 ngx_http_geoip2_module

官方地址: https://github.com/leev/ngx_http_geoip2_module,找到需要的版本进行下载 这里服务器使用的是 lnmp.org 工具包

cd /root
wget https://github.com/leev/ngx_http_geoip2_module/archive/refs/tags/3.4.tar.gz
tar -xzf ngx_http_geoip2_module-3.4.tar.gz
mv ngx_http_geoip2_module-3.4 ngx_http_geoip2_module 

然后在lnmp解压的目录下找到lnmp.conf 在里面找到nginx编译额外参数 添加

–add-module=/root/ngx_http_geoip2_module 最后使用 upgrade.sh 升级nginx即可

3、下载数据文件

登录 https://www.maxmind.com/ 如果没有帐号,先注册一个 然后在网站左侧找到 Download Files ,在里面找到GeoLite2 Country ,下载回来解压是一个mmdb文件,放到 /usr/local/geoip/GeoLite2-Country.mmdb

4、配置nginx

在nginx.conf中,http区段添加如下代码

geoip2 /usr/local/geoip/GeoLite2-Country.mmdb {
	auto_reload 5m;
	$geoip2_data_country_code country iso_code;
}
map $geoip2_data_country_code $allowed_country {
	default no;
	CN yes;
}

在server区段添加

set $flag 0;
# 放行内网
if ($remote_addr ~* (127.0.0.\d|10.\d+.\d+.\d+|172.16.\d+.\d+|192.168.\d+.\d+)) {
	set $flag "${flag}1";
}
# 放行自己的服务器
if ($remote_addr ~* (你的国外VPS的ip1|你的国外VPS的ip2)) {
	set $flag "${flag}1";
}
# 屏蔽外国IP访问
if ($allowed_country = no) {
	set $flag "${flag}0";
}
# 放行国内
if ($allowed_country = yes) {
	set $flag "${flag}1";
}
# 最后判断国外来源排除本地IP 强制跳转到一个其他网页
if ($flag = "00") {
	rewrite . http://1.1.1.1;
}

重启nginx 注意是重启不是重载,否则可能会不生效

5、参考资料