| Written by Radoslav Dejanović,
on 12-06-2008 21:06
|
Views : 804  |
Favoured : 27 |
Published in : , Croatian language |
Ne baš atipična situacija za Hrvatsku je tvrtka koja želi uštedjeti troškove i ne želi kupiti simetričan stalni link, već trpi mušice aDSL veze.
Da, da - nema do optike, ali puno više mojih klijenata bira ovu jeftiniju varijantu priče. Na kraju krajeva, najveća količina prometa je ulazna, a odlazni paketi često i nisu tako bitni - neka je sporije, kad ode otići će.
Nedavno sam slagao, između ostaloga, jedno prosto failover rješenje. Tvrtka ima dva aDSL linka, jedan je flat-rate link prema Iskonu, a drugi je stari ne-flat-rate link prema Amisu, kojeg je tvrtka zadržala jer je toliko jeftin da stoji za "zlu ne trebalo".
Naravno, stvar bi bilo zgodno automatizirati, zar ne?
Postoji više načina na koje se može riješiti ovaj problem - najjednostavniji je ugrađen u sam kernel i sastoji se od tri jednostavne linije koda:
route add default gw 192.168.1.254 dev eth1
route add default gw 192.168.100.1 dev eth2
echo "10" > /proc/sys/net/ipv4/route/gc_timeout
Dakle, postavimo jednu rutu, postavimo drugu rutu, te u gc_timeout postavimo vrijeme u sekundama nakon čijeg isteka će računalo zaključiti kako je ruta mrtva, te prijeći na drugu rutu.Mana ove priče je što u slučaju da drugi link radi kako treba, računalo se neće samo od sebe vratiti na prvi link.
No, ovdje pričamo o dva linka, pri čemu je flat-rate link debelo preferiran onom drugom linku. A ljudi surfajuuuuu...
Skripta koja slijedi (a koju sam bezočno ukrao sa Interneta i malo prilagodio) od jednostavnijih je rješenja ovog problema.
Potrebno je postaviti cron job koji će svakih par minuta pokrenuti ovu skriptu:
#!/bin/sh
#Note: Please make sure this script run in the
#cronjob every 5 minutes
# U ove varijable stavite gateway IP adrese vaša dva providera.
# Pritom pazite na ethernet kartice:
# ISP1 -> eth1 (primarni link)
# ISP2 -> eth2 (backup link)
# U ovom slučaju eth0 je lokalna mreža!
ISP1=192.168.1.254
ISP2=192.168.100.1
function switch_isp2()
{
/sbin/route del default
/sbin/route add default gw $ISP2 dev eth2
}
function switch_isp1()
{
/sbin/route del default
/sbin/route add default gw $ISP1 dev eth1
}
if /bin/ping -q -c1 -Ieth1 161.53.19.201 >/dev/null 2>&1; then
if /sbin/route -n | /bin/grep '^0.0.0.0' | /bin/grep "$ISP2" >/dev/null; then
/sbin/ip route flush cache;
echo `date` "Prebacujem se na ISP1";
switch_isp1;
/sbin/route -n | grep UG;
fi;
exit 0;
elif /sbin/route -n | /bin/grep '^0.0.0.0' | /bin/grep "$ISP1" >/dev/null; then
echo `date` "Prebacujem se na ISP2";
/sbin/ip route flush cache;
switch_isp2;
/sbin/route -n | grep UG;
fi;
Kako skripta radi? Pokrenuta svakih nekoliko minuta iz cron-a, skripta će prvo provjeriti može li kroz primarni link pingati www.hr (161.53.19.201). Naredbu ping možete opcijom -I nagovoriti da pinga preko interface-a kojeg vi želite (u suprotnom će pingati preko podrazumjevane rute). Ako je sve u redu, tj. ako se host odaziva, provjerit će je li gateway namješten na pomoćni link i ako jest, automatski će prebaciti rutu na flat-rate vezu tako što će prvo obrisati informacije o trenutno korištenom gatewayu te postaviti novi gateway sa striktno definiranom ethernet karticom koja je vezana na flat-rate aDSL.
Ako se host ne odaziva, prebacit će se na pomoćni link i na gore opisani način postaviti novu rutu.
Ova skripta nije savršena. Nije stalno čučeći daemon već se poziva iz cron-a, što znači da se gubitak primarnog linka neće odmah sanirati prebacivanjem na pomoćni, već će proći određeno vrijeme,barem jedna minuta (jer je to razlučivost cron daemona, ili više ako ne želite opterećivati vaš stroj čestim provjerama linka - što zapravo i nije neko opterećenje - veći problem su nestrpljivi korisnici) dok skripta ne dođe na red za izvršavanje. U praksi, u cronu definiran interval kojim će se pozivati skripta je najveće očekivano vrijeme odziva, jer se skripta može, uz malo sreće, doći na red za pokretanje sekundu ili dvije nakon pada veze, u kojem slučaju će korisnici imati privid fantastično inteligentnog i brzog failover sustava. ;-)
Zatim, uvijek postoji mogućnost da oba linka krepaju, no na to zbilja ne možete utjecati. Skripta je dovoljno "inteligentno" napisana da preuzme bilo koji link koji prvi dođe sebi, a zatim se vrati na flat-rate link čim ovaj postane dostupan.
Najzad, što ako vanjski server kojim kontroliramo dostupnost linka iz nekog razloga ne radi? Dakako, www.hr je vrlo pouzdan server, ali nitko ne garantira da neće otkazati u nezgodnom trenutku. Ovo možete ublažiti tako da pingate neki od servera "bliže" vašoj primarnoj aDSL vezi, DNS server vašeg flat-rate ISP providera, primjerice.
Ako ISP ne dozvoljava ping? Promjenite ISP!
Ispis skripte možete hvatati u željeni log; svaka promjena gatewaya rezultirat će porukom sa datumom i vremenom promjene.
Može li skripta biti bolja? Svakako! No, ovo je otprilike najjednostavnije što sam našao.
|