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

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

а одновременно ты не хочешь

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

.

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

можно прописать несколько

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

Вы явно не знакомы с

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

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

#!/bin/bash /sbin/ifconfig

#!/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 # опрашиваемый

#!/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 без редекальныйх переделок?

заработает. только раздел

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

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".