Получение маршрутов по DHCP

Материал из База знаний проекта Russian Fedora

Перейти к: навигация, поиск

Недавно озадачился получить маршруты по DHCP, рецепты что попадались были кривые или устаревшие, и было их много, какой применить не понятно, ибо они были для других разновидностей Linux, да и работа скриптов dhclient мне не понятна. Методом тыка набрёл на один рабочий вариант и подобрал рабочую конфигурацию для Fedora-14, возможна оптимизация.

Конфигурационный файл для Ethernet интерфейса, для каждого надо создавать свой, возможно его можно перенести в папку /etc/dhcp, не проверял.

/etc/dhclient-eth0.conf

# 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;

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;

Скрипт парсер опций для "RFC3442 routes" нашёл тут СКРИПТ , какой-то добрый человек выложил вот его код:

/etc/dhcp/dhclient.d/rfc3442-classless-routes.sh <-помещаем сюда

    #!/bin/bash

    rfc3442-classless-routes_config()
    {
            if [ x"$new_rfc3442_classless_static_routes" != x"" ]; then
                    if [ x"$reason" == x"BOUND" -o x"$reason" == x"REBOOT" ]; 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
    }

    rfc3442-classless-routes_restore()
    {
    }

Всё вроде бы хорошо, вот только мой провайдер выдаёт маршруты в формате "MS routes", поэтому немного переделаем скрипт, предварительно скопировав его и у нас получится два скрипта, для разных форматов маршрутов

/etc/dhcp/dhclient.d/ms-classless-routes.sh

    #!/bin/bash

    ms-classless-routes_config()
    {
            if [ x"$new_ms_classless_static_routes" != x"" ]; then
                    if [ x"$reason" == x"BOUND" -o x"$reason" == x"REBOOT" ]; then
                            rfc_routes=($new_ms_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[*]}"
                                            echo "add -host ${net_address[*]} gw ${gateway[*]}" >> /etc/dhcp/dhclient.d/route.log
                                    else
                                            /sbin/route add -net "${net_address[*]}/$net_length" gw "${gateway[*]}"
                                            echo "add -net ${net_address[*]}/$net_length gw ${gateway[*]}" >> /etc/dhcp/dhclient.d/route.log
                                    fi
                                    IFS="$old_IFS"
                            done

                    fi
            fi
    }

    ms-classless-routes_restore()
    {
    }

Вот собственно и всё.

PS: Да, если после перезагрузки интерфейса у вас не появились в списке маршруты, но вы уверены что они раздаются, то возможно надо удалить соответствующие файлы из папки /var/lib/dhclient/ у меня это был файл /var/lib/dhclient/dhclient-eth0.leases