Если кто-то использует quagga (OSPF) и планирует сделать балансировку каналов, через которые работает OSPF, используя Shorewall, прошу под кат.
Есть у нас нормально работающий OSPF, который прекрасно обменивается маршрутами, и все хорошо. Но вот вы решили, что вам нужен второй провайдер, а для улучшения ситуации с QoS, вы применили что-то на подобие LXC на службе QoS (заменяем ifb на veth) (начали балансировку на интерфейсах с OSPF). Тут у вас и случится проблема: при вполне нормальных и живых каналах, маршрутах и т.п. quagga не проставляет маршруты в таблицу маршрутизации. Что еще больше смущает, команда в vtysh: show ip osfp route показывает все маршруты, а в show ip route эти маршруты стоят в статусе inactive route.
Оказалось, что виноват «Shorewall», который на интерфейсах с балансировкой добавляет лишние маршруты вида:
Встретив такое, quagga теряется, и не устанавливает маршруты проходящие через такое.
Небольшой скрипт, который будем выполнять при запуске shorewall:
И пропишем его в:
Подсказку на решение удалось найти далеко не сразу, но вот ссылка на соответствующий источник.
Итак, сама проблема
Есть у нас нормально работающий OSPF, который прекрасно обменивается маршрутами, и все хорошо. Но вот вы решили, что вам нужен второй провайдер, а для улучшения ситуации с QoS, вы применили что-то на подобие LXC на службе QoS (заменяем ifb на veth) (начали балансировку на интерфейсах с OSPF). Тут у вас и случится проблема: при вполне нормальных и живых каналах, маршрутах и т.п. quagga не проставляет маршруты в таблицу маршрутизации. Что еще больше смущает, команда в vtysh: show ip osfp route показывает все маршруты, а в show ip route эти маршруты стоят в статусе inactive route.
Причина
Оказалось, что виноват «Shorewall», который на интерфейсах с балансировкой добавляет лишние маршруты вида:
10.0.11.0/24 dev eth1 proto kernel scope link src 10.0.11.2
10.0.11.1 dev eth1 scope link src 10.0.11.2 <============= Вот и проблема
10.0.12.0/24 dev eth2 proto kernel scope link src 10.0.12.2
10.0.12.1 dev eth2 scope link src 10.0.12.2 <============= Она второй раз
Встретив такое, quagga теряется, и не устанавливает маршруты проходящие через такое.
Решение
Небольшой скрипт, который будем выполнять при запуске shorewall:
/usr/local/bin/shorewall-prov-fix.sh
#!/bin/bash
IF=$(eval $(for i in $(grep -v '^#' /etc/shorewall/params);do echo -e "$i \c";done;echo '') envsubst < <( grep -v '^#' /etc/shorewall/providers ) | cut -d$'\t' -f 5)
for IF_ in $IF; do
IP=$(ip a s $IF_ | grep 'inet ' | cut -d ' ' -f 6 |sed -e 's/\/.*$//')
SRC=$(ip route show dev $IF_ scope link src $IP |grep -v kernel)
eval "ip route del dev $IF_ $SRC scope link src $IP"
done
И пропишем его в:
/etc/shorewall/started
/usr/local/bin/shorewall-prov-fix.sh > /dev/null 2>&1
P.S.
Подсказку на решение удалось найти далеко не сразу, но вот ссылка на соответствующий источник.
Поделиться с друзьями
n1kkk1ros
Может все таки OSPF? Бооьно уж глаза режет
MagicGTS
Спасибо, на руках автоматом очеаятка идет.