Pull to refresh

Comments 27

>Заранее намеренно опускаю всякий флейм, как не превратить debian в slackware.
Тут бы checkinstall помог.
UPD: Я правильно понимаю, что bird не занимается какой-либо балансировкой, а устанавливает маршрут на работающий канал который имеет максимальный приоритет?
а если добавить в список source.list:
deb http://ftp.ru.debian.org/debian unstable main contrib non-free

и указать текущую версию в apt.conf:
APT::Default-Release "testing";

можно сделать проще:
apt-get -t sid install bird

и версия bird 1.3.8 окажется магическим образом установленной на вашем компьютере
UFO just landed and posted this here
1) Да, checkinstall поможет, но я специально умолчал об этом :-) На самом деле, эту конфигурацию я собрал более 2-х месяцев назад и писал статью по хистори и уже готовым конфигам.

2) Так как в static route нет стоимости (cost), то тут балансировки нет, это самая простая реализация. Но никто не запрещает использование каких-либо внешних тулзов.

3) Конечно, можно добавить репо сида и установить последний bird, но я сделал так.
А в чем преимущество этого метода, если практически все мы настраиваем руками? Простой скриптик с пинговалкой заменит эту «курочку».
Ну тут какой-никакой, а готовый демон, с логгированием. Должно быть удобнее. Хотя никто не мешает переписать его на баше…
Данное решение проверят только наличие линка в ethernet, а ведь это не значит что интернет доступен через этого провайдера.
Обычно запускают какой-то скрипт из cron, который пингает что-то через каждый канал и удаляет маршрут по умолчанию на этот канал.
Никто не запрещает использования внешних скриптов.
А зачем тогда нужна эта софтина, если ее прямую функциональность нужно добивать скриптами? А то что она умеет можно сделать еще более простым скриптом…
Вопрос целесообразности вами рассматривался?
Эм, либо я не понял содержание статьи, либо все всё это можно сделать немного проще (пример для FreeBSD)
make -C /usr/ports/net/quagga/ install clean
echo 'quagga_enable="YES"' >> /etc/rc.conf
echo 'quagga_daemons="zebra"' >> /etc/rc.conf
echo 'ip route 0.0.0.0/0 em0 20' >> /usr/local/etc/quagga/zebra.conf
echo 'ip route 0.0.0.0/0 em1 10' >> /usr/local/etc/quagga/zebra.conf
service quagga start
Да, можно и так, но ключевое слово bird.
Я сильно сомневаюсь в
1) dead gateway detection
2) ответ уйдет с тогоже линка куда и пришел
3) балансировка исходящего трафика будет работать
Был бы рад если бы написали статью с гарантировано рабочим решением для FreeBSD.
1) Тут нет dead gateway detection, тут чистой воды ethernet link detection
2) ответ уедет с того же линка.
3) про балансировку никто не говорил.

Мой коментарий был к quagga и FreeBSD. В любом случае quagga не умеет ни dead gw ни link down определять. Как заставить отвечать с тогоже интерфейса тоже не ясно, ответ уходит через тот где default. Я проверил только что на FreeBSD 9.0. Посему вопрос, как сделать аналогичное на FreeBSD по прежнему открыт для меня.
>В любом случае quagga не умеет ни dead gw ни link down определять.

вообще-то, link down квагга вполне определяет и это использует ospfd.
Очень интересно, а как-нибудь задействовать этот механизм можно для static?
2) На pf (openbsd'шный брандмауэр, пользуюсь им) погуглите reply-to. По памяти там синтаксис такой:

pass in on $ext_if1 reply-to ($ext_if1 $ext_gateway1) from any to $ext_if1
pass in on $ext_if2 reply-to ($ext_if2 $ext_gateway2) from any to $ext_if2

www.openbsd.org/faq/pf/pools.html

3) Ввиду того, что у меня на 8.2 на которой старая версия pf, удалось сделать только балансировку исходящего из ната с помощью пула адресов, ссылка та же:

nat on $ext_if1 from $lan_if:network to $ext_if1 -> {$ext_if1, $ext_if2}
nat on $ext_if2 from $lan_if:network to $ext_if2 -> {$ext_if1, $ext_if2}

В новой версии pf, если я правильно понял, есть конструкция
pass out on $ext_if1 from $lan_if:network to any nat-to {$ext_if1, $ext_if2}
pass out on $ext_if2 from $lan_if:network to any nat-to {$ext_if1, $ext_if2}


