Привожу скрипт (точнее его версию для публикации здесь), который проверяет работоспособность каналов до двух разных провайдеров, и, если надо, меняет маршрут по умолчанию.
Точнее меняет, если до одного провайдера начинает доходить меньше 50% пингов.
Да, скрипт просто ингует сначала один шлюз, потом другой.
Скрипт работает на FreeBSD 5.1.
В этой системе таблица маршрутов смотрится командой netstat -rn.
Маршруты добавляются и удаляются статически командами
route add адрес шлюз
route delete адрес
route add default и route delete default - ставит и убирает маршрут по умолчанию.
Как я понимаю, в linux для этого используются свои программы.---------------------
#!/usr/bin/perl
open (OLD, '/usr/bin/netstat -rn | /usr/bin/grep default |') or die 'Can\'t open pipe';
while ($line = <OLD>)
{
($def, $old) = (split(/[\s\t]+/, $line))[0,1];
last if ($def eq 'default');
}
close OLD;
$ip{one} = '1.1.1.1';
$ip{two} = '2.2.2.2';
$name{'1.1.1.1'} = 'one';
$name{'2.2.2.2'} = 'two';
die "$old - unknown route\n" unless exists $name{$old};
$old = $name{$old};
while($adr = (each %ip)[0])
{
$line = (`/sbin/ping -q -c 20 $ip{$adr}`)[3];
chomp $line;
($ping{$adr}) = $line =~ /(\d+)%/;
$ping{$adr} = 100 if($ping{$adr} eq '');
$ping{$adr} = 100 - $ping{$adr};
}
if($ping{one} >= 50) { $route = 'one'; }
else { $route = 'two'; }
#`/bin/date >> /usr/local/stat/traf/route.log`;
#open(FILE,">> /usr/local/stat/traf/route.log") or exit;
#print qq~
#To global-iks: $ping{one}%
#To global-dsv: $ping{two}%
#Were route: '$old'
#Now route: '$route'
#---
#~;
#close FILE;
if($old ne $route)
{
`/sbin/route delete default`;
`/sbin/route add default $ip{$route}`;
}
exit;
---------------------
У меня примерно такой скрипт работает уже около года.
Насчет BGP и прочих протоколов - не забывайте, что один канал у автора темы организован через ppp.
А ppp - это point to point, т.е. никаких протоколов такого типа, насколько я понимаю, в нем не предусматривается.