【问题标题】:How to check if a given ip falls between a given ip range using node js如何使用节点js检查给定的ip是否在给定的ip范围之间
【发布时间】:2018-02-22 07:34:06
【问题描述】:

请原谅这个琐碎的问题

给定一组IP,该组相当大,可能会增加 https://github.com/client9/ipcat/blob/master/datacenters.csv#L4

小例子集 - 第一列开始 ip 第二 - 结束 ip 范围

我将从请求中获取用户 ip。我需要检查 ip 是否在这些范围内。我如何做到这一点。

我已经调查过ip_range_checkrange_check

但他们不检查给定范围的 ip。这在节点 js 中如何实现最高性能。我不想进行详尽的搜索,因为性能是重中之重。

请帮助我做一些新的和相当具有挑战性的事情。

【问题讨论】:

  • 这可能不是最佳方式。但我建议您将 IP 范围转换为 CIDR,然后使用 ip_range_check 检查 IP 是否属于 CIDR。我相信您可以使用rangecalc 将范围转换为 CIDR。
  • @Deja 一个小例子将不胜感激。谢谢

标签: javascript node.js ip


【解决方案1】:

如果我们将 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)
);

【讨论】:

  • 感谢您的回答,但考虑到较大的 ip 集,它会很快还是提供我们需要检查的 ip 的良好性能位于表的底部
  • @infosys 可以通过将表格从 ips 转换为数字一次来优化它。 (而且我认为进一步的优化需要大量的内存消耗)看看 bloom 过滤器,它们可能会满足您的需求。
  • 谢谢,我会将 ip 转换为数字,这不是一个不需要该功能的问题,但是什么是布隆过滤器,如何将其添加到该功能并进行搜索?我会投票赞成并接受它
  • @infosys 不客气;),正如我所说,如果您使用大表进行查找(例如,每个 ip 地址都存储为布尔值),那么您将消耗大量内存,但速度非常快。布隆过滤器使用较小的内存但会降低精度。
  • 我研究了布隆过滤器,就像 java 的哈希表一样。但是如何插入 ip 范围并获取 ip 范围这可能是我想到的另一个问题。或者如何用 min max 搜索bloom过滤器?
【解决方案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

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

【讨论】:

  • 这会起作用,但这将像蛮力一样详尽无遗。更明智的性能会更好,因为我们拥有您认为的巨大 ip 范围。仍然是一个解决方案
  • 这可能会有所帮助iptrie
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 2021-07-12
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2017-05-21
相关资源
最近更新 更多