The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
" Проверка IP-адреса, на принадлежность подсети "
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

" Проверка IP-адреса, на принадлежность подсети "  
Сообщение от pasha87 on 07-Июн-07, 19:13 
Здравствуйте
такой вопрос:
как проверить, принадлежит ли IP-адрес подсети
напр есть массив ('192.168.0.0/24','192.168.1.0/24','10.0.0.0/8')
и файл вида
192.168.0.1
212.212.212.212
10.2.21.2
1.1.1.1
192.168.10.3
54.41.23.54

проверить и выдать результат: принадлежит ли Ip адрес к подестям, указанным в массиве

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. " Проверка IP-адреса, на принадлежность подсети "  
Сообщение от newser (ok) on 07-Июн-07, 21:31 
>Здравствуйте
>такой вопрос:
>как проверить, принадлежит ли IP-адрес подсети
>напр есть массив ('192.168.0.0/24','192.168.1.0/24','10.0.0.0/8')
>и файл вида
>192.168.0.1
>212.212.212.212
>10.2.21.2
>1.1.1.1
>192.168.10.3
>54.41.23.54
>
>проверить и выдать результат: принадлежит ли Ip адрес к подестям, указанным в
>массиве

Общая методика может быть следующей:

1. Составляем маски подсетей на основании Вашего массива, например, для '192.168.0.0/24' маска (в шеснадцатиричном формате) 0xffffff00.
2. Получаем для массива идентификаторы подсетей. Для '192.168.0.0' с маской 0xffffff00 (255.255.255.0) это будет 0xc0a80000.
3. Берем из файла очередной IP-адрес (192.168.0.1) и преобразуем его, например, тоже в hex: 0xc0a80001.
4. "Накладываем" на этот IP-адрес маску (0xffffff00). Получаем 0xc0a80000.
5. Сравниваем два результата. Если они идентичны, то хост принадлежит сети. Если нет, то не принадлежит.

PS Это есть в любом учебнике по TCP/IP.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. " Проверка IP-адреса, на принадлежность подсети "  
Сообщение от _umka_ (ok) on 08-Июн-07, 15:23 

BEGIN { dev_p=-2; }
function prefix(b) {
return 0xFFFFFFFF-(2**(32-b)-1);
}
function cidr(a,l,l1,p) {
if(split(a,p,".") != 4) { return 0; }
l=or(lshift(p[1],24),lshift(p[2],16));
l1=or(lshift(p[3],8),p[4]);
return or(l,l1);
}
function addr_m(a,i,p) {
if(split(a,p,"/") != 2) { return -1;}
if((and(cidr(i),prefix(p[2]))) == cidr(p[1])) { return p[2];}
else {return -1;}
}
{
if($0 ~/^#/) { next; }
if($3 ~/default/) { if(dev_p == -2) { dev_p=-1; d_grp=$1; d_dev=$3; d_gw=$4; d_net="default"; next; } }
l_p=addr_m($3,ip);
if(dev_p<l_p) { grp=$1; dev=$2; dev_p=l_p; net=$3; gw=$4; }
}
END {
if(dev_p == -1) { grp=d_grp; dev=d_dev; gw=d_gw; net=d_net; }
print "GROUP="grp;
print "IF="dev;
print "NET="net;
print "GW="gw
}
subnets.awk

файлик сетями в таком формате
#group-name     interface       network                 gataway
group1          eth0            default                 172.20.3.1
....

поиск примернно так
awk -v ip=$1 -fsubnets.awk ${SUBNET_FILE}

на perl еще проще

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. " Проверка IP-адреса, на принадлежность подсети "  
Сообщение от Al email(??) on 04-Июл-07, 11:04 
В perl есть модуль на cpan, Net::IP::Match::Regexp, там почти всё написано уже
Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру