вычисление подсетей

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 11:53:15

есть список ip

Код: Выделить всё

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.35
192.168.1.68
192.168.201.1
192.168.201.2
192.168.201.3
192.168.201.4
по этому списку надо вычислить список подсетей, в которых они (ip-адреса) используются....

если кто решал, помогите плз... а то голова вообще не варит..

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение zingel » 2008-09-23 11:54:13

Z301171463546 - можно пожертвовать мне денег

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 12:00:44

гм... нее, мне не это надо, у меня список из двух тысяч ip мне надо определить их сети

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение ProFTP » 2008-09-23 12:01:12

Код: Выделить всё

#!/bin/sh

wget -q -O - http://noc.ix.net.ua/ua-list.txt | sed 's/\.0$/.0\/24/g' > /etc/ua-list.txt

for SUBNET in `ipfw table 0 list | cut -f 1 -d " " | diff /etc/ua-list.txt - | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep ">" | cut -f 2 -d " " `; do
ipfw -q table 0 delete $SUBNET
done

for SUBNET in `ipfw table 0 list | cut -f 1 -d " " | diff /etc/ua-list.txt - | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep "<" | cut -f 2 -d " " `; do
ipfw -q table 0 add $SUBNET
done
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение ProFTP » 2008-09-23 12:04:13

Кстате, а что за айпишники, откуда ты их взял?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 12:04:24

