From: Slava Dubrovskiy <slava@tangramltd.com>
To: Vladimir Karpinsky <vkarpinsky@mail.ru>,
ALT Linux Community <community@lists.altlinux.org>
Subject: Re: [Comm] Проверка по regexp вхождения IP в подсеть
Date: Wed, 20 Feb 2008 09:53:52 +0200
Message-ID: <47BBDC90.2070407@tangramltd.com> (raw)
In-Reply-To: <47BB2E3D.8080000@mail.ru>
[-- Attachment #1: Type: text/plain, Size: 3768 bytes --]
>>>> Подскажите пожалуйста, как проверить с помощью 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
[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/x-pkcs7-signature, Size: 3249 bytes --]
prev parent reply other threads:[~2008-02-20 7:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-02-19 14:06 Slava Dubrovskiy
2008-02-19 14:18 ` Vladimir Karpinsky
2008-02-19 14:42 ` Slava Dubrovskiy
2008-02-19 15:30 ` Alexey Morsov
2008-02-19 15:40 ` Алексей Шенцев
2008-02-20 7:53 ` Slava Dubrovskiy [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47BBDC90.2070407@tangramltd.com \
--to=slava@tangramltd.com \
--cc=community@lists.altlinux.org \
--cc=vkarpinsky@mail.ru \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
ALT Linux Community general discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/community/0 community/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 community community/ http://lore.altlinux.org/community \
mandrake-russian@linuxteam.iplabs.ru community@lists.altlinux.org community@lists.altlinux.ru community@lists.altlinux.com
public-inbox-index community
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.community
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git