2016-06-23 15 views
1

Ich versuche, einen Benutzer zu finden, der einmal in meinem System registriert ist. Ich habe seinen richtigen Namen und ich weiß, dass er aus Norwegen kommt. Da sein richtiger Name nirgendwo im System gespeichert ist, ist der einzige Weg, ihn ausfindig zu machen, dass er aus Norwegen kommt.Erhalten Sie alle IPs aus Textdatei, die in einer Datei sind, die alle Subnetze enthält

Aus Logs in den letzten Monaten habe ich eine Liste von 2000 IP-Adressen extrahiert, die sicherlich seine IP enthält. Diese Datei heißt ips.txt und hat eine IP pro Zeile. Die IP's kommen von überall auf der Welt, hauptsächlich aus dem Balkan, Südamerika und dem Mittleren Osten (ja, das ist eine ziemlich vielfältige Benutzerbasis).

In dieser Datei befinden sich 2000 IP-Adressen: eine pro Zeile. Die meisten von ihnen (60% oder so) kommen aus Ägypten und Tunesien, da die Nutzer aus diesen Ländern keine dedizierten IP-Adressen haben.

Von http://www.ipdeny.com/ipblocks/ Ich habe eine Liste mit allen Subnetzen aus Norwegen genommen.


Meine Frage http://www.ipdeny.com/ipblocks/data/aggregated/no-aggregated.zone (falls diese Liste vollständig ist nicht sicher): Insbesondere Wie kann ich alle IPs von ips.txt auswählen, die in einem der Teilnetze aus der Zonendatei sind?


Bemerkungen:

  • Ich bin mir bewusst, dies wahrscheinlich #IPs * #subnets (quadratisch) Zeit in Anspruch nehmen wird. Ich interessiere mich nicht wirklich für die Effizienz, so lange das Skript in etwa einer Stunde fertig ist.
  • Ich habe das Tag Regex hinzugefügt, aber ich habe keine Ahnung, wie die IP-Subnetze mit Regex analysiert werden.
  • Alles ist IPv4
+1

Es wird sicherlich ** kann eine Kombination von RegEx und etwas anderes sein. JavaScript würde wahrscheinlich auch funktionieren. Möchten Sie eine bestimmte Sprache verwenden? – Erutan409

+0

Ich benutze derzeit einen sehr hässlichen Weg: IP -> 32 Bit int; dann teste es "(IP >> Subnetzlänge) & (Subnetz >> Subnetzlänge) == 0". Es muss einen klügeren Weg geben, aber vielleicht werde ich es fertigstellen, bevor jemand anderes eine kluge Lösung findet. Wenn dies der Fall ist, werde ich meine eigene Antwort in den Kommentaren setzen! – Jasper

Antwort

1

Eine andere Möglichkeit besteht darin, eine GeoIP-Datenbank zu verwenden und Abfragen für jede IP-Adresse durchzuführen, um das Land zu erhalten. Sie können diese Datenbanken lokal kostenlos herunterladen, es gibt APIs (sowohl im Netzwerk als auch lokal) und es wäre viel einfacher zu implementieren.

+0

Ich werde das sehen! – Jasper

+0

https://freegeoip.net/ sieht vielversprechend aus! Auch die stündliche 10k-Quote liegt innerhalb meiner Grenzen. Das ist toll! Danke – Jasper

+1

Ich benutzte maxmind, es hat apis für viele Sprachen und ipdates die freie Version lokale db (die Länder und Städte hat) wöchentlich – buld0zzr

0

Hier ist ein (nicht funktionsfähig) Code, den ich mit diesem Problem zu lösen versucht. Ich löste mein Problem, indem ich eine andere IP-Datenbank benutzte, die weniger Arbeit erforderte. Ich erwarte, dass es in diesem Drehbuch irgendwo nur einen dummen Bug gibt, also denke ich, dass jemand in Zukunft vielleicht davon profitieren kann!

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)