setfib и переключение между таблицами маршрутизации

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение kpp » 2009-12-09 23:18:43

Есть шлюз на FreeBSD 7.2.
С тремя сетевыми интерфейсами. Два в инет(sk0,rl0), один в локальную сеть (em0).
Используются две таблицы маршрутизации. Одна каждого инетканала свой.
Один канал основной ( sk0, setfib 0 ) , второй резервный ( rl0, setfib 1 ).
В локальной сети есть клиент 192.168.0.5 (далее просто клиент).

В скрипте IPFW настроен переключатель: по какому инетканалу будет ходить клиент.

Код: Выделить всё

${fw} add 4000 skipto 6200 all from 192.168.0.2 to any in recv em0
....
# комп ходит в инет через sk0 - основной канал
${fw} add 6200 setfib 0 all from 192.168.0.2 to any in recv em0 keep-state
# комп ходит в инет через rl0 - резервный канал
#${fw} add 6200 setfib 1 all from 192.168.0.2 to any in recv em0 keep-state
Все работает замечательно. В зависимости от переключателя - клиент ходит по основному или резервному каналу.

Если основной канал пропадает, клиента перещелкиваем на резервный, все работает, кроме резолва ДНС-имен.
Т.е. если на клиенте сделать

Код: Выделить всё

ping lenta.ru
При проверке связи не удалось обнаружить узел lenta.ru. Проверьте имя узла и
повторите попытку.
При этом на шлюзе

Код: Выделить всё

setfib 1 ping lenta.ru
отрабатывает.
При этом если сделать

Код: Выделить всё

route del default
route add default шлюз резервного инетканала 
клиент начинает нормально работать.

Получается что определение доменных имен всегда идет по основному каналу, и при пропадании оного, происходит кирдык для клиента.
Как правильно учесть этот момент, чтобы и определение доменных имен от клиента шло через выбранный инетканал а не только по основному?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение terminus » 2009-12-09 23:22:52

Запустить на рутере свой DNS-кеш и выдавать клиенту его.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение kpp » 2009-12-09 23:28:26

DNS на роутере поднят, и настроен.
На клиенте указан DNS роутера.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение terminus » 2009-12-09 23:38:29

а если так:

Код: Выделить всё

${fw} add 4000 skipto 6200 all from 192.168.0.2 to any in recv em0
....
# комп ходит в инет через sk0 - основной канал
${fw} add 6200 setfib 0 all from 192.168.0.2 to any in recv em0 keep-state
${fw} add 6201 setfib 0 udp from me to any 53 out

# комп ходит в инет через rl0 - резервный канал
#${fw} add 6200 setfib 1 all from 192.168.0.2 to any in recv em0 keep-state
#${fw} add 6201 setfib 1 udp from me to any 53 out
:unknown:
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение kpp » 2009-12-09 23:51:39

Так пробовал, но что-то не то.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение terminus » 2009-12-10 10:16:08

Ну да, я ошибся - setfib не поможет для трафика идущего от самого сервера так как определение маршрутов на проходе OUT происходит до захода в ipfw... Остается или как-то изхитрится и запускать сам ДНС сервер с указанием fib, или использовать fwd. ДНС у вас в джайле или просто? Если в джайле, то там сейчас для всего джайла можно fib задавать.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение kpp » 2009-12-10 10:54:48

ДНС просто, не в клетке.
Мда.. получается за что боролись...
Не понятно, ведь на самом роутере нормально все резолвится, независимо от того есть основной канал или нет. :pardon:
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение terminus » 2009-12-10 10:59:11

а на самом рутере в resolv.conf он сам или кто?

Кстати, зачем keep-state?
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение kpp » 2009-12-10 11:17:31

На роутере в resolv.conf

Код: Выделить всё

domain<>mydomen
nameserver<---->1.2.1.5  # DNS основного инетканала 
В принципе можно обойтись без keep-state - так сложилось исторически :smile:
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение terminus » 2009-12-10 11:25:24

ну так вот поэтому на шлюзе и отрабатывает.

Код: Выделить всё

setfib 1 ping lenta.ru
1.2.1.5 принимает запросы из любой сети.