ProFTP писал(а):wget -q -O - http://noc.ix.net.ua/ua-list.txt
походу придётся самому делать.... :(

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 12:06:15

ProFTP писал(а):Кстате, а что за айпишники, откуда ты их взял?
у меня список, мне нужно по нему вычислить сети, пример списка я привёл, из него мне надо получить

Код: Выделить всё

192.168.1.0/29
192.168.1.35/32
192.168.1.68/32
192.168.201.0/29

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение ProFTP » 2008-09-23 12:09:10

тут тоже много айпишников есть без подсетей http://noc.ix.net.ua/ua-list.txt

попробуй... должно работать...

или это не оно?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 12:14:52

ProFTP писал(а):или это не оно?
эээ... я боюсь "это" даже запускать, там очень специфический код построенный на ipfw

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение ProFTP » 2008-09-23 12:16:31

У меня работает...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 12:17:36

ProFTP писал(а):У меня работает...
и какой результат?

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение ProFTP » 2008-09-23 12:20:25

посмотри тот список, там нету маски в некоторых айпишниках... после того как запустить список весь из маска становится...

попробуй от пользователя запустить, может запустится

если хочешь, выложи айпишники, я запушю у себя... и дам результат...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение LMik » 2008-09-23 12:38:01

Простите за тупость, но как можно получить сеть из IP не зная маски?
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение zingel » 2008-09-23 12:39:20

вот я тоже сижу гадаю
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение ProFTP » 2008-09-23 12:41:12

зачем тогда нужна сеть если у нас есть маска? :Yahoo!:

высчитать так как вычисляються цифры из памяти....
из этого типа: 0xffff0000

или я не понял что-то?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-23 12:57:34

LMik писал(а):Простите за тупость, но как можно получить сеть из IP не зная маски?
у тебя есть десять ip, которые идут подряд, чтобы их объединить нужно вычислить минимальную маску, которая бы их объединяла в подсеть... все калькуляторы это умеют :( просто у меня список, из него надо вычленить ип, которые идут подряд и рассчитать их маску, остальные будут ххх.ххх.ххх.ххх/32.

Разве это сложно? :unknown: я думал сетевики это на зубок знают... ыыыххх, ладно, завтра сам напишу... :( сёдня башка вообще не варит...

Аватара пользователя
zingel
beastie
Сообщения: 6204
Зарегистрирован: 2007-10-30 3:56:49
Откуда: Moscow
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение zingel » 2008-09-23 13:06:05

я вообще только проснулся
Z301171463546 - можно пожертвовать мне денег

Аватара пользователя
Morty
ст. лейтенант
Сообщения: 1370
Зарегистрирован: 2007-07-17 23:25:12

Re: вычисление подсетей

Непрочитанное сообщение Morty » 2008-09-23 23:26:31

поставленную задачу хз как сделать
не задумывался но на сайте есть статья по ipcalc
лучшего инстра по ращету сетей по моему не придумали пока....

может быть поможет(больше похоже на обратное решение задачи)
вот наглядный пример выщитываем из десятки сетки (4 сети)
в каждой из которой сможет влезть 26, 160, 500 и 2000 хостов

Код: Выделить всё

> ipcalc 10.0.0.0/8 -s 26 160 500 2000
Address:   10.0.0.0             00001010. 00000000.00000000.00000000
Netmask:   255.0.0.0 = 8        11111111. 00000000.00000000.00000000
Wildcard:  0.255.255.255        00000000. 11111111.11111111.11111111
=>
Network:   10.0.0.0/8           00001010. 00000000.00000000.00000000
HostMin:   10.0.0.1             00001010. 00000000.00000000.00000001
HostMax:   10.255.255.254       00001010. 11111111.11111111.11111110
Broadcast: 10.255.255.255       00001010. 11111111.11111111.11111111
Hosts/Net: 16777214              Class A, Private Internet

1. Requested size: 26 hosts
Netmask:   255.255.255.224 = 27 11111111.11111111.11111111.111 00000
Network:   10.0.11.0/27         00001010.00000000.00001011.000 00000
HostMin:   10.0.11.1            00001010.00000000.00001011.000 00001
HostMax:   10.0.11.30           00001010.00000000.00001011.000 11110
Broadcast: 10.0.11.31           00001010.00000000.00001011.000 11111
Hosts/Net: 30                    Class A, Private Internet

2. Requested size: 160 hosts
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Network:   10.0.10.0/24         00001010.00000000.00001010. 00000000
HostMin:   10.0.10.1            00001010.00000000.00001010. 00000001
HostMax:   10.0.10.254          00001010.00000000.00001010. 11111110
Broadcast: 10.0.10.255          00001010.00000000.00001010. 11111111
Hosts/Net: 254                   Class A, Private Internet

3. Requested size: 500 hosts
Netmask:   255.255.254.0 = 23   11111111.11111111.1111111 0.00000000
Network:   10.0.8.0/23          00001010.00000000.0000100 0.00000000
HostMin:   10.0.8.1             00001010.00000000.0000100 0.00000001
HostMax:   10.0.9.254           00001010.00000000.0000100 1.11111110
Broadcast: 10.0.9.255           00001010.00000000.0000100 1.11111111
Hosts/Net: 510                   Class A, Private Internet

4. Requested size: 2000 hosts
Netmask:   255.255.248.0 = 21   11111111.11111111.11111 000.00000000
Network:   10.0.0.0/21          00001010.00000000.00000 000.00000000
HostMin:   10.0.0.1             00001010.00000000.00000 000.00000001
HostMax:   10.0.7.254           00001010.00000000.00000 111.11111110
Broadcast: 10.0.7.255           00001010.00000000.00000 111.11111111
Hosts/Net: 2046                  Class A, Private Internet

Needed size:  2848 addresses.
Used network: 10.0.0.0/20
Unused:
10.0.11.32/27
10.0.11.64/26
10.0.11.128/25
10.0.12.0/22
10.0.16.0/20
10.0.32.0/19
10.0.64.0/18
10.0.128.0/17
10.1.0.0/16
10.2.0.0/15
10.4.0.0/14
10.8.0.0/13
10.16.0.0/12
10.32.0.0/11
10.64.0.0/10
10.128.0.0/9
>
также видно какие сети остаються свободными...всё наглядно , прозрачно и понятно
можно брать кальк и резать/щитать сетки и понимать что, где и как

ps http://www.lissyara.su/?id=1517

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-24 6:16:56

)) ipcalc уже давно освоил, но у меня конкретная задача... можно даже сказать математическая - вычисление интервалов ))) Но всё равно спасибо ))

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение LMik » 2008-09-24 10:15:40

