FAQ DHCP routes
Материал из Linux.by Wiki Pages.
Настройка статических маршрутов через DHCP в Windows и Linux
Часто хочется раздавать статические маршруты через DHCP. Что ж, протокол позволяет, некоторые клиенты умеют или их можно научить. Делаем. Для начала читаем RFC3442.
Пусть у нас есть сервер dhcp3 от ISC.
Добавляем в его конфигурационный файл опции
# MS routes: adds extras to supplement routers option option ms-classless-static-routes code 249 = array of unsigned integer 8; # RFC3442 routes: overrides routers option option rfc3442-classless-static-routes code 121 = array of unsigned integer 8; ... option ms-classless-static-routes 16, 172,16, 10,16,40,100; option rfc3442-classless-static-routes 16, 172,16, 10,16,40,100;
Первая --- для M$ Windows (поддерживается Windows XP/2003 и выше), вторая --- в соответствии со стандартом. По своей сути опции одинаковы.
Приведённый пример соответствует маршруту на 172.16.0.0/16 через 10.16.40.100. Формат простой: <длина сетевой части адреса, бит>, <байт сетевого адреса>,[ ...], <4 байта адреса маршрутизатора>
В одной опции могут задаваться несколько маршрутов. Например, для такой таблицы маршрутов (для работы с "Айчыной")
217.21.51.32 10.16.40.100 255.255.255.255 UGH 0 0 0 eth0 217.21.51.1 10.16.40.100 255.255.255.255 UGH 0 0 0 eth0 217.21.51.64 10.16.40.100 255.255.255.224 UG 0 0 0 eth0 213.184.232.32 10.16.40.100 255.255.255.224 UG 0 0 0 eth0 172.16.0.0 10.16.40.100 255.255.0.0 UG 0 0 0 eth0
опции будут выглядеть как
option ms-classless-static-routes 16, 172,16, 10,16,40,100, 32, 217,21,51,1, 10,16,40,100, 32, 217,21,51,32, 10,16,40,100, 27, 217,21,51,64, 10,16,40,100, 27, 213,184,232,32, 10,16,40,100; option rfc3442-classless-static-routes 16, 172,16, 10,16,40,100, 32, 217,21,51,1, 10,16,40,100, 32, 217,21,51,32, 10,16,40,100, 27, 217,21,51,64, 10,16,40,100, 27, 213,184,232,32, 10,16,40,100;
С сервером разобрались. Теперь клиенты.
Для Windows XP/2003 ничего делать не надо.
Чтобы научить dhcp3-client (большинство дистрибутивов GNU/Linux) понимать эти настройки, в конфигурационный файл /etc/dhcp3/dhclient.conf пропишем следующее:
$ cat /etc/dhcp3/dhclient.conf
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;
#
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes;
И напишем скрипт для установки маршрутов при конфигурировании сети. В Debian для этого достаточно положить в /etc/dhcp3/dhclient-exit-hooks.d файл следующего содержания:
$ cat rfc3442-classless-routes
RUN="yes"
if [ "$RUN" = "yes" ]; then
if [ x"$new_rfc3442_classless_static_routes" != x"" ]; then
if [ x"$reason" == x"BOUND" ]; then
rfc_routes=($new_rfc3442_classless_static_routes)
for(( i=0; i < ${#rfc_routes[@]}; )); do
net_length=${rfc_routes[$i]}
((i++))
net_address=(0 0 0 0)
for(( j=0; j < $[$net_length / 8 + \
($net_length % 8 ? 1 : 0)]; j++, i++)); do
net_address[$j]=${rfc_routes[$i]}
done
gateway=(0 0 0 0)
for (( j=0; j < 4; j++, i++ )); do
gateway[$j]=${rfc_routes[$i]}
done
old_IFS="$IFS"
IFS='.'
if [ x"$net_length" == x"32" ]; then
/sbin/route add -host "${net_address[*]}" gw "${gateway[*]}"
else
/sbin/route add -net "${net_address[*]}/$net_length" gw "${gateway[*]}"
fi
IFS="$old_IFS"
done
fi
fi
fi
Примечание: отсутствует обработка маршрута по умолчанию (последовательность 0, 10, 16, 40, 100 для маршрутизатора 10.16.40.100). Хотя если route позволяет задать его как route add -net 0.0.0.0/0 gw 10.16.40.100, то будет работать.










