Вы здесь

Скрипт для переключения между двумя каналами интернета [РЕШЕНО]

Наверняка у кого то уже есть :-)

а одновременно ты не хочешь их использовать?
роутинг пропиши и всё

один канал безлимит, а второй просто на резерв.... нет не хочу его юзать так как дорого
надо чтоб при пропаже пинга переключался на другой и при восстановлении ситуации обратно

можно прописать несколько дефолтных гейтвеев, с разной метрикой. Юзаться будте один с меньшей, а если он исчезнет, тогда все пойдет через второй.

Вы явно не знакомы с проблематикой данного направления. Маршрут исчезает только при физическом исчезновении интерфейса его использующего. Если гетвей по умолчанию доступен, а весь исходящий канал провайдера лежит, то ваше предложение нифига работать не будет.

Не грусти, товарищ! Всё хорошо, beautiful good!

#!/bin/bash

/sbin/ifconfig eth0 up
if ! /usr/sbin/tcpdump -i eth0 -n -c 5 -q |/bin/grep " IP "
      then
          /sbin/ifconfig eth1 up
          /sbin/ifconfig eth0 down
      else
          /sbin/ifconfig eth1 down
fi

Скрипт "чуть-чуть" слушает трафик на интерфейсе eth0. Если "полезного" трафика нет, то поднимает интерфейс eth1 и "деактивирует" eth0. Если "полезный" трафик есть, то просто "деактивирует" eth1 (ничего страшного не произойдёт, если интерфейс уже "деактивирован")
Можно запускать в цикле, можно кроном, например, раз в минуту.

Можно скрипт изменить:
- не слушать трафик на интерфейсе, а пинговать с него
- не поднимать/опускать интерфейсы, а просто перезаписывать маршрут

В общем, ABS guide Вам в руки: http://www.google.ru/search?q=advanced+bash+scripting+guide&btnG=Поиск&lr=lang_ru

и про маршрут по умолчанию не забыть еще

there is only war...

#!/bin/bash

# опрашиваемый узел основного провайдера
HOST=10.1.0.254

# шлюз к основному провайдеру
GW1=10.1.0.1
# шлюз к резервному провайдеру
GW2=10.2.0.1

ping -q -c 1 ${HOST} > /dev/null 2>&1

if [ $? -eq 0 ]; then
        ping -q -c 1 ${GW1} > /dev/null 2>&1
        if [ $? -eq 0 ]; then
                ip route change default via ${GW1}
        else
                ip route change default via ${GW2}
        fi
else
        ip route change default via ${GW2}
fi

Нужен еще постоянный маршрут до опрашиваемого узла

ip route add 10.1.0.254 via 10.1.0.1

Скрипт загоняется в крон на исполнение каждую минуту.

Не грусти, товарищ! Всё хорошо, beautiful good!

cat /opt/change-route

#!/usr/bin/perl -w
use strict;
use LockFile::Simple qw(lock trylock unlock);
require 'sys/syscall.ph';

# Устанавливаем путь по умолчанию
$ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin';

# Отладка
my $debug=1;

my $lockmgr = LockFile::Simple->make(-format => '%f',
-stale => 1, -autoclean => 1, -hold => 0,
-efunc => undef, -wfunc => undef);
my $lock = '/opt/change-route.lock';

sub quit {
# Помещаем сюда код для корректного
# прекращения работы
exit(0);
};

# Отделяемся от родителя
fork() && exit;

# Отключаемся от терминала
close STDOUT; close STDERR; close STDIN;

# Делаем корень текужим каталогом
chdir '/';

# Создаем новую сессию и становимся лидером
# группы процессов, чтоб нас случайно не прибили
syscall(&SYS_setsid);

# Блокировка (чтоб не запустилось одновременно 2 процесса)
exit 1 unless ($lockmgr->trylock($lock));

# Перехватываем сигналы, для корректного выхода
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'quit';
$SIG{'HUP'} = 'ignore';

# Основной канал
my %primaryip = (
iface => "eth1",
ip => "7.13.6.22",
netmask => "255.255.255.224",
route => "7.13.6.1"
);
# Резервный канал
my %secondaryip = (
iface => "eth2",
ip => "21.2.7.41",
netmask => "255.255.255.252",
route => "21.2.7.42"
);

