从文本文件中获取包含所有子网

时间:2016-06-23 19:20:54

标签: regex ip subnet

我正在尝试追踪曾在我的系统中注册过的用户。我有他的真名,我知道他来自挪威。由于他的真实姓名没有存储在系统的任何地方,因此追踪他的唯一方法就是使用他来自挪威的。

在过去几个月的日志中,我提取了一份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(二次)时间。我真的不关心效率,所以脚本大约需要一个小时。
  • 我添加了标记Regex,但我不知道如何使用正则表达式解析IP子网。
  • 一切都是IPv4

2 个答案:

答案 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)