URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID3
Нить номер: 11900
[ Назад ]

Исходное сообщение
"Раздел полезных советов: Статические маршруты через isc-dhcpd"

Отправлено auto_tips , 28-Июл-05 14:39 
Согласно RFC 3442 через dhcp можно отдавать таблицу маршрутизации.
Изначально эта опция не поддерживается isc-dhcpd, но опцию можно добавить.

Пример:
  option classless-route code 121 = string;
  option classless-route 18:c0:a8:ea:c0:a8:00:05;

пример получения кода, взято с
http://rfc3442svc.sourceforge.net/isc-dhcpd-configuration.html

#!/usr/bin/perl

use strict;

# Usage:
#   make_classless_option({ "subnet/mask" => "router", "subnet/mask" => "router", ... });
#     subnet   the subnet address, 4 dot-separated numbers
#     mask     the subnet mask length (e.g. /24 corresponds to 255.255.255.0, /8 corresponds to 255.0.0.0)
#     router   the router address, 4 dot-separated numbers
sub make_classless_option
{
    my $routes = shift;
    my ($s1, $s2, $s3, $s4, $len, @bytes, $net, $mask, $destination, $router);

    $len = 2;
    @bytes = ();
    foreach $destination(keys %{$routes}) {
        ($net, $mask) = split('/', $destination);
        $router = $routes->{$destination};
        ($s1, $s2, $s3, $s4) = split(/\./, $net);
        push(@bytes, sprintf('%02x', $mask));
        push(@bytes, sprintf('%02x', $s1));
        push(@bytes, sprintf('%02x', $s2)) if($mask > 8);
        push(@bytes, sprintf('%02x', $s3)) if($mask > 16);
        push(@bytes, sprintf('%02x', $s4)) if($mask > 24);
        ($s1, $s2, $s3, $s4) = split(/\./, $router);
        push(@bytes, sprintf('%02x', $s1));
        push(@bytes, sprintf('%02x', $s2));
        push(@bytes, sprintf('%02x', $s3));
        push(@bytes, sprintf('%02x', $s4));
    }

    return join(':', @bytes);
}

# Sample usage

print make_classless_option({
        "172.16.0.0/12" => "10.0.0.1",
        "10.0.0.0/8" => "10.0.0.1",
        "0.0.0.0/0" => "192.168.0.1",
        "192.168.234.0/24" => "192.168.0.5"
        });

На данный момент данную опцию поддерживает малое количество клиентов, например windows XP,
только по непонятным причинам использует код 249, т.е. в конфигурации сервера надо будет использовать

   option classless-route code 249 = string;


URL:
Обсуждается: http://www.opennet.me/tips/info/666.shtml


Содержание

Сообщения в этом обсуждении
"Статические маршруты через isc-dhcpd"
Отправлено aZ , 28-Июл-05 14:39 
Хочу ещё подсказать, что первую строчку типа option classless-route code 249 = string; надо вписывать в начале dhcpd.conf, а вторую в самом subnet. Пример:

option classless-route code 249 = string;

subnet ... {
option sql-identification-token 17:23:19:a6:42:ea:99:7c:22;
...
}

:)


"Статические маршруты через isc-dhcpd"
Отправлено anonym , 14-Ноя-05 20:40 
http://thep.blogspot.com/2005_09_01_thep_archive.html

"Статические маршруты через isc-dhcpd"
Отправлено Aleon , 03-Фев-06 05:56 
То же самое, но более кратко...

#!/usr/local/bin/perl -w

use strict;
while (<>) {
/(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)\s(\d+)\.(\d+)\.(\d+)\.(\d+)/ or next;
printf("%02x:%02x:"."%02x:"x($5/8.125), $5, $1,$2,$3,$4 );     # Don't ask me how it works;-)
printf("%02x:%02x:%02x:%02x".(!eof && ":"), $6,$7,$8,$9 );
}
print "\n";


Скрипту в качестве параметра скармливается файл вида:
#subnet         gateway
10.0.0.0/8      192.168.0.1
172.16.0.0/12   192.168.0.1
192.168.0.0/16  192.168.0.1


"Статические маршруты через isc-dhcpd"
Отправлено butcher , 19-Июн-06 06:57 
Патч для фришного dhclient'а:
http://butcher.heavennet.ru/patches/other/dhclient/

