Последняя оставленная запись:
Раздача маршрутов по DHCP
2012-03-27 17:49:37 (читать в оригинале)
Решил оживить ЖЖ техническими постами)
У нас в организации используется PPTP VPN для доступа в интернет, после подключения к которому более тысячи машин получают дефолтный маршрут от впн сервера. Так вот чтобы пользователи могли нормально работать и с локальными ресурсами необходимо вручную прописывать маршруты, причем маршруты зависят от подсети т.к. шлюз везде свой.
Решить проблему можно следующими способами:
- на этапах установки и настройки прописывать маршруты вручную.
- написать логон скрипт и запустить его на доменных машинах.
- раздать маршруты по DHCP.
Мы всегда пользовались 1 способом, но из-за того, что инфраструктура просто огромная гибкость этого метода оставляет желать лучшего.
Раздача маршрутов по DHCP.
В качестве DHCP сервера и шлюза у нас используется Cisco 4503E.
Маршруты это 249 опция dhcp сервера. т.е в общем виде это будет: option 249 ip (сеть) (маска) (шлюз).
Есть даже целый RFC на эту тему http://www.ietf.org/proceedings/52/I-D/draft-ietf-dhc-csr-06.txt
К сожалению таким образом не удалось наладить раздачу маршрутов до двух /24 (одной /23) и одной /8 сетей...клиенты отказались принимать такие параметры от DHCP сервера.
Позже было вычитанно что параметр 249 можно передать в виде hex.
Пример:
route 172.172.0.0/21 168.168.168.168
пишем hex:
N байта: 1 2 3 4 5 6 7 8
hex: 15 AC AC 00 A8 A8 A8 A8
описание:
байт 1 - hex маски (21dec -> 15 hex)
байты с 2 по 4 - наша сеть
байты с 5 по 8 - шлюз
Обращаю внимание, что в RFC четко прописаноб сколько октетов сети нужно брать в зависимости от битовой маски!
в итоге в конфиге будет выглядеть так
!
ip dhcp pool POOL
....
option 249 hex 15ACAC00A8A8A8A8
....
!
Что отлично заработало.
Ну и немного позже был найден удобный скриптик для расчетов:
#!/usr/bin/perl -w
use strict;
sub option_121 {
my $gw = shift;
my $out_str = '';
my ($subnet, $mask, $b0, $b1, $b2, $b3);
foreach my $cidr (@_) {
($subnet, $mask) = split('/', $cidr);
($b0, $b1, $b2, $b3) = split(/\./, $subnet);
$out_str .= sprintf('%02x', $mask);
$out_str .= sprintf('%02x', $b0);
$out_str .= sprintf('%02x', $b1) if($mask > 8);
$out_str .= sprintf('%02x', $b2) if($mask > 16);
$out_str .= sprintf('%02x', $b3) if($mask > 24);
$out_str .= sprintf('%02x%02x%02x%02x', split(/\./, $gw));
}
return $out_str;
}
if(@ARGV < 2)
{
print "Usage: $0 gw_ip subnet1/mask1 subnet2/mask2 ... subnetN/maskN\n";
}
elsif($ARGV[0] =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)
{
print "DHCP option 121 (249) hex string: ".option_121(@ARGV)."\n";
}
else
{
print "Invalid gateway IP address: '$ARGV[0]'\n";
}