2016-06-09 5 views
0

Для проекта по сетевой безопасности, над которым я работаю, у меня есть список всех IP-адресов в моей стране (и других соответствующих областях) в коллекции mongoDB.Несколько фильтров на 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 внутри ip-блока для такого ASN.

Еще одна вещь, которую я мог сделать, это просто запросить данные и не фильтровать для ASN, а затем я мог бы фильтровать информацию на python, но мне кажется, что такие запросы должны выполняться СУБД.

Любые советы будут очень признательны.

ответ

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} }}}) 

как это добавляет накладные расходы на стороне приложения - он будет полностью вернуться согласованный запрос результата.

, как генерация запроса может быть сложно - в >= и <= операторы должны влиять на группу в зависимости от размера Bitmask

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

Это умный способ обойти эту проблему. Благодаря! –

Смежные вопросы