Nginx 利用 geoip2 屏蔽特定ASN访问

分享讨论IT相关的内容
回复
头像
圈宝
圈圈守护者
圈圈守护者
帖子: 76
注册时间: 2020年 12月 4日 20:46
我的状态: 🎯
为圈友点赞: 87 次
被赞次数: 18 次

Nginx 利用 geoip2 屏蔽特定ASN访问

帖子 圈宝 »

前言

这几天论坛遭到恶意爬取,给系统资源带来了极大的负担,我们一开始只采取了频率限制措施,但这治标不治本,比如可以利用代理池轻易的绕过。

继续研究之后,我们发现使用geoip2模块可以帮助我们更好的应对这样的问题。

安装geoip2模块

项目地址: https://github.com/leev/ngx_http_geoip2_module
Debian系统可以直接利用包管理器安装

代码: 全选

sudo apt update
sudo apt install libnginx-mod-http-geoip2
如果你是手动编译安装的Nginx,请参照项目里的文档编译模块即可。

配置Nginx使其屏蔽特定ASN

ASN 全称 autonomous system number(自治系统编号),可阅读 What is an autonomous system? | What are ASNs? 了解更多信息

首先下载Maxmind GeoLite ASN数据库: https://github.com/P3TERX/GeoLite.mmdb/ ... 2-ASN.mmdb

接着在/etc/nginx目录下创建一个 blocked_asns.txt 文件,里面记录着我们打算屏蔽的ASN号(比如常见的云服务商的ASN,像 AS45102 就是阿里云的一个ASN)

代码: 全选

45102 1;
37963 1;
24429 1;
136907 1;
8068 1;
133478 1;
45090 1;
132203 1;
31898 1;
16276 1;
16509 1;
14618 1;
7224 1;
36352 1;
199524 1;
202422 1;
51167 1;
141995 1;
35540 1;
202053 1;
25697 1;
14061 1;
20473 1;
64515 1;
63949 1;
48337 1;
209366 1;
24940 1;
23033 1;
34665 1;
197706 1;
136557 1;
9009 1;
3214 1;
8888 1;
3258 1;
3204 1;
4785 1;
6233 1;
9312 1;
949 1;
268581 1;
212238 1;
394256 1;
11878 1;
39351 1;
50304 1;
51765 1;
43513 1;
51852 1;
46562 1;
8100 1;
207990 1;
35916 1;
201106 1;
再创建一个 block_by_asn.conf 文件

代码: 全选

if ($block) {
        return 403;
}
然后编辑 /etc/nginx/nginx.conf 文件,在http字段补充相关内容

代码: 全选

http {
        geoip2 /etc/nginx/GeoLite2-ASN.mmdb {
                $asn_data autonomous_system_number;
        }

        map $asn_data $block {
                default 0;
                include /etc/nginx/blocked_asns.txt;
        }
}
最后在你需要屏蔽ASN的server中引入 block_by_asn.conf

代码: 全选

server {
        include /etc/nginx/block_by_asn.conf;
}
然后重启Nginx即可

代码: 全选

sudo systemctl restart nginx

测试效果

首先访问: https://ip.qqs.tw/
找到你现在的ASN号码,比如 AS22222,那么你的ASN号就是 22222
blocked_asns.txt 中添加一行

代码: 全选

22222 1;
接着重载服务

代码: 全选

sudo nginx -s reload
最后访问你的服务,看是否返回403被屏蔽的状态信息,如果是那么说明配置生效了。

总结

这篇文章介绍了如何利用Nginx的geoip2模块结合Maxmind的ip数据库屏蔽从特定ASN发起的请求。
这样配置的好处是不用手动针对某一个ip地址,编写冗长和复杂的规则,极大的提高了操作效率。
甚至利用geoip2模块,还可以针对特定国家或城市进行相应的操作,不再局限于WAF防火墙功能,还可以做基于地理位置信息的负载均衡。

补充说明,如果想为黑名单中的某个ip地址或CIDR地址段过白,可以这么操作
创建一个 whitelist_ips.txt 文件,比如

代码: 全选

1.0.0.1 0;
10.1.0.0/16 0;
2607:f130:0:15::1 0;
编辑 /etc/nginx/nginx.conf 文件,在 http 字段补充相关内容

代码: 全选

http {
        geo $whitelist {
                default 1; 
                include /etc/nginx/whitelist_ips.txt;
        }
        
        map "$block:$whitelist" $do_block {
                default 0;
                "1:1" 1;
        }
}
最后修改 block_by_asn.conf,改为

代码: 全选

if ($do_block) {
        return 403;
}
圈宝 的这篇帖子被以下2个圈友点了赞:
BobMaster, ejsoon
当时明月在,曾照彩云归
回复

在线用户

正浏览此版面之用户: Bing [Bot] 和 4 访客