2016-06-09 12 views
0

Für ein Projekt über Netzwerksicherheit, an dem ich gerade arbeite, habe ich eine Liste aller IPs in meinem Land (und anderen relevanten Feldern) in einer mongoDB-Sammlung.Mehrere Filter auf mongoDB mongoengine

So:

{ 
    "_id" : ObjectId("56674d3d9ee3d40b79167e09"), 
    "ip" : "200.6.116.75", 
    "server" : "Microsoft-IIS/7.5", 
    "date" : "2015-11-23" 
} 

Die Sache ist, dass ich jetzt auf ihren gegebenen ASN (Autonomous System) filtern möchten. Ich habe eine andere Sammlung, auf der ich die ASN und gegebene IP-Blöcke habe. Hier ist ein Beispiel für ASN 6429.

{ 
    "_id" : ObjectId("572ba2611c8e25e0a9c44f64"), 
    "ASN" : "6429", 
    "ip_block" : "200.14.215.0/24" 
}{ 
    "_id" : ObjectId("572ba2611c8e25e0a9c44f65"), 
    "ASN" : "6429", 
    "ip_block" : "200.27.0.0/16" 
} 

Jetzt, gibt es eine einfache Möglichkeit, eine Abfrage-Filterung an einem bestimmten ASN zu machen?

Konkret würde ich gerne nach jeder IP fragen, die meinem gegebenen ASN entspricht, indem ich frage, ob die IP in einem IP-Block für einen solchen ASN übereinstimmt.

Eine andere Sache, die ich tun könnte, ist nur nach den Daten fragen und nicht nach ASN filtern, und dann könnte ich Dinge auf Python ausfiltern, aber es scheint mir, dass solche Abfragen vom DBMS durchgeführt werden sollten.

Alle Hinweise werden sehr geschätzt.

Antwort

1

Um einen effizienten Abfrageparameter für die IP-Suche zu haben, werde ich wahrscheinlich die Art und Weise, wie IP gespeichert wird, erweitern.

Wie bei einer normalen Schreibweise haben wir nur Zeichenfolge, die nicht leicht von 4 ganzen Zahlen in Mongo extrahiert werden kann, um festgelegt, was Sie Adresse in einer solchen Form zu speichern denken:

{ 
    "ip" : "200.6.116.75", 
    ipaddress:{a:200, b:6, c:116, d:75} 
} 

Warum?

weil netmask haben wir max und min Adresse berechnen können.

Lassen Sie uns sagen, wir haben 'APN: 200.4.0.0/14'

Address: 200.4.0.0    11001000.000001 10.01110001.00000000 
Netmask: 255.252.0.0 = 14  11111111.111111 00.00000000.00000000 
Wildcard: 0.3.255.255   00000000.000000 11.11111111.11111111 
=> 
Network: 200.4.0.0/14   11001000.000001 00.00000000.00000000 (Class C) 
Broadcast: 200.7.255.255   11001000.000001 11.11111111.11111111 
HostMin: 200.4.0.1    11001000.000001 00.00000000.00000001 
HostMax: 200.7.255.254   11001000.000001 11.11111111.11111110 
Hosts/Net: 262142  

dann unsere Abfrage aussehen:

db.col.find({"ipaddress.a":200, 
      $and:{[ {"ipaddress.b": {$gte:3}},{"ipaddress.b": {$lte:7} }}}) 

, da dies ein Overhead auf Anwendungsseite ergänzt - es wird wieder voll Ergebnisabfrage

als Abfrage Generation könnte schwierig sein - die >= und <= Operatoren Gruppe nach bitmask Größe

1-8 group a 
9-16 group b 
17-23 group c 
24-32 group b 
+0

beeinflussen müssen, dass ein kluger Weg, um das Problem zu umgehen. Vielen Dank! –