2016-06-09 44 views
0

對於我正在開發的網絡安全項目,我在mongoDB集合中列出了我的國家(和其他相關字段)中的每個IP。mongoDB mongoengine上的多個過濾器

像這樣:

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

的事情是,現在我要對他們給予ASN(自治系統號)進行過濾。我有另一個集合,我有ASN和IP塊。 下面是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" 
} 

一個例子現在,有沒有簡單的方法,使在任何給定ASN查詢過濾?

具體而言,我想問每個IP與我給定的ASN匹配,通過詢問IP是否匹配這個ASN的IP塊。

我可以做的另一件事就是詢問數據,而不是按ASN過濾,然後我可以在python上過濾掉所有東西,但在我看來,這樣的查詢應該由DBMS完成。

任何提示將不勝感激。

回答

1

爲了讓IP查找具有高效的查詢參數,我可能會延長IP的存儲方式。

按照正常的符號,我們剛纔不能輕易提取到設置在蒙戈4個整數字符串,你認爲存儲地址的格式是什麼:

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

爲什麼?

因爲有網絡掩碼我們可以計算最大和最小地址。

比方說,我們有 '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  

那麼我們的查詢將如下:

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

,因爲這增加了對申請方的開銷 - 它會完全回覆匹配結果查詢。

爲查詢生成可能是有難度的 - 在>=<=運營商需要影響組根據掩碼大小

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

這是一個聰明的方法來解決此問題。謝謝! –