Настройка статических маршрутов через DHCP в Windows и Linux

Материал из RSU WiKi
Перейти к: навигация, поиск

Часто хочется раздавать статические маршруты через DHCP. Что ж, протокол позволяет, некоторые клиенты умеют или их можно научить. Делаем. Для начала читаем RFC 3442.

Пусть у нас есть сервер 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, то будет работать.

# 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 24, 192,168,124, 192,168,0,220, 24, 192,168,1, 192,168,0,220;
option rfc3442-classless-static-routes 24, 192,168,124, 192,168,0,220, 24, 192,168,1, 192,168,0,220;

option netbios-name-servers 192.168.0.122;
option domain-name-servers 192.168.0.1;
option broadcast-address 192.168.0.255;
option routers 192.168.0.254;
ddns-update-style none;
authoritative;
# loc0
subnet 192.168.0.0 netmask 255.255.255.0 {
    }
# design
host design {
    hardware ethernet 00:16:E6:87:0F:8B;
    fixed-address 192.168.0.26;
}

Ссылки

Личные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты