nginx 禁止外国 ip 地址访问同时放行内网 ip
前言
处于安全性考虑,网站需要屏蔽国外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 注意是重启不是重载,否则可能会不生效