立即注册  找回密码
 立即注册
CeraNetworksBGVM服务器主机交流会员请立即修改密码Sharktech防护
查看: 85|回复: 7

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

[复制链接]

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

[复制链接]

134

主题

352

回帖

2140

积分

金牌会员

积分
2140
1121744186

134

主题

352

回帖

2140

积分

金牌会员

积分
2140
2021-3-19 15:04:18 | 显示全部楼层 |阅读模式
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
回复

使用道具 举报

20

主题

224

回帖

1166

积分

金牌会员

积分
1166
3333

20

主题

224

回帖

1166

积分

金牌会员

积分
1166
2021-3-19 15:42:49 | 显示全部楼层
帮顶

回复

使用道具 举报

3

主题

568

回帖

1497

积分

金牌会员

积分
1497
CCCP

3

主题

568

回帖

1497

积分

金牌会员

积分
1497
2021-3-19 15:27:01 | 显示全部楼层


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

使用道具 举报

487

主题

4346

回帖

1万

积分

论坛元老

积分
10987
我是坏虫

487

主题

4346

回帖

1万

积分

论坛元老

积分
10987
2021-3-19 15:28:08 | 显示全部楼层
支持技术贴,绑定
回复

使用道具 举报

18

主题

315

回帖

1028

积分

金牌会员

积分
1028
hardwar

18

主题

315

回帖

1028

积分

金牌会员

积分
1028
2021-3-19 15:34:34 | 显示全部楼层

支持技术贴,绑定
回复

使用道具 举报

89

主题

373

回帖

1705

积分

金牌会员

积分
1705
百度网盘

89

主题

373

回帖

1705

积分

金牌会员

积分
1705
2021-3-19 15:36:21 | 显示全部楼层
我倒是想用这个库来做个dnspod的仿站
回复

使用道具 举报

3

主题

13

回帖

63

积分

注册会员

积分
63
lhspang

3

主题

13

回帖

63

积分

注册会员

积分
63
2021-3-19 15:38:05 | 显示全部楼层
mark
回复

使用道具 举报

22

主题

3130

回帖

7180

积分

论坛元老

积分
7180
sdqu

22

主题

3130

回帖

7180

积分

论坛元老

积分
7180
2021-3-19 15:47:39 | 显示全部楼层
好麻烦啊,还是cf方便些
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|小黑屋|HS2V主机综合交流论坛

GMT+8, 2024-12-27 04:04 , Processed in 0.022589 second(s), 2 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表