我正在尝试追踪曾在我的系统中注册过的用户。我有他的真名,我知道他来自挪威。由于他的真实姓名没有存储在系统的任何地方,因此追踪他的唯一方法就是使用他来自挪威的。
在过去几个月的日志中,我提取了一份2000个IP地址列表,其中包含了他的IP。此文件名为ips.txt,每行有一个IP。知识产权来自世界各地,主要来自巴尔干,南美和中东(是的,这是一个多元化的用户群)。
此文件中有2000个IP地址:每行一个。其中大部分(60%左右)来自埃及和Tunesia,因为这些国家/地区的用户没有专用的IP地址。
从http://www.ipdeny.com/ipblocks/我已经列出了包含挪威所有子网的列表。更具体地说:http://www.ipdeny.com/ipblocks/data/aggregated/no-aggregated.zone(不确定此列表是否完整)
我的问题:如何从区域文件中的一个子网中选择ips.txt中的所有IP?
说明:
#IPs * #subnets
(二次)时间。我真的不关心效率,所以脚本大约需要一个小时。答案 0 :(得分:1)
另一种可能的方法是使用GeoIP数据库,并对每个IP地址进行查询以获取国家/地区。您可以在本地免费下载这些数据库,并在那里实施API(网络和本地),实现起来会更加简单。
答案 1 :(得分:0)
这是我试图解决此问题的(非功能性)代码。我通过使用另一个需要较少工作的IP数据库解决了我的问题。我希望这个剧本中只有一个愚蠢的错误,所以我觉得将来最终会有人帮助你!
var fs = require('fs');
var iparray = fs.readFileSync('ips.txt').toString().split("\n");
var subnets = fs.readFileSync('norway.txt').toString().split("\n");
var ips = [];
var ipsubnets = [];
var answer = [];
// IP to 32-bit int
for (var i=0; i<iparray.length; i++) {
if (iparray[i] != '') {
var ipwub = iparray[i].split(".")
var ip = (ipwub[0] << 24) + (ipwub[1] << 16) + (ipwub[2] << 8) + (ipwub[3] << 0)
ips.push (ip);
}
}
//console.log (ips)
// Subnet to 32-bit int
for (var i=0; i<subnets.length; i++) {
if (subnets[i] != '') {
var subnetarray = subnets[i].split("/");
var subnetsize = subnetarray[1] << 0;
var ipwub = subnetarray[0].split(".")
var ip = (ipwub[0] << 24) + (ipwub[1] << 16) + (ipwub[2] << 8) + (ipwub[3] << 0)
ipsubnets.push ([ip,subnetsize]);
}
}
//console.log (ipsubnets)
// Check it
iploopy: for (var j=0; j<ipsubnets.length; j++) {
for (var i=0; i<ips.length; i++) {
var ip = ips[i];
var subnet = ipsubnets[j][0];
var size = ipsubnets[j][1];
//console.log (ip >> size, subnet >> size, size)
if ((ip >> size) == subnet >> size) {
answer.push(ip)
//console.log (ip,subnet,size)
continue iploopy;
}
}
}
// Get the answer
for (var i=0; i<answer.length; i++) {
var ip = answer[i]
//console.log (ip)
console.log ( ((ip >>24) & 255) + "." + ((ip >>16) & 255) + "." + ((ip >>8) & 255) + "." + ((ip >>0) & 255) )
}
console.log()
console.log(answer.length)