2016-06-23 1 views
1

Я пытаюсь отследить пользователя, зарегистрированного в моей системе. У меня есть его настоящее имя, и я знаю, что он из Норвегии. Поскольку его настоящее имя не хранится нигде в системе, единственный способ проследить его - использовать его из Норвегии.Получить все IP-адреса из текстового файла, которые находятся в файле, содержащем все подсети

Из журналов за последние несколько месяцев я извлек список 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 (не уверен, что этот список полный)


Мой вопрос: Как я могу выбрать все IP-адреса из ips.txt, которые находятся в одной из подсетей из файла зоны?


Примечания:

  • Я знаю, это, вероятно, займет #IPs * #subnets (квадратное) время. Я не забочусь об эффективности, так что сценарий завершен примерно через час.
  • Я добавил тег Regex, но я понятия не имею, как разбирать IP-подсети с помощью regex.
  • Все IPv4
+1

Это, безусловно, ** COULD ** будет комбинацией RegEx и еще чего-то. JavaScript, вероятно, тоже будет работать. Любой конкретный язык, который вы хотите использовать? – Erutan409

+0

В настоящее время я использую очень уродливый способ: IP -> 32 бит int; затем проверьте его "(ip >> subnetlength) & (подсеть >> subnetlength) == 0". Должен быть более умный способ, но, возможно, я закончу его, прежде чем кто-то придумает умное решение. Если это так, я поставлю свой собственный ответ в комментариях! – Jasper

ответ

1

Другим возможным способом является использование базы данных GeoIP и запрос на каждый IP-адрес для получения страны. Вы можете бесплатно загрузить эти базы данных на месте, там реализованы API (как сетевые, так и локальные), и его было бы намного проще реализовать.

+0

Я посмотрю, что! – Jasper

+0

https://freegeoip.net/ выглядит многообещающим! Также почасовая 10к квота находится в моих пределах. Отлично! Спасибо – Jasper

+1

Я использовал maxmind, у него есть apis для многих языков и ipdates бесплатная версия local db (которая имеет страны и города) еженедельно – buld0zzr

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)