[Comm] Проверка по regexp вхождения IP в подсеть

Slava Dubrovskiy =?iso-8859-1?q?slava_=CE=C1_tangramltd=2Ecom?=
Ср Фев 20 10:53:52 MSK 2008


>>>> Подскажите пожалуйста, как проверить с помощью regexp входит ли IP 
>>>> в подсеть?
>>>>
>>>> Например: сеть дана в виде 192.168.1.0/24
>>>> Как проверить при помощи regexp входит ли IP 192.168.1.5 в эту 
>>>> подсеть?
>>> ipcalc и его man
>> Это конечно хорошо. Есть и перловый модуль Net-IP-Match-Regexp. Но у 
>> меня есть база, в которой хранятся IP в виде 192.168.1.0/24 и нужно 
>> sql запросом проверять вхождение IP в сеть.
>
> Тогда можно написать перловый скрипт, в котором расчитывается сеть для 
> данного IP, потом адрес сети вытаскивается из базы (или наоборот, 
> вытаскивается IP из базы и расчитывается для него сеть, я не до конца 
> понял детали) и эти две переменные сравниваются. Я не знаю упомянутого 
> выше модуля, но с ним писать перловый скрипт вероятно удобнее, хотя 
> при должном желании можно вызвать ipcalc из перла. Или я что-то важное 
> упустил?
Да. Наверно я не полностью описал задачу. Суть в чем. Есть база на 
mysql. Есть сквид. И есть внешний хелпер  mysql_acl  на  C который умеет 
делать запросы к мускулю. Больше ничего другого делать он не умеет. 
Можно конечно сделать хелпер на перле и всю логику перенести туда, но во 
первых не хочется разводить зоопарк (в  одном месте этот хелпер уже 
работает), во вторых хелпер на перле будет медленней, и в третьих это 
еще необходимо устанавливать перл, что совсем не желательно. Поэтому 
перл отпадает точно.

Но вообщем-то проблему решил.

Сделал табличку, в которой 2 поля:
IP и mask
В поле IP значение заносится с помощью преобразования через INET_ATON() 
и в поле mask - маска в нотации CIDR. Во время занесения в базу из IP 
вычисляется сеть и заносится IP сети. Как это делается наглядно показано 
тут: http://jodies.de/ipcalc

Например имеем 192.168.1.50/17
Вычисляем сеть средствами php. Это будет 192.168.0.0 В базу заносим
mysql> SELECT INET_ATON('192.168.0.0') as IP;
+------------+
| IP         |
+------------+
| 3232235520 |
+------------+

И маску в неизменном виде.

Когда нам нужно проверить входит ли IP в сеть указанную в базе, мы 
просто переводим его в число с помощью INET_ATON(), вычисляем по маске и 
сети количество IP в сети http://library.mnwhost.ru/doc/ip.php и 
проверяем попадает ли число в вычисленный диапазон.

Получается никаких regexp, перл и т.д. на этапе проверки.

-- 
WBR,
Dubrovskiy Vyacheslav

----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : smime.p7s
Тип     : application/x-pkcs7-signature
Размер  : 3249 байтов
Описание: S/MIME Cryptographic Signature
Url     : <http://lists.altlinux.org/pipermail/community/attachments/20080220/e00232eb/attachment-0002.bin>


Подробная информация о списке рассылки community