static routes pushed through DHCP

Запись создана 15 сентября, 2010

Моя домашняя сеть находится в 192.168.1.0/24, а голос вынесен в подсеть 192.168.0.0/24.
доступ «в мир» роутится через 192.168.1.1 а в голос через 192.168.1.111 (да вот захотелось мне так).
Домашние машины получают ip адреса из подсети 192.168.1.0/24, а айпифоны из подсети 192.168.0.0/24

соответственно по дефолту машины не могут получить доступа к фойсовым аппаратам (ATA и IP фоны), прописывать на каждой машине статик роуты, я считаю моветоном. К счастью, не я один так считаю и есть rfc3442 позволяющий с DHCP сервера передавать клиентам статичные маршруты.

итак настроим dhcp сервер давать статик роут на сеть 192.168.0.0/24 через 192.168.1.111

option ms-classless-static-routes code 249 = array of unsigned integer 8;
option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

option ms-classless-static-routes 24, 192,168,0, 192, 168, 1, 111;
option rfc3442-classless-static-routes 24, 192,168,0, 192, 168, 1, 111;

Так как Microsoft компания новатор, срать ей хотелось на RFC. По этому в приведенном выше конфиге присутствуют ms-classless строки. Если у вас в сети нет windows машин, то можно их не уазывать.

На сервере делаем service dhcpd restart, а на клиенте /etc/init.d/networking restart и на клиенте получим:

shakirov@work:~$ route -n
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0
192.168.0.0     192.168.1.111   255.255.255.0   UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 eth0

справедливо это для Ubuntu на клиенте, говорят что в других дистрибутивах нужно в /etc/dhcp3/dhclient.conf добавить:

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

И в том же файле в поле request добавить параметр rfc3442-classless-static-routes; выглядеть в итоге должно так:

option rfc3442-classless-static-routes code 121 = array of unsigned integer 8;

send host-name "<hostname>";
request subnet-mask, broadcast-address, time-offset, routers,
    domain-name, domain-name-servers, domain-search, host-name,
    netbios-name-servers, netbios-scope, interface-mtu,
    rfc3442-classless-static-routes, ntp-servers;

И еще, если нет, то надо создать файл /etc/dhcp3/dhclient-exit-hooks.d/rfc3442-classless-routes

RUN="yes"


if [ "$RUN" = "yes" ]; then
        if [ "$new_rfc3442_classless_static_routes" != "" ]; then
                if [ "$reason" = "BOUND" ] || [ "$reason" = "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 [ "$net_length" == "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

Ну и конечно сделать его исполняемым.

кстати, если нужно передать несколько статичных маршрутов клиентам, то перечислять их надо через запятую, примерно вот так:

option ms-classless-static-routes       24, 192,168,0, 192,168,1,111, 16, 172,16, 10,16,40,100;
option rfc3442-classless-static-routes 24, 192,168,0, 192,168,1,111, 16, 172,16, 10,16,40,100;

И на последок, если используете OpenWRT и сервер dnsmasq, то вам приголится мануал http://www.debian-administration.org/articles/471

» Запись из раздела networking, Несортированное | 5 комментариев

Комментарии



5 комментариев to “static routes pushed through DHCP”

  1. X-FuckT0R on 24 декабря, 2010 10:04

    Хм… Почему у Вас все заголовки тем исключительно на английском языке? :)

  2. anonimous on 17 марта, 2011 21:24

    Спасибо! Очень внятно, вопросо не возникло :)

  3. Артур Шакиров on 17 марта, 2011 21:28

    наверное по тому что «гуглю» в основном на английском. вобщем что «искалось» и на английском и на русском.

  4. r00t on 7 апреля, 2012 20:25

    А прописать нужный маршрут на VoIP в машрутизаторе 192.168.1.1 — религия не позволила ?
    Или линуксоиды не ищут лёгких путей?

  5. Артур Шакиров on 8 апреля, 2012 7:14

    да, религия не позволяет мне добавлять еще один «хоп» когда можно отдать клиенту нужный маршрут.




Ответить