2017-09-13 53 views
0

请原谅给定一组IP的设定这个繁琐的问题如何检查是否给定的IP使用指定的IP范围介于节点JS

是相当大的,可能会增加 https://github.com/client9/ipcat/blob/master/datacenters.csv#L4

小例子集 - 第一列开始IP第二 - 端IP范围

enter image description here

我会从reques用户IP t。我需要检查ip是否属于这些范围。我如何做到这一点。

我查看了ip_range_checkrange_check

但他们不检查给定范围的IP。如何在节点js中实现最佳性能。我不想去穷尽搜索,因为性能是一个重要的优先事项。

请帮助一些新的东西,对我来说相当具有挑战性。

+0

这可能不是最优的方式。但我建议你将IP范围转换为CIDR,然后使用ip_range_check检查IP是否属于CIDR。我相信你可以使用[rangecalc](https://www.npmjs.com/package/rangecalc)将范围转换为CIDR。 – Deja

+0

@Deja一个小例子将真正赞赏。谢谢 – INFOSYS

回答

4

这是很容易的,如果我们转换的IPS简单的数字:

function IPtoNum(ip){ 
    return Number(
    ip.split(".") 
     .map(d => ("000"+d).substr(-3)) 
     .join("") 
); 
} 

然后,我们可以检查在一定的范围为:

if(IPtoNum(min) < IPtoNum(val) && IPtoNum(max) > IPtoNum(val)) alert("in range"); 

这也可以应用到表:

const ranges = [ 
    ["..41", "192.168.45"], 
    ["123.124.125"," 126.124.123"] 
]; 

const ip = "125.12.125"; 
const inRange = ranges.some(
    ([min,max]) => IPtoNum(min) < IPtoNum(ip) && IPtoNum(max) > IPtoNum(ip) 
); 
+0

感谢这个答案,但考虑到大型IP设置将是快速或给一个好我们需要检查表的底部的性能 – INFOSYS

+0

@infosys可以通过将表从ips转换为数字来优化它。 (并且我认为进一步的优化需要大量的内存消耗)并且看看* bloom filters *,他们可能会做你正在寻找的东西。 –

+0

谢谢我将IP转换为数字不是一个问题,该功能将不会被要求,但布隆过滤器如何将它添加到该和搜索?我会投票答复并接受它 – INFOSYS

2
//Use getCIDR from rangecalc 
getCIDR("5.9.0.0", "5.9.255.255") 
//This return 5.9.0.0/16 

//You can then use ipRangeCheck from ip_range_check 
ipRangeCheck("IP TO BE CHECKED", "5.9.0.0/16") 
//returns true or false 

很确定还有其他方法可以做到这一点。

+0

这将工作,但这将是穷举像蛮力。更明智的性能会更好,因为我们拥有庞大的IP范围。仍然是一个解决方案none – INFOSYS

+0

这可能会有所帮助[iptrie](https://github.com/postwait/node-iptrie) – Deja

相关问题