KING 博主等级

一帆风顺 ⛵️⛵️⛵️

Nginx安装GeoIP模块以及禁止国内外IP访问

钟晓川
2023-06-25 / 7 点赞 / 2160 阅读

最近配置了一下 nginx 的 ip 解析模块 ngx_http_geoip2_module ,接下来我会告诉你们如何安装 GeoIP2 模块以及怎么禁止国外以及国内 ip,以下是需要用到的文件

Releases · leev/ngx_http_geoip2_module (github.com)
Release 1.7.1 · maxmind/libmaxminddb (github.com)

配置

安装libmaxminddb

  • 下载 libmaxminddb 压缩包
cd /opt
wget https://github.com/maxmind/libmaxminddb/releases/download/1.7.1/libmaxminddb-1.7.1.tar.gz
  • 解压
tar zxvf libmaxminddb-1.7.1.tar.gz
  • 安装
cd libmaxminddb-1.7.1
./configure
make install

安装 GeoIP2 模块

  • 下载GeoIP2模块
# 进入你的nginx所在目录
cd /user/local/nginx/src
git clone https://github.com/leev/ngx_http_geoip2_module.git

# 如果提示 git 命令不存在可以自行安装
# centos
yum install -y git
  • 编译nginx
# 查看nginx安装的模块
nginx -V

# 将上条命令返回出来的文本复制追加在下面的命令后面,注意如果有“ngx_devel_kit”这个的话删掉不要复制在后面,因为我就不行,也不知道啥意思
./configure --with-http_stub_status_module \
--prefix=/user/local/nginx \ #--prefix要看你自己的目录,nginx -V 里面有
--user=www \
--group=www \ 
# 这里也是要看你自己的目录,nginx -V
# 这一行加上后面一大堆模块例如--add-module=xxxx
# 然后在最后加上ngx_http_geoip2_module --with-stream

然后

make
# 搞完之后备份nginx目录
cp -r <你的nginx目录> nginx-backup

# 覆盖nginx
rm nginx/sbin/nginx
cp nginx/src/objs/nginx nginx/sbin/nginx

# 重启nginx
systemctl restart nginx

下载 GeoIP 文件

浏览器打开 https://www.maxmind.com/
注册好账号后点击右上角的 My account
然后在左边点击 Download files

分别找到 GeoLite2 CityGeoLite2 Country,点击右边的 Download GZIP,然后解压,将里面的 mmdb 文件覆盖到 /usr/share/GeoIP

配置 nginx.conf

编辑nginx.conf文件,加入以下代码

http {
    # 上一层nginx的配置是 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 在这里想要取到这个值,需要在前面加http_ 且原字段全部变小写,横线变下划线
    map $http_x_forwarded_for $real_ip {
        ~^(\d+\.\d+\.\d+\.\d+) $1;
        default $remote_addr;
    }

    # geoip2的相关配置, 必须放在http节点下
    geoip2 /home/geoip2/GeoLite2-Country.mmdb {
        # 自动重新加载数据库文件
        auto_reload 5m;
        # source的意思是根据哪个字段来计算country_code,默认是$remote_ip
        # 因为前面还有一层nginx,所以remote_ip不是想要的真正的ip
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_name source=$real_ip country names en;
        $geoip2_data_country_code source=$real_ip country iso_code;
        $geoip2_data_country_continent source=$arg_ip continent names en;
    }
    server {
        # 对US|HK|KR|JP|CN|RU这几个国家禁止访问
        location / {
	        set $is_allow 0;
	        if ($geoip2_data_country_code ~* "(US|HK|KR|JP|CN|RU)") {
	            set $is_allow 1;
	        }
	        if ($is_allow = 1) {
	            return 403 'deny';
	            break;
	        }
        proxy_pass https://s3;
    }
}
  • 禁止国外ip访问
if ($allowed_country = yes) {
	# 这里可以返回百度网页,或者直接返回404
	# return https://www.baidu.com;
	# return /home/japan;
	return 404;
}

参考
nginx install geoip2 module - 掘金 (juejin.cn)
通过 Nginx 来实现禁止国外 IP 访问网站 - 知乎 (zhihu.com)
nginx 使用 geoip2,对个别国家限制访问,多层 nginx 代理解决方法_小洋 - 的博客 - CSDN 博客

7