Скрипт для переключения между двумя каналами интернета [РЕШЕНО]
lange_sauvage 14 ноября, 2008 - 12:56
Наверняка у кого то уже есть :-)
»
- Для комментирования войдите или зарегистрируйтесь
а одновременно ты не хочешь
а одновременно ты не хочешь их использовать?
роутинг пропиши и всё
.
один канал безлимит, а второй просто на резерв.... нет не хочу его юзать так как дорого
надо чтоб при пропаже пинга переключался на другой и при восстановлении ситуации обратно
можно прописать несколько
можно прописать несколько дефолтных гейтвеев, с разной метрикой. Юзаться будте один с меньшей, а если он исчезнет, тогда все пойдет через второй.
Вы явно не знакомы с
Вы явно не знакомы с проблематикой данного направления. Маршрут исчезает только при физическом исчезновении интерфейса его использующего. Если гетвей по умолчанию доступен, а весь исходящий канал провайдера лежит, то ваше предложение нифига работать не будет.
Не грусти, товарищ! Всё хорошо, beautiful good!
#!/bin/bash /sbin/ifconfig
Скрипт "чуть-чуть" слушает трафик на интерфейсе 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 # опрашиваемый
Нужен еще постоянный маршрут до опрашиваемого узла
Скрипт загоняется в крон на исполнение каждую минуту.
Не грусти, товарищ! Всё хорошо, 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 без редекальныйх переделок?
заработает. только раздел
заработает. только раздел "Определение работающего канала" поправить нужно будет.