从包含所有子网的文件中的文本文件中获取所有 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 在区域文件的子网之一内?
备注:
- 我知道这可能需要
#IPs * #subnets
(二次)时间。我不太关心效率,只要脚本在一个小时左右就完成了。
- 我添加了正则表达式标签,但我不知道如何使用正则表达式解析 IP 子网。
- 一切都是 IPv4
这是我用来解决这个问题的(非功能性)代码。我通过使用另一个 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(网络和本地),实现起来会简单得多。
我正在尝试追踪曾经在我的系统中注册过的用户。我知道他的真名,我知道他来自挪威。由于他的真实姓名没有存储在系统中的任何地方,唯一的追踪他的方法就是使用他来自挪威。
从过去几个月的日志中,我提取了 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 在区域文件的子网之一内?
备注:
- 我知道这可能需要
#IPs * #subnets
(二次)时间。我不太关心效率,只要脚本在一个小时左右就完成了。 - 我添加了正则表达式标签,但我不知道如何使用正则表达式解析 IP 子网。
- 一切都是 IPv4
这是我用来解决这个问题的(非功能性)代码。我通过使用另一个 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(网络和本地),实现起来会简单得多。