2016-06-09 43 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

这是一个聪明的方法来解决此问题。谢谢! –