Здравствуйте
такой вопрос:
как проверить, принадлежит ли 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 адрес к подестям, указанным в массиве
>Здравствуйте
>такой вопрос:
>как проверить, принадлежит ли 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.
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 еще проще
В perl есть модуль на cpan, Net::IP::Match::Regexp, там почти всё написано уже