Привет!Может быть кто-нибудь подскажет алгоритм (subj)?
Есть файл с подсетями видаa.b.c.d/30
e.f.g.h/29
...необходимо перловым скриптом построчно обрабатывать файл вида
src IPaddr dst IPaddr flows octets packets
(flow-tools, flow-stat -f10)и выяснять, на имя какой подсетки записывать in или out (octets)
т.е. на входе имеем список подсетей и ip, на выходе - какой подсети из списка принадлежит этот ip.
при этом накладываются ограничения на время и ресурсы (т.к. и вывод
flow-stat и файл с подсетями могут быть достаточно ёмкими)На первый мой взляд, можно было бы сравнивать ip с адресом сети (без /xx), и при несовпадении со всеми адресами подсеток (а их напомню - может быть очень много) вычитать из последнего слова (aaa.bbb.ccc.[ddd]) единицу. Сетки можно рассматривать не ширее класса С. Но даже при этом - любая тачка уйдёт курить надолго... :((
На второй взгляд, можно было бы смотреть в какой диапазон (net_min - net_max) попадает ip - и это вроде бы шаг в сторону успеха.
Т.е. каким-то образом 1 раз обработать файл с подсетями и получить хэш с элементами вида "net_min" => "net_max". Потом брать по одной строчке из вывода flow-stat и отмечать попадание в один из диапазонов.И тут приходит мысль номер 3 - может быть я зря прыгаю на этих граблях, может кто-то уже давно решил задачку?
Буду очень признателен, если кто-то снимет меня с грабель или покажет путь. :)))Заранее спасибо!
Ага... подсказали решение - простое и красивое... надо было ещё чуток подумать :))итак берём хэш соответствий
"32" => "1",
"30" => "4",
"29" => "8",
"28" => "16"
...
"24" => "256"берём наш ip (aaa.bbb.ccc.ddd) и сравниваем
aaa.bbb.ccc.DDD/$[наш хэш]{левая часть} и есть ли такая сетка (например, существует ли переменная с таким именем)
где DDD=int(ddd/[наш хэш]{правая часть})*[наш хэш]{правая часть}
если да - плюсуем трафик
если нет - переходим к следующей паре хэша.в итоге это выглядит так:
ip = x.y.z.178
x.y.z.178/32 - нет
x.y.z.176/30 - нет
x.y.z.176/29 - нет
x.y.z.176/28 - нет
x.y.z.160/27 - нет
x.y.z.128/26 - нет
x.y.z.128/25 - нет
x.y.z.0/24 - даща буду от формализации катать в перлу.
:))
>Ага... подсказали решение - простое и красивое... надо было ещё чуток подумать
>:))
>
>итак берём хэш соответствий
>
>"32" => "1",
>"30" => "4",
>"29" => "8",
>"28" => "16"
>...
>"24" => "256"
>
>берём наш ip (aaa.bbb.ccc.ddd) и сравниваем
>
>aaa.bbb.ccc.DDD/$[наш хэш]{левая часть} и есть ли такая сетка (например, существует ли переменная
>с таким именем)
>
>где DDD=int(ddd/[наш хэш]{правая часть})*[наш хэш]{правая часть}
>
>если да - плюсуем трафик
>если нет - переходим к следующей паре хэша.
>
>в итоге это выглядит так:
>
>ip = x.y.z.178
>
>x.y.z.178/32 - нет
>x.y.z.176/30 - нет
>x.y.z.176/29 - нет
>x.y.z.176/28 - нет
>x.y.z.160/27 - нет
>x.y.z.128/26 - нет
>x.y.z.128/25 - нет
>x.y.z.0/24 - да
>
>ща буду от формализации катать в перлу.
>:))
а что, в перле нет оператора & ?
host & mask и сравнить с net
Да, так ещё проще - но по времени и количеству операций примерно так же.
Спасибо.
Можно еще проще
#!/где/то-там/perl
use Net::IP::Match;
if(__MATCH_IP($src,"192.168.0.0/24") && ..................)
{
то плюс
}
работает на ура.