Linux за българи: Форуми

BSD секция => Настройки на софтуер => Темата е започната от: nahap в Mar 31, 2008, 08:17



Титла: Backup isp
Публикувано от: nahap в Mar 31, 2008, 08:17
Здравейте,

С FreeBSD 4.11 съм. Някой може ли да ми посочи линк за скрипт за load balance м/у 2 доставчика. искам ако паде едната връзка, автоматично да почне да рутира през другата. Мерси предварително.


Титла: Backup isp
Публикувано от: neter в Mar 31, 2008, 08:27
Разгледай тази наскорошна тема и връзките, към които води. Тук има и други теми по въпроса. Научи се да използваш търсачката, а когато стигнеш до по-точен проблем - питай ;)

edit: А всъщност, защо ти е load balancing? Щом вторият доставчик ще се ползва само за бекъп, то закачи 2-та доставчика на 2 лан карти, задай маскиранията и рутиранията да минават през интерфейса на основния доставчик и пусни един скрипт, който с най-елементарен ping да проверява наличието на връзка през този интерфейс. Когато скриптът установи липса на връзка, го направи да смени името на интерфейса във файла с правилата или просто си направи още един файл с правила за другия интерфейс. Скриптът ще изчисти старите правила и ще зареди новите, като може да продължи да проверява за свързаност през интерфейса на основния доставчик и когато връзката се възстанови, скриптът ще пренапише правилата отново. Ако целта ти не е едновременно ползване и на двата доставчика, а просто единия да седи като бекъп, това е по-добрата схема.





Титла: Backup isp
Публикувано от: nahap в Mar 31, 2008, 15:24
Благодаря за съвета. Да в действителност не ми трябва load balance..само failover. Така че остава варианта със скрипта който сменя рутинга :)


Титла: Backup isp
Публикувано от: neter в Mar 31, 2008, 15:45
Пробвай да го направиш, а ако срещнеш някакви спънки при реализирането му - ще помагаме :ok:


Титла: Backup isp
Публикувано от: nahap в Apr 01, 2008, 09:57
намерих този скрипт..така като гледам ми се струва че ще сработи, но по-опростен вариант не можах да измисля. Ще ти пиша като почна процедурата да видим какво ще стане :)

#!/usr/bin/perl
use Net::Frame::Device;
use Net::Ping;

$uplink1_interface="fxp0";
$uplink2_interface="sis1";
$lan_interface="bge0";
$primary_gateway="0.0.0.0";
$secondary_gateway="0.0.0.0";

# print current date and time
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$year=$year+1900;
print "GMT Time: $year-$mon-$mday $hour:$min:$sec\n";

my $device_uplink1 = Net::Frame::Device->new(dev => $uplink1_interface);
my $device_uplink2 = Net::Frame::Device->new(dev => $uplink2_interface);
my $device_lan = Net::Frame::Device->new(dev => $lan_interface);

print "Current default gateway:", $device_lan->gatewayIp, "\n";
print "Primary default gateway:", $primary_gateway, "\n";
print "Secondary gateway:", $secondary_gateway, "\n";

print "Checking primary internet uplink ...\n";
if (check_uplink($primary_gateway)) {
if ($device_lan->gatewayIp ne $primary_gateway) {
# set default route to $primary_gateway
`route delete default`;
`route add default $primary_gateway`;

# Change uplink interface to uplink1_interface
change_nat_interface($uplink1_interface);

# restart IPFW and NATD daemon
`/etc/rc.d/ipfw restart`;

print "Default gateway has been changed to $primary_gateway via interface $uplink1_interface\n";
} else {
print "Current default gateway is set to primary gateway and is ok\n";
}
} elsif (check_uplink($secondary_gateway)) {
if ($device_lan->gatewayIp ne $secondary_gateway) {
# set default route to $secondary_gateway
`route delete default`;
`route add default $secondary_gateway`;

# Change uplink interface to uplink2_interface
change_nat_interface($uplink2_interface);

# restart IPFW and NATD daemon
`/etc/rc.d/ipfw restart`;

print "Default gateway has been changed to $secondary_gateway via interface $uplink2_interface\n";
} else {
print "Current default gateway is set to secondary gateway and is ok\n";
}
} else {
print "Any uplink is up and working\n";
}

print "----\n";

######################################################
# Ping IP address and decide if it's reachable or not
# 1.parameter: IP
######################################################
sub check_uplink {
my ($ip) = @_;

my $p = Net::Ping->new("icmp");
my $ok = $p->ping($ip);
$p->close();

return $ok; # 0 - false; 1 - true
}

######################################################
# Change NATD interface file
# 1.parameter: network interface
######################################################
sub change_nat_interface {
my ($nat_if) = @_;

$filename="/tmp/natd_iface";
if (open(F, "> $filename")) {
print "change_nat_iface: writing $nat_if to $filename\n";
print F $nat_if;
close F;
} else {
print "change_nat_iface: Cannot write to $filename\n";
return 0;
}

return 1; # 0 - false; 1 - true
}