zg писал(а):)) ipcalc уже давно освоил, но у меня конкретная задача... можно даже сказать математическая - вычисление интервалов ))) Но всё равно спасибо ))
Бред какой-то, с такими задачами можно всем ипам воткнуть маску 32 и не париться больше.

Вот как определить?

192.168.1.1
192.168.1.2
192.168.1.3
192.168.1.4
192.168.1.35
192.168.1.68

какая маска? 35 может войти в следующую сеть, а может быть в первой. 68 может принадлежать и сети с 35 и всей сети с первыми ипами.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

Аватара пользователя
LMik
капитан
Сообщения: 1852
Зарегистрирован: 2007-07-17 9:14:39
Откуда: МО
Контактная информация:

Re: вычисление подсетей

Непрочитанное сообщение LMik » 2008-09-24 10:18:43

Если адреса назначались по порядку, то пиши скрипт.
BSD... Join the dark side.
Виpус детям не игpушка, не товаpищ и не дpуг!

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-24 10:30:12

LMik писал(а):Если адреса назначались по порядку, то пиши скрипт.
порядок не меет значения, важно определить сети -)))

а скрипт напишу... просто времени зазря угрохаю... :-o

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: вычисление подсетей

Непрочитанное сообщение zg » 2008-09-24 12:23:22

короче говоря написал... правда на php

Код: Выделить всё

$sql = 'SET @i:=0';
$res = my_query($sql);

$sql = 'SELECT INET_NTOA(ip), ip-@i, @i:=ip FROM billing_ips WHERE segment_id=22 ORDER BY ip ASC LIMIT 40';

$res = my_query($sql);
//res_mysql2table($res); die();

class IpRange
{
	var $firstIp = null;
	var $lastIp  = null;
	var $counts  = null;
	var $subnet  = null;
	var $maskIp  = null;
	
	function calcLastIp()
	{
		$this->lastIp = long2ip(sprintf('%u', ip2long($this->firstIp) + $this->counts));
		$this->calcMask();
	}
	
	function calcMask()
	{
		if ( $this->counts )
		{
			$maskIp = $ip1 = sprintf('%u', ip2long($this->firstIp));
			$ip2 = sprintf('%u', ip2long($this->lastIp));
			
			if ( strlen($ip1) === 10 ) $ip1 = substr($ip1, 1);
			if ( strlen($ip2) === 10 ) $ip2 = substr($ip2, 1);
			
			$ip1 = (int) $ip1;
			$ip2 = (int) $ip2;
			
			$mask = $ip1 ^ $ip2;
			$mask = decbin($mask);
			
			if ( !$mask ) $mask = '';
			
			if ( function_exists('bcdiv') )
			{
				$maskIp = bcdiv($maskIp, pow(2, strlen($mask)));
				$maskIp = bcmul($maskIp, pow(2, strlen($mask)));
				$this->maskIp = long2ip($maskIp);
			}
			
			$this->subnet = 32 - strlen($mask);
		}
		else 
		{
			$this->subnet = 32;
		}
	}
}

$range = null;
$nets  = array();

$previp = null;
$cnt = 0;

$spread = 0;

while ( $row = mysql_fetch_row($res) )
{
	list($ip, $spread) = $row;
	
	if ( @++$k > 10000 ) die('Бесконечный цикл');
	
	if ( $spread === '1' )
	{
		++ $cnt;
	}
	elseif ( !isset($previp) )
	{
		$previp = $ip;
		$cnt    = 0;
	}
	else
	{
		$range = new IpRange();
		$range->firstIp = $previp;
		$range->counts  = $cnt;
		$range->calcLastIp();
		$nets[] = $range;
		
		$previp = $ip;
		$cnt    = 0;
	}
}

if ( $spread === '1' )
{
	$range          = new IpRange();
	$range->firstIp = $previp;
	$range->counts  = $cnt;
	$range->calcLastIp();
	$nets[] = $range;
}

echo '<pre>';
print_r($nets);