www.openbsd.org/faq/pf/nat.html
Мой рабочий вариант скрипта переключения каналов, принцип работы скрипта: пингуем шлюз каналов, если пинга до шлюза нет, значит канал лежит, ничего умнее не придумал.
#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin

GW1=Шлюз первого аплинка
GW2=Шлюз второго аплинка
tester=0;
itest1=`/sbin/ping -c 3 $GW1 | grep "64 bytes" | wc -l`;
itest2=`/sbin/ping -c 3 $GW2 | grep "64 bytes" | wc -l`;

if [ ! -f "/tmp/countGW.tmp" ]
then
echo 3 > /tmp/countGW.tmp
fi

oldtest=`cat /tmp/countGW.tmp`

if (test $itest1 -gt "0")
	then
	let tester=tester+1
	fi

if (test $itest2 -gt "0")
        then
	let tester=tester+2
        fi

if [ $oldtest = $tester ]; then
exit;
#echo "Canali ne izmenilis"
else
	if  [ $oldtest = 3 ]; then
	cp /etc/pf.conf /etc/pf.conf3
	fi

        if  [ $tester = 3 ]; then
        cp /etc/pf.conf3 /etc/pf.conf
	/sbin/route change default $GW1
        fi

        if  [ $tester = 2 ]; then
        cp /etc/pf.conf2 /etc/pf.conf
	/sbin/route change default $GW2
        fi

        if  [ $tester = 1 ]; then
        cp /etc/pf.conf1 /etc/pf.conf
	/sbin/route change default $GW1
        fi

/etc/rc.d/pf restart
	
fi

Скрипт изменяет шлюз по умолчанию если основной канал вдруг падает, если канал возвращается на место шлюз также возвращается. В pf имею 3 конфига, активен только канал 1, активен только канал 2 и активны оба канала, что там писать уж на свой вкус, мой вариант когда оба канала работают
ext_if1="ip канала 1"
ext_if2="ip канала 2" 
ext_gw1="Шлюз канала 1"
ext_gw2="Шлюз канала 2"
#{Тут какую сеть на какой канал, либо текущий рабочий канал для всех сетей}
#Этих через канал 2
nat on $ext_if1 from 192.168.3.0/24 to !<no_nat> -> $ext_if2
nat on $ext_if1 from 192.168.4.0/24 to !<no_nat> -> $ext_if2
#Остальных через канал 1
nat on $ext_if1 from 192.168.0.0/16 to !<no_nat> -> $ext_if1

pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to !<no_nat>
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to !<no_nat>
это всё замечатльно, но работать у вас будет всего 1 маршрут. автор статьи хотел рассказать про equal cost multipath.
причём, работать оно будет как бог на душу положит и ожидать что вот всё будет per connection не стоит.
заставить это работать per packet мне не удалось. есть идеи с tc actions, но это надо пробовать.
Как-бы, не совсем, если учитывать ECMP, то на линуксе это вообще отстойно сделано, лучше чем на Cisco я еще не встречал.
Простейший вариант ECMP:
        route 0.0.0.0/0 multipath
                    via 10.10.10.1 weight 7
                    via 172.17.5.1 weight 3;

при этом, предполагается, что через 10.10.10.1 будет уходить 70%, через 172.17.5.1 — 30%, но, как было уже сказано — будет это работать как попало.
вообще, этот вариант можно на linux сделать, но надо выключить route cache. раньше была крутилка, которая это делала. в свежих ядрах я её не нашёл =(
А можно и хардварно и не очень дорого: Mikrotik RB750 или помощнее (если потребности значительные)
что значит «хардварно»? внутри микротика routeros, который есть linux. аппаратная акселерация там, максимум в RNG и AES/3DES/SHA-1.
А чего вам не хватает чтобы назвать этот маршрутизатор аппаратным? По крайней мере, я не слышал пока чтобы NAT как-то ускорялся аппаратно.
Если вы не слышали, это не значит что такого не делают. например, ускорять можно state table lookup.
afaik, делается это с помощью TCAM.
Если state table основана на хештаблице, то ускориться можно реализовав хеш-фукцию в железе(например, ту же sha-1).
Можно принимаемые фреймы класть в SRAM, которая проецируется в адресное пространство cpu на SoC.
cpu путём записи в опр. регионы памяти инструктирует железку что с фреймом делать.
Sign up to leave a comment.

Articles