# Локальная сеmь
my $iflocal='192.168.0.0/24';

# Правила для iptables
# основной канал
my $primaryrules = " -s $iflocal -o $primaryip{iface} -j SNAT --to-source $primaryip{ip}";
# резервный канал
my $secondaryrules = " -s $iflocal -o $secondaryip{iface} -j SNAT --to-source $secondaryip{ip}";

begin:

# Определение работающего канала
open(A,"route|");
my $activeiface='not';
while () {
next if (!($_ =~ m/default\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/));
$activeiface=$1;
};
close(A);

# Проверка каналов
my $primarystatus=system("ping -c 2 -I $primaryip{ip} $primaryip{route} > /dev/null");
my $secondarystatus=system("ping -c 2 -I $secondaryip{ip} $secondaryip{route} > /dev/null");
open(LogFile,">> /opt/change-route.log");
if ($debug){
print LogFile "\n",`date`;
print LogFile "Активный канал ", $activeiface, "\n";
print LogFile "Основной канал ",$primaryip{iface},", шлюз ", $primaryip{route}, " ",

$primarystatus?"Недоступен":"Доступен", "\n";
print LogFile "Резервный канал ",$secondaryip{iface},", шлюз ", $secondaryip{route}, " ",

$secondarystatus?"Недоступен":"Доступен", "\n";
};

# Переключение шлюза

# Если используется резервный канал, но доступен основной переключаемся на него
if ( ($activeiface eq $secondaryip{iface}) and ($primarystatus == 0)) {
print LogFile "Переключаю на основной",$primaryip{iface}, "\n";
system("route del default gw $secondaryip{route} > /dev/null");
system("route add default gw $primaryip{route}");
system("iptables -t nat -D POSTROUTING $secondaryrules");
system("iptables -t nat -A POSTROUTING $primaryrules");
};

# Если используется основной канал, но он не работает переключаемся на резервный
if ( ($activeiface eq $primaryip{iface}) and (!($primarystatus == 0)) ) {
# Смена маршрута поумолчанию на резервный, при доступности второго канала
if ($secondarystatus == 0) {
print LogFile "Переключаю на резервный",$secondaryip{iface}, "\n";
system("route del default gw $primaryip{route}");
system("route add default gw $secondaryip{route}");
system("iptables -t nat -D POSTROUTING $primaryrules");
system("iptables -t nat -A POSTROUTING $secondaryrules");
};
};
close(LogFile);
sleep 120;
goto begin;

Мммм, много буков, без тестинга ничего не скажешь.

Не грусти, товарищ! Всё хорошо, beautiful good!

у меня он ночь отработал... лог пишит... устроить тестинг надо :-)
и скрипты запуска добавить

# cat /etc/init.d/change-route

#!/sbin/runscript
# Copyright 1999-2007 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: change-route
# 1.7 2007/04/07 13:03:55 chtekk Exp $

depend() {
need net
}

start() {
ebegin "Starting change-route"
start-stop-daemon --start --quiet --exec /opt/change-route
eend $?
}

stop() {
ebegin "Stopping change-route"
start-stop-daemon --stop --quiet --pidfile /opt/change-route.lock
eend $?
}

#!/usr/bin/perl -w
use strict;
use LockFile::Simple qw(lock trylock unlock);
require 'sys/syscall.ph';

# Устанавливаем путь по умолчанию
$ENV{PATH} = '/bin:/usr/bin:/sbin:/usr/sbin';

# Отладка
my $debug=1;

my $lockmgr = LockFile::Simple->make(-format => '%f',
-stale => 1, -autoclean => 1, -hold => 0,
-efunc => undef, -wfunc => undef);

my $lock = '/opt/change-route.lock';

sub quit {
# Помещаем сюда код для корректного
# прекращения работы
exit(0);
};

# Отделяемся от родителя
fork() && exit;

# Отключаемся от терминала
close STDOUT; close STDERR; close STDIN;

# Делаем корень текужим каталогом
chdir '/';

# Создаем новую сессию и становимся лидером
# группы процессов, чтоб нас случайно не прибили
syscall(&SYS_setsid);

# Блокировка (чтоб не запустилось одновременно 2 процесса)
exit 1 unless ($lockmgr->trylock($lock));

