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

Get all IPs from textfile that are in a file containing all subnets

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

从过去几个月的日志中,我提取了 2000 个 IP 地址的列表,其中肯定包括他的 IP。这个文件叫做 ips.txt,每行有一个 IP。 IP 来自世界各地,主要来自巴尔干、南美和中东(是的,这是一个相当多样化的用户群)。

此文件中有 2000 个 IP 地址:每行一个。其中大部分(60% 左右)来自埃及和突尼西亚,因为这些国家/地区的用户没有专用 IP 地址。

来自 http://www.ipdeny.com/ipblocks/ I've taken a list containing all subnets from Norway. More specifically: http://www.ipdeny.com/ipblocks/data/aggregated/no-aggregated.zone(不确定此列表是否完整)


我的问题:如何 select 来自 ips.txt 的所有 IP,这些 IP 在区域文件的子网之一内?


备注:

这是我用来解决这个问题的(非功能性)代码。我通过使用另一个 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)

另一种可能的方法是使用 GeoIP 数据库,并查询每个 IP 地址以获取国家/地区。您可以在本地免费下载这些数据库,已经实现了 API(网络和本地),实现起来会简单得多。