Nginx根据IP的国家、城市、ASN访问控制

174次阅读

共计 3900 个字符,预计需要花费 10 分钟才能阅读完成。

1、必要前提环境

NGINX
IP 数据库
IP 数据库下载地址:https://www.maxmind.com 登录后可以免费下载开源的数据库,效果还是很不错的,改网站也提供商业付费的数据库。

-> GeoLite2-ASN.mmdb
-> GeoLite2-City.mmdb
-> GeoLite2-Country.mmdb

ASN 相当于 ip 的品牌号码,可用来鉴别各个机房的 ip,查询对应 IDC 机房的 ASN 可以到该网站:http://bgp.he.net

2、安装 libmaxminddb 用于查询 mmdb 数据库

yum -y install libmaxminddb-devel
3、测试工具

mmdblookup –file GeoLite2-Country.mmdb –ip= 测试 ip
4、安装 ngx_http_geoip2_module

cd /
git clone https://github.com/leev/ngx_http_geoip2_module
进入 NGINX 的源码目录下,宝塔的话是 /www/server/nginx/src,

cd /www/server/nginx/src
nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.1.1g  21 Apr 2020
TLS SNI support enabled
configure arguments: –user=www –group=www –prefix=/www/server/nginx –add-module=/www/server/nginx/src/ngx_devel_kit –add-module=/www/server/nginx/src/lua_nginx_module –add-module=/www/server/nginx/src/ngx_cache_purge –add-module=/www/server/nginx/src/nginx-sticky-module –with-openssl=/www/server/nginx/src/openssl –with-pcre=pcre-8.43 –with-http_v2_module –with-stream –with-stream_ssl_module –with-stream_ssl_preread_module –with-http_stub_status_module –with-http_ssl_module –with-http_image_filter_module –with-http_gzip_static_module –with-http_gunzip_module –with-ipv6 –with-http_sub_module –with-http_flv_module –with-http_addition_module –with-http_realip_module –with-http_mp4_module –with-ld-opt=-Wl,-E –with-cc-opt=-Wno-error –with-ld-opt=-ljemalloc –with-http_dav_module –add-module=/www/server/nginx/src/nginx-dav-ext-module
复制 configure arguments: 后面的全部内容,再最后面加上 –add-dynamic-module=/ngx_http_geoip2_module

./configure –user=www –group=www –prefix=/www/server/nginx –add-module=/www/server/nginx/src/ngx_devel_kit –add-module=/www/server/nginx/src/lua_nginx_module –add-module=/www/server/nginx/src/ngx_cache_purge –add-module=/www/server/nginx/src/nginx-sticky-module –with-openssl=/www/server/nginx/src/openssl –with-pcre=pcre-8.43 –with-http_v2_module –with-stream –with-stream_ssl_module –with-stream_ssl_preread_module –with-http_stub_status_module –with-http_ssl_module –with-http_image_filter_module –with-http_gzip_static_module –with-http_gunzip_module –with-ipv6 –with-http_sub_module –with-http_flv_module –with-http_addition_module –with-http_realip_module –with-http_mp4_module –with-ld-opt=-Wl,-E –with-cc-opt=-Wno-error –with-ld-opt=-ljemalloc –with-http_dav_module –add-module=/www/server/nginx/src/nginx-dav-ext-module –add-dynamic-module=/ngx_http_geoip2_module

make
然后在当前目录的 objs 目录下面得到编译好的 ngx_http_geoip2_module.so

nginx.conf

load_module /modules/ngx_http_geoip2_module.so;

http
{
        geoip2 /www/ipdb/GeoLite2-Country.mmdb {
          auto_reload 60m;
          $geoip2_metadata_country_build metadata build_epoch;
          $geoip2_data_country_code default=CN source=$remote_addr country iso_code;
          $geoip2_data_country_name country names en;
        }

        geoip2 /www/ipdb/GeoLite2-City.mmdb {
          $geoip2_data_city_name default=null city names en;
        }
        geoip2 /www/ipdb/GeoLite2-ASN.mmdb {
          $geoip2_data_asn_code default=0 autonomous_system_number;
          $geoip2_data_asn_name default=null autonomous_system_organization;
        }
    //…… 省略
}
默认是使用 $remote_addr,一般反向代理是 X-Forwarded-For,CF 是 CF-Connecting-IP,需要自定义 使用 source=$remote_addr 设置。

5、测试展示

location /ip
{
  default_type    text/html;
  return 200 ‘$geoip2_data_country_code $geoip2_data_country_name  $geoip2_data_city_name  $geoip2_data_asn_name $geoip2_data_asn_code’;
}

location /
{
    if ($geoip2_data_country_name = “Japan”) {
        return 444;
    }
    //…. 省略
}
最后解释下 $geoip2_data_country_name country names en;

country names en 就是结果的 JSON 结构,举一反三使用 mmdblookup 工具可以查看数据内容。

{
    country:{
        names:{
            en:”US”
        }
    }

}

格式化不是很好,具体到 我的博客上看吧  https://lmcw.cn/174.html

网友回复:

注册 帮顶

1121744186 你还是发 loc 吧,万一那天你博客关闭了,又是麻烦

3333 这个库不用注册 方便点 https://db-ip.com/db/lite.php

CCCP 支持技术贴,绑定

我是坏虫 支持技术贴,绑定

hardwar 我倒是想用这个库来做个 dnspod 的仿站

百度网盘 mark

lhspang 好麻烦啊, 还是 cf 方便些

注册 是的,CF 可以透传给后端国家代码。不过 CF 貌似对百度搜索不友好,我的一个小破站因为套了 CF,就收录了个位数,半年多了。

注册 战略 mark

micto 百度跟 cf 结仇了, 基本上套 cf 的站收录都不好, 建议用个 dnspod 解析, 把百度的蜘蛛回源.

alivefox 套 CF 速度就很拉胯了

imslc 技术贴,支持

1121744186 技术贴 M 了

sojurice 技术贴

blacklife 帮顶

88170351 好麻烦啊, 还是 cf 方便些

正文完