我观察到您的许多 ip 看起来像这样:
123.123.123.0 - 123.123.123.255
所以要过滤掉它们,我们只需要阻止每个 ip 开头:
123.123.123
现在只剩下 16E6 个 IP 范围被阻止。但是,您可能只会阻止其中的一些,这使我们能够将其存储在 Set 中。一点代码:
const blockedRange = new Set();
function IPtoBlock(ip){
return ip.split(".").slice(0,3).join(".");
}
//to block an ip range ( if youve got one ip of it):
blockedRange.add( IPtoBlock("192.168.2.48") );
//to check for an ip
blockedRange.has( IPtoBlock( someip ));
所以现在只有几个范围不是块,比如:
5.44.26.144 - 5.44.26.159
但是,嘿,只有 15 个 ip,我们可以将其添加到禁止 ip 列表中:
const blockedIPs = new Set();
function NumtoIP(num){
return (num+"").split("").reduce((res,char,i) =>
res + (!i || i%3?"":".") + (char === "0"?"":char)
,"");
}
function addRange(start,end){
start = IPtoNum(start);
end = IPtoNum(end);//include from last answer
for(var i = start; i <= end; i++){
blockedIPs.add( NumtoIP( i ) );
}
}
因此,当迭代我们的范围列表时,我们可以分开:
ranges.forEach(([min,max]) => {
if( min.substr(-1) === "0" && max.substr(-3) === "255" ){
blockedRange.add( IPtoBlock( min ) );
}else{
addRange(min, max);
}
});
检查 ip 是否未通过检查
function isBlocked(ip){
return blockedIPs.has(ip) && blockedRange.has( IPtoBlock(ip) );
}