繁体   English   中英

找出单个 IP (v4/v6) 地址的 CIDR (TypeScript)

[英]Finding out CIDR for a single IP (v4/v6) Address (TypeScript)

我正在使用 TypeScript 处理一个项目,并且可以访问基于键值的存储。 要求是查找与单个 IP(匹配键)相关的数据。

不幸的是,关键始终是一个覆盖大量 IP 的 CIDR(由于许多记录而节省存储空间)。 在我的测试中,我无法找到属于特定 IP 的正确 CIDR。

示例数据:

"103.21.244.0/24" - "data, lorem ipsum, etc"

要查找的示例 IP:

"103.21.244.1"

我已经测试了几个库,如: ip-addressip-numip-to-intipaddr.js等等,但我无法得到我想要的结果。

也许我只是愚蠢,没有正确理解 IP 规范,或者我只是滥用了这些库,请赐教。

当然,必须有一种方法无需调用外部 API(如 RIPE),也无需存储数十亿个 IP 而不是它们的 CIDR。

基本上要求很简单:“通过这个 IP(v4 或 v6)找到这个 KEY(在 CIDR 中)”。

任何帮助、建议、示例解决方案都受到高度赞赏。

IP 地址可以转换为单个数字。 abcd形式只是 32 位数字的 base-256 表示。 将地址和子网掩码都转换为整数。 然后使用“按位与”操作将掩码应用到目标IP 地址并与网络地址进行比较。

 function addrToNumber(addr) { return addr.split(".").reduce((acc,cur,i)=> acc += (Number(cur) << ( (3-i) * 8) ) ,0) } function subnetMaskToNumber(mask) { return (0xffffffff << (32 - Number(mask))) & 0xffffffff; } const cidr = "103.21.244.0/24"; const [networkAddr,subnetMask] = cidr.split("/"); const ipAddr = "103.21.244.1"; const match = (addrToNumber(ipAddr) & subnetMaskToNumber(subnetMask)) == addrToNumber(networkAddr) console.log(match);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM