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/libmaxminddbapt 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 注意是重启不是重载,否则可能会不生效