簡體   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