Win2k3s st x63 и 1Lan + 2WAN ?

dimanger2

Создатель
Регистрация
15 Апр 2008
Сообщения
22
Реакции
4
Подскажи как сделать следующую схему на практике - 1Lan и 2 WAN.

1Lan - Общая сеть, для пользователей.

1-й WAN - Провайдер интернет с белым IP в Интернет
2-й WAN - Резеврный провайдер с белым IP в Интернет

Со стороны интернета без проблемно захожу на сервер по любому интерфейсу WAN в случае обрыва любого из каналов связи.

Вопрос!

Как сделать чтобы автоматически со стороны Lan в случае обрыва одного из каналов связи сервер автоматически переключал бы на резервный WAN, а как только поднимается основной WAN переключал бы обратно.


Ставить железки тоже нельзя, так же как и nix подобное .

Вот такая задачка - головоломка.

Подскажи кто знает как выкрутиться ?

Стоит боевой DC Win2k3S st x64

Подняты следующие службы :
1. AD
2. DNS
3. DHSP
4. FS
5. Маршрутизация и удаленный доступ (VPN)[/spoil]

[spoil]ISA 2006 купить нельзя, дорого, ставить пиратку нельзя , посадят.
Если только какой нить скриптик написать или программку ...
 
Раз использовать ломанный софт нельзя, можно попробовать из самого элементарного скриптом- делаешь нескончаемый цикл, в котором пинг шлюза 1-го WAN, выдираешь с вывода инфу о том, что есть связь или нету, а дальше 2 проверки: (1) если пинга нету - вывести таблицу маршрутизации и проверить д/г 1-го или 2-го WAN указан, если 1-го, то изменить роут на шлюз 2-го WAN, (2) если пинг есть - вывести таблицу маршрутизации и проверить д/г 1-го или 2-го WAN указан, если 2-го, то изменить роут на шлюз 1-го WAN.
Ну и задержку сделать, чтоб проц не грузить...
 
Раз использовать ломанный софт нельзя, можно попробовать из самого элементарного скриптом- делаешь нескончаемый цикл, в котором пинг шлюза 1-го WAN, выдираешь с вывода инфу о том, что есть связь или нету, а дальше 2 проверки: (1) если пинга нету - вывести таблицу маршрутизации и проверить д/г 1-го или 2-го WAN указан, если 1-го, то изменить роут на шлюз 2-го WAN, (2) если пинг есть - вывести таблицу маршрутизации и проверить д/г 1-го или 2-го WAN указан, если 2-го, то изменить роут на шлюз 1-го WAN.
Ну и задержку сделать, чтоб проц не грузить...

сможешь написать скрипт ? Буду очень благодарен.
если время есть и желание, конечно.
 
Для баша он будет выглядеть как-то так (unix) -
Код:
#!/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
А вот как реализовать на батнике - нужло лезть в документацию (не сильно люблю маздай), но есть еще один вариант на перле:
Код:
#!/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
 
root@diapazon.org
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
 
root@diapazon.org
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;

Сам перл для винды можно забрать сдесь -

Хотя само решение - как костыль, но вполне должно работать...
 
Назад
Сверху