Страница 1 из 1
setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-09 23:18:43
kpp
Есть шлюз на 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. Проверьте имя узла и
повторите попытку.
При этом на шлюзе
отрабатывает.
При этом если сделать
Код: Выделить всё
route del default
route add default шлюз резервного инетканала
клиент начинает нормально работать.
Получается что определение доменных имен всегда идет по основному каналу, и при пропадании оного, происходит кирдык для клиента.
Как правильно учесть этот момент, чтобы и определение доменных имен от клиента шло через выбранный инетканал а не только по основному?
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-09 23:22:52
terminus
Запустить на рутере свой DNS-кеш и выдавать клиенту его.
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-09 23:28:26
kpp
DNS на роутере поднят, и настроен.
На клиенте указан DNS роутера.
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-09 23:38:29
terminus
а если так:
Код: Выделить всё
${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

Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-09 23:51:39
kpp
Так пробовал, но что-то не то.
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-10 10:16:08
terminus
Ну да, я ошибся - setfib не поможет для трафика идущего от самого сервера так как определение маршрутов на проходе OUT происходит до захода в ipfw... Остается или как-то изхитрится и запускать сам ДНС сервер с указанием fib, или использовать fwd. ДНС у вас в джайле или просто? Если в джайле, то там сейчас для всего джайла можно fib задавать.
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-10 10:54:48
kpp
ДНС просто, не в клетке.
Мда.. получается за что боролись...
Не понятно, ведь на самом роутере нормально все резолвится, независимо от того есть основной канал или нет.

Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-10 10:59:11
terminus
а на самом рутере в resolv.conf он сам или кто?
Кстати, зачем keep-state?
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-10 11:17:31
kpp
На роутере в resolv.conf
Код: Выделить всё
domain<>mydomen
nameserver<---->1.2.1.5 # DNS основного инетканала
В принципе можно обойтись без keep-state - так сложилось исторически

Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-10 11:25:24
terminus
ну так вот поэтому на шлюзе и отрабатывает.
1.2.1.5 принимает запросы из любой сети.
---
какие варианты могут быть для решения?
- настроить днс так чтобы он пересылал запросы на те сервера которые доступны из сети любого провайдера.
- настроить и запустить два днс сервера, но так чтобы один работал на fib 0, а второй на fib 1.
- попробовать реализовать схему с fwd.
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2009-12-10 11:34:48
kpp
ДНС настроен на работу со всеми провами.
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 - шлюз резервного канала.
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2010-01-08 8:52:22
lexxai
Кстати может кому поможет, при старте программы, уже 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 и все
На подобии правим все нужные старт скрипты
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2011-01-26 9:42:58
galser
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
Re: setfib и переключение между таблицами маршрутизации
Добавлено: 2011-10-07 8:48:00
Zzzzz
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 ---