[英]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-address 、 ip-num 、 ip-to-int 、 ipaddr.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.