URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1879
[ Назад ]

Исходное сообщение
"алгоритм установления принадлежности некоторого IP данной се..."

Отправлено .zZz. , 15-Июл-03 20:20 

Привет!

Может быть кто-нибудь подскажет алгоритм (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 - может быть я зря прыгаю на этих граблях, может кто-то уже давно решил задачку?
Буду очень признателен, если кто-то снимет меня с грабель или покажет путь. :)))

Заранее спасибо!


Содержание

Сообщения в этом обсуждении
"алгоритм установления принадлежности некоторого IP данной се..."
Отправлено .zZz. , 15-Июл-03 21:13 
Ага... подсказали решение - простое и красивое... надо было ещё чуток подумать :))

итак берём хэш соответствий

"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 - да

ща буду от формализации катать в перлу.
:))


"алгоритм установления принадлежности некоторого IP данной се..."
Отправлено J , 16-Июл-03 16:17 
>Ага... подсказали решение - простое и красивое... надо было ещё чуток подумать
>:))
>
>итак берём хэш соответствий
>
>"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


"алгоритм установления принадлежности некоторого IP данной се..."
Отправлено .zZz. , 17-Июл-03 19:24 
Да, так ещё проще - но по времени и количеству операций примерно так же.
Спасибо.

"алгоритм установления принадлежности некоторого IP данной се..."
Отправлено Vladimir , 23-Июл-03 15:31 
Можно еще проще
#!/где/то-там/perl
use Net::IP::Match;
if(__MATCH_IP($src,"192.168.0.0/24") && ..................)
    {
    то плюс
    }
работает на ура.