Страница 1 из 1

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

Добавлено: 2008-09-23 11:53:15
zg
есть список 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-адреса) используются....

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

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

Добавлено: 2008-09-23 11:54:13
zingel

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

Добавлено: 2008-09-23 12:00:44
zg
гм... нее, мне не это надо, у меня список из двух тысяч ip мне надо определить их сети

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

Добавлено: 2008-09-23 12:01:12
ProFTP

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

#!/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

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

Добавлено: 2008-09-23 12:04:13
ProFTP
Кстате, а что за айпишники, откуда ты их взял?

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

Добавлено: 2008-09-23 12:04:24
zg
ProFTP писал(а):wget -q -O - http://noc.ix.net.ua/ua-list.txt
походу придётся самому делать.... :(

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

Добавлено: 2008-09-23 12:06:15
zg
ProFTP писал(а):Кстате, а что за айпишники, откуда ты их взял?
у меня список, мне нужно по нему вычислить сети, пример списка я привёл, из него мне надо получить

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

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

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

Добавлено: 2008-09-23 12:09:10
ProFTP
тут тоже много айпишников есть без подсетей http://noc.ix.net.ua/ua-list.txt

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

или это не оно?

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

Добавлено: 2008-09-23 12:14:52
zg
ProFTP писал(а):или это не оно?
эээ... я боюсь "это" даже запускать, там очень специфический код построенный на ipfw

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

Добавлено: 2008-09-23 12:16:31
ProFTP
У меня работает...

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

Добавлено: 2008-09-23 12:17:36
zg
ProFTP писал(а):У меня работает...
и какой результат?

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

Добавлено: 2008-09-23 12:20:25
ProFTP
посмотри тот список, там нету маски в некоторых айпишниках... после того как запустить список весь из маска становится...

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

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

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

Добавлено: 2008-09-23 12:38:01
LMik
Простите за тупость, но как можно получить сеть из IP не зная маски?

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

Добавлено: 2008-09-23 12:39:20
zingel
вот я тоже сижу гадаю

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

Добавлено: 2008-09-23 12:41:12
ProFTP
зачем тогда нужна сеть если у нас есть маска? :Yahoo!:

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

или я не понял что-то?

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

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

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

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

Добавлено: 2008-09-23 13:06:05
zingel
я вообще только проснулся

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

Добавлено: 2008-09-23 23:26:31
Morty
поставленную задачу хз как сделать
не задумывался но на сайте есть статья по 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

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

Добавлено: 2008-09-24 6:16:56
zg
)) ipcalc уже давно освоил, но у меня конкретная задача... можно даже сказать математическая - вычисление интервалов ))) Но всё равно спасибо ))

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

Добавлено: 2008-09-24 10:15:40
LMik
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 и всей сети с первыми ипами.

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

Добавлено: 2008-09-24 10:18:43
LMik
Если адреса назначались по порядку, то пиши скрипт.

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

Добавлено: 2008-09-24 10:30:12
zg
LMik писал(а):Если адреса назначались по порядку, то пиши скрипт.
порядок не меет значения, важно определить сети -)))

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

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

Добавлено: 2008-09-24 12:23:22
zg
короче говоря написал... правда на 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);