LinuxForum.Fans
Тема

Переключение на резервный канал?

Автор: grog666 4 сообщений 5972 просмотров
#185188

Собственно стоит freebsd 7.3 три сетевых интерфейса один в локалку, два во внешку и один из них резервный. Как бы скрипт переключения есть и работает, но с небольшим недостатком если инет обвалится за шлюзом он не сработает. Как сделать что бы скрипт пинговал какой ни будь ip допустим googl'а именно через основной канал. Вот сам скрипт:

#!/usr/bin/perl -w
use strict;
use warnings;
use Net::Ping::External qw(ping);
# 1 - автоматический режим переключение канала
# 2 - принудительное переключение на второй канал.
my $action = 1;
my $host_gw = "111.111.111.111"; # default gateway
my $gw = "222.222.222.222"; # backup gateway
my $now = localtime time;
my $log = "/var/log/route-change.log";

if($action == 1){

my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);

if (ping(hostname=>$host_gw, count=>5)){
print "host $host_gw is ok\n";
if($b[1] ne $host_gw){
if($b[1] eq ""){
`route add default $host_gw`;
}else{
`route change default $host_gw`;
open(LOG,">>$log");
print LOG "[!] $now Route change to $host_gw\n";
close(LOG);
}
}
}else{
print "host $host_gw is bad.\n";
if($b[1] ne $gw){
`route change default $gw`;
open(LOG,">>$log");
print LOG "[!] $now Route change to $gw\n";
close(LOG);
}
}
}

if($action == 2){

my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);

if($b[1] ne $gw){
if($b[1] eq ""){
`route add default $gw`;
}else{
`route change default $gw`;
open(LOG,">>/change_route.log");
print LOG "[!] $now Route change to $gw\n";
close(LOG);
}
}
}
#185350

допишите скрипт,используя следующие:
traceroute -i em0 8.8.8.8
traceroute -i em1 8.8.8.8
где em0 сетевой интерфейс провайдера номер 1, а em1 провайдера номер 2, и соответственно условие, если не доступен первый, то переподкл, если не достпуен 2й, то обратно.
Как вариант еще пустить пинг через тот или иной интерфейс, но как в bsd сделать, я что то затрудняюсь сказать. В Linux используется ключик -I.

#185368
i2ks написал:
Как вариант еще пустить пинг через тот или иной интерфейс, но как в bsd сделать, я что то затрудняюсь сказать. В Linux используется ключик -I.

В BSD за это отвечает ключ -S, правда, в отличие от линуксового -I он принимает в качестве аргумента только IP-адрес, а в Линуксе можно воспользоваться еще и именем интерфейса. Вот на всякий случай для автора темы выдержка из FreeBSD-шного man ping:

-S src_addr
Use the following IP address as the source address in outgoing packets. On hosts with more than one IP address, this option can be used to force the source address to be something other than the IP address of the interface the probe packet is sent on. If the IP address is not one of this machine's interface addresses, an error is returned and nothing is sent.
#185405

спасибо вроде разобрался, модифицировал скрипт добавил строчку и оду подкорректировал.

my $ping_ip = "XXX.XXX.XXX.XXX"; #любой ip, допустим гугловский.

if($action == 1){

my $command = `netstat -rn | grep default`;
my @b = split('\s+',$command,3);

if (ping(hostname=>$ping_ip, count=>5)){
Войдите или зарегистрируйтесь, чтобы ответить.