Согласно 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
Хочу ещё подсказать, что первую строчку типа 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;
...
}:)
http://thep.blogspot.com/2005_09_01_thep_archive.html
То же самое, но более кратко...#!/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
Патч для фришного dhclient'а:
http://butcher.heavennet.ru/patches/other/dhclient/
Кстати, этот скрипт неверно работает для маршрута по-умолчанию.
Для него он должен выдавать минимально возможный по размеру ответ - 5 байт: 00:c0:a8:00:01.
http://linux.by/wiki/index.php/FAQ_DHCP_routesТолько с маршрутом по умолчанию не разбирался.
Нигде не нашол варианта для 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
З.Ы. маршрут по умолчанию не проверял
Господа. Появилась проблема с радачай более 32 маршрутов через isc-dhcp 249 опцией.Как только их количество превышает 32 - клиент не получает ни одного! Даже правильнее сказать сервер ему не отдает ни одного!
Скажите че можно сделать что работало
>Господа. Появилась проблема с радачай более 32 маршрутов через isc-dhcp 249 опцией.
>
>
>Как только их количество превышает 32 - клиент не получает ни одного!
>Даже правильнее сказать сервер ему не отдает ни одного!
>
>Скажите че можно сделать что работалоскорее всего вам ненужно отдавать такое количество маршрутов
попробуйте использовать безклассовую адресациюнапример такая запись 192.168.0.0/16 192.168.0.1
заменит 255 записей вида 192.168.xxx.0/24 192.168.0.1
>[оверквотинг удален]
>>Как только их количество превышает 32 - клиент не получает ни одного!
>>Даже правильнее сказать сервер ему не отдает ни одного!
>>
>>Скажите че можно сделать что работало
>
>скорее всего вам ненужно отдавать такое количество маршрутов
>попробуйте использовать безклассовую адресацию
>
>например такая запись 192.168.0.0/16 192.168.0.1
>заменит 255 записей вида 192.168.xxx.0/24 192.168.0.1Не всегда это возможно. Например, провайдер участвующий в городском пиринге и подключающий своих клиентов по ВПНу. В городской сети многие провайдеры имеют "рваные" диапазоны с различными размерами сетей, как правило - "белых" диапазонов.
У меня скрипт не заработал пока не заменил:
($net, $mask) = split('/', $destination);
на
($net, $mask) = split(/\//, $destination);