# Перехватываем сигналы, для корректного выхода
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'quit';
$SIG{'HUP'} = 'ignore';

# Основной канал
my %primaryip = (
iface => "eth1",
ip => "7.13.6.228",
netmask => "255.255.255.224",
route => "7.13.6.225"
);
# Резервный канал
my %secondaryip = (
iface => "eth2",
ip => "21.2.7.41",
netmask => "255.255.255.252",
route => "21.2.7.42"
);

# Ip для теста
my $testip='86.110.181.76';

# Локальная сеmь
my $iflocal='192.168.0.0/24';

# Правила для iptables
# основной канал
my $primaryrules = " -s $iflocal -o $primaryip{iface} -j SNAT --to-source $primaryip{ip}";
# резервный канал
my $secondaryrules = " -s $iflocal -o $secondaryip{iface} -j SNAT --to-source $secondaryip{ip}";

begin:

# Определение работающего канала
open(A,"route|");
my $activeiface='not';
while () {
next if (!($_ =~ m/default\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+\S+\s+(\S+)/));
$activeiface=$1;
};
close(A);

# Проверка каналов
my $primarystatus=system("ping -c 2 -I $primaryip{ip} $primaryip{route} > /dev/null");
my $secondarystatus=system("ping -c 2 -I $secondaryip{ip} $secondaryip{route} > /dev/null");
system("route add -host $testip gw $primaryip{route} metric 30");
my $primarystatusya=system("ping -c 2 -I $primaryip{ip} $testip > /dev/null");
system("route del -host $testip gw $primaryip{route} metric 30");
system("route add -host $testip gw $secondaryip{route} metric 30");
my $secondarystatusya=system("ping -c 2 -I $secondaryip{ip} $testip > /dev/null");
system("route del -host $testip gw $secondaryip{route} metric 30");

open(LogFile,">> /opt/change-route.log");
if ($debug){
print LogFile "\n",`date`;
print LogFile "Активный канал ", $activeiface, "\n";
print LogFile "Основной канал ",$primaryip{iface},", шлюз ", $primaryip{route}, " ",

$primarystatus?"Недоступен":"Доступен", " ",$testip, " " , $primarystatusya?"Недоступен":"Доступен", "\n";
print LogFile "Резервный канал ",$secondaryip{iface},", шлюз ", $secondaryip{route}, " ",

$secondarystatus?"Недоступен":"Доступен", " ",$testip, " ", $secondarystatusya?"Недоступен":"Доступен", "\n";
};

# Переключение шлюза
# Если используется резервный канал, но доступен основной переключаемся на него
if ( ($activeiface eq $secondaryip{iface}) and ($primarystatusya == 0)) {
print LogFile "Переключаю на основной",$primaryip{iface}, "\n";
system("route del default gw $secondaryip{route}");
system("route add default gw $primaryip{route}");
system("iptables -t nat -D POSTROUTING $secondaryrules");
system("iptables -t nat -A POSTROUTING $primaryrules");
open (MAIL, '| /bin/mail -a

7922ххххххх@sms.ugsm.ru');
print MAIL "Subject: ",`hostname`,"service info";
print MAIL `date`," Pereklyuchenie na osnovnoi kanal";
close (MAIL);
};

# Если используется основной канал, но он не работает переключаемся на резервный
if ( ($activeiface eq $primaryip{iface}) and (!($primarystatusya == 0)) ) {
# Смена маршрута поумолчанию на резервный, при доступности второго канала
if ($secondarystatusya == 0) {
print LogFile "Переключаю на резервный",$secondaryip{iface}, "\n";
system("route del default gw $primaryip{route}");
system("route add default gw $secondaryip{route}");
system("iptables -t nat -D POSTROUTING $primaryrules");
system("iptables -t nat -A POSTROUTING $secondaryrules");
open (MAIL, '| /bin/mail -a

7922ххххххх@sms.ugsm.ru');
print MAIL "Subject: ",`hostname`,"service info";
print MAIL `date`," Pereklyuchenie na rezervnyi kanal";
close (MAIL);
};
};

close(LogFile);
sleep 120;
goto begin;

можно по точней что куда класть, и есть такой вопросик этот скрипт за работает на ubuntu без редекальныйх переделок?

заработает. только раздел "Определение работающего канала" поправить нужно будет.