"Статические маршруты через isc-dhcpd"
Отправлено butcher , 20-Авг-06 21:05 
Кстати, этот скрипт неверно работает для маршрута по-умолчанию.
Для него он должен выдавать минимально возможный по размеру ответ - 5 байт: 00:c0:a8:00:01.

"Статические маршруты через isc-dhcpd"
Отправлено Jek , 01-Ноя-06 02:52 
http://linux.by/wiki/index.php/FAQ_DHCP_routes

Только с маршрутом по умолчанию не разбирался.


"Статические маршруты через isc-dhcpd"
Отправлено izglioib , 31-Июл-08 16:02 
Нигде не нашол варианта для PHP, написал свой:

function gen_routes($networks, $gw)
{

  $gw = str_replace ( '.' , ',' , $gw );
  $route_string = '';

  foreach ($networks as $net)
  {
    $pos =  strpos ( $net['net'] , '.0' );
//    echo $net['net']."\t-\t".($pos);
    $net_c = substr ( $net['net'] , 0 , $pos);
//    echo "\t".$net_c."/".$net['mask']."\n";
    $net_c =  str_replace ( '.' , ',' , $net_c );
    $route_string .= $net['mask'].','.$net_c.','.$gw.',';

  }

  $route_string =  rtrim ( $route_string  , " ," );

//  echo $route_string;
//  exit;

  return $route_string;
}

// сети
$networks = array(
array ('net' => '10.1.0.0','mask' => '16'),
array ('net' => '10.2.0.0','mask' => '16'),
array ('net' => '10.3.0.0','mask' => '16'),
array ('net' => '10.4.0.0','mask' => '16'),
);
// гейт
$gw = '10.1.1.1';

echo  gen_routes($networks,$gw);

// конец кода

Работает с указанием dhcpd.conf
option ms-classless-static-routes code 249 = array of unsigned integer 8;

и в обьявлении subnet
option ms-classless-static-routes 16, 172,16, 10,16,40,100;

Спасибо автору http://www.linux.by/wiki/index.php/FAQ_DHCP_routes

З.Ы. маршрут по умолчанию не проверял


"Статические маршруты через isc-dhcpd"
Отправлено CYBORG , 01-Окт-09 19:07 
Господа. Появилась проблема с радачай более 32 маршрутов через isc-dhcp 249 опцией.

Как только их количество превышает 32 - клиент не получает ни одного! Даже правильнее сказать сервер ему не отдает ни одного!

Скажите че можно сделать что работало


"Статические маршруты через isc-dhcpd"
Отправлено Mirawinger , 26-Май-10 16:25 
>Господа. Появилась проблема с радачай более 32 маршрутов через isc-dhcp 249 опцией.
>
>
>Как только их количество превышает 32 - клиент не получает ни одного!
>Даже правильнее сказать сервер ему не отдает ни одного!
>
>Скажите че можно сделать что работало

скорее всего вам ненужно отдавать такое количество маршрутов
попробуйте использовать безклассовую адресацию

например такая запись 192.168.0.0/16  192.168.0.1
заменит 255 записей вида 192.168.xxx.0/24  192.168.0.1


"Статические маршруты через isc-dhcpd"
Отправлено Fduch , 23-Авг-10 10:15 
>[оверквотинг удален]
>>Как только их количество превышает 32 - клиент не получает ни одного!
>>Даже правильнее сказать сервер ему не отдает ни одного!
>>
>>Скажите че можно сделать что работало
>
>скорее всего вам ненужно отдавать такое количество маршрутов
>попробуйте использовать безклассовую адресацию
>
>например такая запись 192.168.0.0/16  192.168.0.1
>заменит 255 записей вида 192.168.xxx.0/24  192.168.0.1

Не всегда это возможно. Например, провайдер участвующий в городском пиринге и подключающий своих клиентов по ВПНу. В городской сети многие провайдеры имеют "рваные" диапазоны с различными размерами сетей, как правило - "белых" диапазонов.


"Статические маршруты через isc-dhcpd"
Отправлено vlavish , 21-Ноя-12 00:25 
У меня скрипт не заработал пока не заменил:
($net, $mask) = split('/', $destination);
на
($net, $mask) = split(/\//, $destination);