快速IPv6 CIDR号码或comaparable

我正在使用geoip数据库,导入ipv4数据库相当容易,CIDR格式被转换为范围和范围为整数。

但我无法find任何中心资源,我可以find如何存储和searchIPv6。

我试图将IPv6 CIDR转换为范围,search库

使用ipaddr.js转换为"2001:240:1000::/36"它返回[ { parts: [ 8193, 576, 4096, 0, 0, 0, 0, 0 ] }, 36 ] ,真的没办法将其转换为int

位search

 function ip62long($ipv6){ $ip_n = inet_pton($ipv6); $bits = 15; $ipv6long = 0; while($bits >= 0){ $bin = sprintf("%08b",(ord($ip_n[$bits]))); if($ipv6long){ $ipv6long = $bin . $ipv6long; } else{ $ipv6long = $bin; } $bits--; } return gmp_strval(gmp_init($ipv6long, 2), 10); } 

我正在尝试导入到mongodb,

请指导我如何在节点js中存储和searchipv6。

MongoDB没有数据types,非常适合IPv6地址。 整数只能达到64bit,而IPv6地址是128bit。

最好的解决方法可能是将它们存储为string。 当您不删除省略的零时,IPv6地址按字母顺序sorting。 这意味着你可以通过给出最小值和最大值来表示一个范围。 IP范围2001:240:1000::/36可以表示为:

{ from: "20010240100000000000000000000000", to: "200102401fffffffffffffffffffffff" }

要查找像2001:240:1024::125a:32fd这样的IP地址的范围,你可以执行这个查询:

 db.ipranges.find({ from: { $lt:"200102401024000000000000125a32fd"}, to: { $gt:"200102401024000000000000125a32fd"} }); 

但是,根据您的使用情况,仅存储IP范围的前64位就足够了。 在IPv6地址中,第一个64位是networking前缀,最后是64位接口标识符。 接口标识符可以是主机的MAC地址,也可以是完全随机的(具有隐私扩展function)。 界面标识符与地理位置没有关系。 这意味着您将不会遇到任何超过64位的GeoIP范围。 因此将IPv6范围的前64位存储为整数可能就足够了。