---

какие варианты могут быть для решения?

- настроить днс так чтобы он пересылал запросы на те сервера которые доступны из сети любого провайдера.
- настроить и запустить два днс сервера, но так чтобы один работал на fib 0, а второй на fib 1.
- попробовать реализовать схему с fwd.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение kpp » 2009-12-10 11:34:48

ДНС настроен на работу со всеми провами.
maned.conf

Код: Выделить всё

options {
<------>// Relative to the chroot directory, if any
<------>directory<----->"/etc/namedb";
<------>pid-file<------>"/var/run/named/pid";
<------>dump-file<----->"/var/dump/named_dump.db";
<------>statistics-file>"/var/stats/named.stats";

// If named is being used only as a local resolver, this is a safe default.
// For named to be accessible to the network, comment this option, specify
// the proper IP address, or delete this option.
<------>listen-on<----->{ 127.0.0.1;
<------>                  192.168.0.1;
                        };

// If you have IPv6 enabled on this system, uncomment this option for
// use as a local resolver.  To give access to the network, specify
// an IPv6 address, or the keyword "any".
//<---->listen-on-v6<-->{ ::1; };

// These zones are already covered by the empty zones listed below.
// If you remove the related empty zones below, comment these lines out.
<------>disable-empty-zone "255.255.255.255.IN-ADDR.ARPA";
<------>disable-empty-zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";
<------>disable-empty-zone "1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPA";

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
//<---->forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below.  This will make you
// benefit from its cache, thus reduce overall DNS traffic in the Internet.

<------>forwarders {
<------><------>1.2.1.5;
<------><------>1.2.2.5;
<------><------>1.2.3.5;
<------>};
};
Где можно почитать как два DNS-сервера на одном роутере поднять?

Если делаю так:

Код: Выделить всё

#/etc/rc.d/named stop
Stopping named.
# setfib 1 /etc/rc.d/named start
Начинае резолвиться.
Но это и понятно - это все равно что поменять дефолтный шлюз.

Код: Выделить всё

route del default
route add default 2.2.2.2
, где 2.2.2.2 - шлюз резервного канала.
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
lexxai
проходил мимо
Сообщения: 9
Зарегистрирован: 2009-04-14 14:09:31

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение lexxai » 2010-01-08 8:52:22

Кстати может кому поможет, при старте программы, уже squid адаптировался к setfib.
/usr/local/etc/rc.d/squid

Код: Выделить всё

squid_setfib() {
        sysctl net.fibs >/dev/null 2>&1 || return 0
        if [ "x${squid_fib}" != "xNONE" ]; then
                command="setfib -F ${squid_fib} ${command}"
        else
                return 0
        fi
}

start_precmd="squid_setfib"
Так что прописали squid_fib=1 в rc.conf и все :)

На подобии правим все нужные старт скрипты

galser
проходил мимо
Сообщения: 3
Зарегистрирован: 2011-01-24 22:42:19

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение galser » 2011-01-26 9:42:58

lexxai писал(а):Кстати может кому поможет, при старте программы, уже squid адаптировался к setfib.

Так что прописали squid_fib=1 в rc.conf и все :)

На подобии правим все нужные старт скрипты
Может кому и ещё поможет уточнение - на данный момент эта конструкция в Squid3 не работает, из-за бага самого Squid-а связанного с тем как он работает с IPv4 и IPv6 адресами, для того чтобы она ТАКИ заработало, надо обязательно выставить
tcp_outgoing_address со значение какого-то IPv4 адреса
(причём какого - естественно от той сетевой которая предполагается у вас что будет отправлять данные по другому маршруту, отличного от системного fib ). Да, и, адрес вида 0.0.0.0 - не годится.
Тогда - он заработает как и ожидается.

Проверено на

Код: Выделить всё

FreeBSD gw.horizont.com.ua 8.1-RELEASE FreeBSD 8.1-RELEASE #3
Squid Cache: Version 3.1.10

Zzzzz
проходил мимо

Re: setfib и переключение между таблицами маршрутизации

Непрочитанное сообщение Zzzzz » 2011-10-07 8:48:00

