Всем, кто сталкивался с задачей балансировки двух и более каналов, практически всегда приходилось решать задачу отказоустойчивости. На хабре есть замечательная статья на эту тему, которая даёт хорошее представление о том как это работает.
Собственно статья родилась из
этого треда, как бы в пример того как могут применяться демоны маршрутизации.
I. Выбор программного обеспечения.
Для решения задачи необходимы следующие требования к ПО:
- Поддержка нескольких таблиц маршрутизации
- Поддержка mutliroute
По этим критериям знаменитая quagga отправляется в утиль, потому как ни того, ни другого она не умеет. Её предшественник Zebra похоронен ещё в 2005-м году.
Единственный проект, который не только подходит к требованиям, но и активно развивается - чешский BIRD, домашняя страница
http://bird.network.cz/Кроме того, что BIRD умеет всяческие протоколы динамической маршрутизации, он умеет работать как демон RA в IPv6 сетях, хочется попробовать использовать его вместо деревянного radvd , а так же отлично работает со статической маршрутизацией. Именно последний вариант будет рассмотрен.
II. Подготовка сетевой конфигурации.
Чтобы демон корректно работал в требуемых условиях, необходимо подготовить сетевую конфигурацию системы. Убрать все параметры в конфигурационных файлах, так или иначе обозначающих маршрут по умолчанию, т.к за него теперь будет отвечать BIRD.
III. Пример условия:
vlan3 - первый провайдер. 172.16.0.2/24 GW 172.16.0.1
vlan4 - второй провайдер. 10.0.0.2/24 GW 10.0.0.1
vlan5 - локальная сеть. 192.168.0.1/24
Оба провайдера выдают статические адреса. Конфигурация TCP/IP на интерфейсах - статическая.
# file /etc/network/interfaces
auto lo eth0 vlan3 vlan4 vlan5
iface lo inet loopback
iface eth0 inet manual
iface vlan3 inet static
address 172.16.0.2
netmask 255.255.255.0
up ip rule add from 172.16.0.2 table ISP1
down ip rule del from 172.16.0.2 table ISP1
vlan-raw-device eth0
iface vlan4 inet static
address 10.0.0.2
netmask 255.255.255.0
up ip rule add from 10.0.0.2 table ISP2
down ip rule del from 10.0.0.2 table ISP2
vlan-raw-device eth0
iface vlan5 inet static
address 192.168.0.1
netmask 255.255.255.0
vlan-raw-device eth0
Можно увидеть, что параметра gateway нет ни в одной секции.
IV. iproute 2.
Чтобы демон корректно работал в таких условиях, необходимо объявить нужные таблицы маршрутизации ISP1 и ISP2. Например:
# file: /etc/iproute2/rt_tables
255 local
254 main
253 default
252 ISP1
251 ISP2
0 unspec
V. Демон маршрутизации BIRD.
Для уходящего LTS - Lucid Lynx, демон необходимо бэкпортировать из более новых веток репазитария, либо собрать самому, скачав исходные тексты с сайта проекта, а так же подключив репазитарий на Launchpad. Причина - старая версия демона, которая не поддерживает multiroute. Я использовал версию 1.3.7
apt-add-repository ppa:cz.nic-labs/bird
aptitude update
aptitide install bird
Ниже представлен пример конфигурации файла /etc/bird.conf c комментариями.
# Объявляем лог-файл демона
log "/var/log/bird.log" all;
# Объявляем таблицы маршрутизации
table birdISP1;
table birdISP2;
table birddefault;
# Проверяем наличие интерфейсов
protocol device {
scan time 20;
}
# Объявляем маршрутизацию таблицы birdISP1
# Проверяем линк на "живучесть"
protocol static {
table birdISP1;
check link on;
route 172.16.0.0/24 via "vlan3";
route 192.168.0.0/24 via "vlan5";
route 0.0.0.0/0 via 172.16.0.1;
}
# Объявляем маршрутизацию таблицы birdISP2
# Проверяем линк на "живучесть"
protocol static {
table birdISP2;
check link on;
route 10.0.0.0/24 via "vlan4";
route 192.168.0.0/24 via "vlan5";
route 0.0.0.0/0 via 10.0.0.1;
}
# Объявляем таблицу birddefault
# Вес каналов будет одинаковым - 1
# Для изменения веса можно указать
# route prefix multipath via ip [weight num] [via ...]
protocol static {
table birddefault;
route 0.0.0.0/0 multipath
via 172.16.0.1
via 10.0.0.1;
}
# Связываем таблицу маршрутизации birdISP1 с таблицей iproute2 - ISP1
protocol kernel {
table birdISP1;
scan time 20;
export all;
kernel table 252;
}
# Связываем таблицу маршрутизации birdISP2 с таблицей iproute2 - ISP2
protocol kernel {
table birdISP2;
scan time 20;
export all;
kernel table 251;
}
# Связываем таблицу маршрутизации birddefault с таблицей iproute2 - main
protocol kernel {
table birddefault;
scan time 20;
export all;
kernel table 254;
}
Такая конфигурация по задумке обеспечивает проверку валидности каналов каждые 20 секунд, в случае проблем с одним из линков переключает на рабочий.