前言
这几天论坛遭到恶意爬取,给系统资源带来了极大的负担,我们一开始只采取了频率限制措施,但这治标不治本,比如可以利用代理池轻易的绕过。继续研究之后,我们发现使用geoip2模块可以帮助我们更好的应对这样的问题。
安装geoip2模块
项目地址: https://github.com/leev/ngx_http_geoip2_moduleDebian系统可以直接利用包管理器安装
代码: 全选
sudo apt update
sudo apt install libnginx-mod-http-geoip2
配置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;
}
}
block_by_asn.conf
代码: 全选
server {
include /etc/nginx/block_by_asn.conf;
}
代码: 全选
sudo systemctl restart nginx
测试效果
首先访问: https://ip.qqs.tw/找到你现在的ASN号码,比如 AS22222,那么你的ASN号就是 22222
在
blocked_asns.txt
中添加一行
代码: 全选
22222 1;
代码: 全选
sudo nginx -s reload
总结
这篇文章介绍了如何利用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;
}