Jails, FIBs etc.
Поднимем-ка неиссякающую тему.
Есть джейлы часть из которых должна сидеть ровно в своём фибе, то есть нужно помимо добавления defaultrouter'а добавлять и удалять маршруты при старте.
Под это было перепилено несколько скриптов.

Код: Выделить всё

[root]cat setfib
#!/bin/sh
# PROVIDE: SETFIB
# REQUIRE: NETWORKING
# BEFORE: DAEMON
#

. /etc/rc.subr

name="setfib"
rcvar=`set_rcvar`

load_rc_config ${name}

max_fibs=`sysctl net.fibs | awk '{ print $2; }'`

start_cmd="${name}_start"
stop_cmd="${name}_stop"


setfib_start()
{
    cmd="add"
    setfib_default
    setfib_route
}

setfib_stop()
{
    cmd="del"
    setfib_default
    setfib_route
}

setfib_default()
{
i=1
while [ $i -le $max_fibs ] ; do

    eval ": \${${name}${i}_enable:=\"NO\"}"
    eval ": \${${name}${i}_defaultrouter:=\"NO\"}"

    _enable="$(eval echo \${${name}${i}_enable})"
    defaultrouter="$(eval echo \${${name}${i}_defaultrouter})"

    if [ ${_enable} != "NO" ]; then
        setfib -$i route $cmd default ${defaultrouter}
    fi
    i=$((i+1))
done;
}

setfib_route()
{
case "$cmd" in
    add)        del_cmd="del"
                add_cmd="add";;
    del)        del_cmd="add"
                add_cmd="del";;
esac
i=0
while [ $i -le $max_fibs ]; do
    [ ${i} != 0 ] && [ "$(eval echo \${${name}${i}_enable})" = "NO" ] && break
     route="$(eval echo \${${name}${i}_add})"
    if [ -n  "${route}" ]; then
        if [ ${i} = 0 ]; then
            route ${add_cmd} ${route}
        else
            setfib -$i route ${add_cmd} ${route}
        fi
    fi
    route="$(eval echo \${${name}${i}_del})"
    if [ -n  "${route}" ]; then
        if [ ${i} = 0 ]; then
            route ${del_cmd} ${route}
        else
            setfib -$i route ${del_cmd} ${route}
        fi
    fi

    j=0
    while : ; do
        route="$(eval echo \${${name}${i}_add${j}})"
        [ -z "${route}" ] && break
        if [ ${i} = 0 ]; then
            route ${add_cmd} ${route}
        else
            setfib -$i route ${add_cmd} ${route}
        fi
        j=$((j+1))
    done
    while : ; do
        route="$(eval echo \${${name}${i}_del${j}})"
        [ -z "${route}" ] && break
        if [ ${i} = 0 ]; then
            route ${del_cmd} ${route}
        else
            setfib -$i route ${del_cmd} ${route}
        fi
        j=$((j+1))
    done
    i=$((i+1))
done;
}

run_rc_command "$1"

Правила описываются в /etc/rc.conf
1. Включается стандартно: setfib_enable="YES"
2. Для каждой таблицы фибов нужно указать что мы её задействуем и далее перечень команд:
setfib3_enable="YES"
setfib3_add0="-host 192.168.0.1 -interface lo0"
setfib3_add1="....."
3. Если команда должна быть одна, то допускается указать setfib3_add="..." or setfib3_del="..."
4. Если мы переносим интерфейсы из основной таблицы в дополнительные, то необходимо удалить их. Делается это обращением к setfib0, команды описанные для номера "0" вызываются вне зависимости от его активации.
5. Если есть необходимость стартовать и останавливать скрипт, то в командах на удаление желательно указывать все опции (например интерфейс на котором сидел адрес), необходимые для корректного возвращения маршрута к жизни.
--- rc.conf ---
setfib_enable="YES"
setfib0_del0="-host 192.168.0.1 -interface lo0"
setfib0_del1="-host 192.168.10.1 -interface lo0"
setfib2_enable="YES"
setfib2_default="192.168.0.100"
setfib2_add="-host 192.168.0.1 -interface lo0"
--- rc.conf ---