Translate Language

EnglishFrenchGermanSpain ItalianDutchRussianPortuguese JapaneseKoreanArabicChinese Simplified

Rabu, 06 Januari 2010

Load Balancing dan Failover

Load Balancing & Failover With multiple ADSL/Cable Connections on Linux
Posted by gtoms | Posted in Load Balancing, Project

Memiliki 2 koneksi internet ke berbeda Internet Services Provider(ISP) tentu kurang optimal jika tidak digabungkan untuk dipakai bersama, disamping dapat menaikkan reliability performa bandwidth juga dapat mengurangi downtime internet jika salah satu koneksi terputus. Sistem ini dinamakan Load Balancing dan Failover.

Traffic Internet Warnet Kencana Putra

Sesuai judul diatas Sistem Load Balancing dan Failover saya terapkan pada sebuah warung internet didaerah Duren Tiga Raya, tepatnya Warnet/Wartel Kencana Putra. Sistem ini menggunakan sistem operasi Linux distribusi Debian, setelah sebelumnya pernah memakai Packet Firewall (PF) di OpenBSD, dan pfSense(free Open Source FreeBSD based). Jadi kali ini saya memakai routing/load balancing menggunakan Linux dan next time mencoba Vyatta Software.


Load Balancing & Failover With multiple ADSL/Cable Connections on Linux
Posted by gtoms | Posted in Load Balancing, Project

Memiliki 2 koneksi internet ke berbeda Internet Services Provider(ISP) tentu kurang optimal jika tidak digabungkan untuk dipakai bersama, disamping dapat menaikkan reliability performa bandwidth juga dapat mengurangi downtime internet jika salah satu koneksi terputus. Sistem ini dinamakan Load Balancing dan Failover.

Traffic Internet Warnet Kencana Putra

Sesuai judul diatas Sistem Load Balancing dan Failover saya terapkan pada sebuah warung internet didaerah Duren Tiga Raya, tepatnya Warnet/Wartel Kencana Putra. Sistem ini menggunakan sistem operasi Linux distribusi Debian, setelah sebelumnya pernah memakai Packet Firewall (PF) di OpenBSD, dan pfSense(free Open Source FreeBSD based). Jadi kali ini saya memakai routing/load balancing menggunakan Linux dan next time mencoba Vyatta Software.

Kebutuhan yang sudah ada :
– 2 Modem ADSL (DLINK dan SANEX) terkoneksi ke Telkom Speedy dengan bandwidth sama Downstream 1022 Kbps Upstream 124 Kbps – Server Router dengan 3 LAN Card : eth0,eth1,eth2, sistem operasi Debian Lenny 5.0.3 – Switch, PC Client(workstation), dsb.

Spesifikasi Internet Address(IP) :

-ADSL1 DLINK : 10.10.10.1 masuk ke eth0 server router

-ADSL2 SANEX : 172.168.1.1 masuk ke eth1 server router

-Server Router dengan eth0 : DHCP dari modem ADSL1 , eth1 : DHCP dari modem ADSL2 , eth2 : 192.168.1.1 sebagai gateway PC CLient/Workstation.

Setelah sistem operasi Linux Debian Lenny sudah terinstall dengan standar system, kita buang service yang tidak perlu yang secara default selalu disertakan dalam instalasi standart sistem Debian :

apt-get remove—purge exim4 exim4-base exim4-config exim4-daemon-light
update-rc.d -f exim4 remove
apt-get remove nfs-common portmap

mengkonfigurasi eth0,eth1,eth2 melalui /etc/network/interfaces

kencana:/home/gtoms# nano /etc/network/interfaces
auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug eth1
iface eth1 inet dhcp

auto eth2
iface eth2 inet static
address 192.168.1.1
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
dns-nameservers 202.134.0.155 202.134.0.61 203.130.196.155

IP address eth0 dan eth1 didapat dari Modem ADSL1 dan 2 yang menjalankan DHCP server, sementara pada eth2 kita assign IP 192.168.1.1 sebagai gateway ke Client/workstation, jika eth0 dan eth1 berfungsi sebagai dhcp client, maka eth2 kita fungsikan sebagai DHCP Server untuk dapat memberikan IP address ke pc client yang akan dipakai user.

apt-get install dhcp3-server

kencana:~# nano /etc/dhcp3/dhcpd.conf

ddns-update-style none;
authoritative;
log-facility local7;

option domain-name “kencana”;
option domain-name-servers 202.134.0.155, 202.134.0.61;
option routers 192.168.1.1;
default-lease-time 86400;
max-lease-time 604800;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.3 192.168.1.250;
}

Setelah urusan DHCP selesai, kita masuk ke bagian setting routing dan load balancing multiple uplinks/providers. Kita buat dulu additional routing tables untuk kedua koneksi ADSL yaitu adsl1 dan adsl2 serta internet dan di tambahkan kedalam file rt_tables.

kencana:/home/gtoms#nano /etc/iproute2/rt_tables :
255 local
254 main
253 default
0 unspec

120 adsl1
121 adsl2
123 internet

Kemudian jalankan perintah berikut untuk routing, load balancing, NAT bisa juga dimasukkan kedalam sebuah file kemudian dipanggil melalui /etc/init.d/networking sehingga saat server reboot sudah terloading otomatis :

ip route flush table adsl1
ip route flush table adsl2
ip route flush table internet

ip rule add prio 10 table main
ip rule add prio 20 table adsl1
ip rule add prio 30 table adsl2
ip rule add prio 40 table internet

ip route del default table main
ip route del default table adsl1
ip route del default table adsl2
ip route del default table internet

ip rule add prio 20 from 10.10.10.0/24 table adsl1
ip route add default via 10.10.10.1 dev eth0 src 10.10.10.10 proto static table adsl1
ip route append prohibit default table adsl1 metric 1 proto static

ip rule add prio 30 from 172.1.1.0/24 table adsl2
ip route add default via 172.1.1.1 dev eth1 src 172.1.1.2 proto static table adsl2
ip route append prohibit default table adsl2 metric 5 proto static

ip rule add prio 40 table internet
ip route add default proto static table internet nexthop via 10.10.10.1 dev eth0 weight 1 nexthop via 172.1.1.1 dev eth1 weight 1

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -P INPUT DROP
iptables -A INPUT -i eth2 -j ACCEPT

iptables -A INPUT -m state—state ESTABLISHED, RELATED -j ACCEPT

iptables A INPUT -p tcp -i eth0 -j REJECT —rejectwith tcp-reset
iptables A INPUT -p tcp -i eth1 -j REJECT —rejectwith tcp-reset

iptables A INPUT -p tcp -i eth0 -j REJECT —rejectwith icmp-port-unreachable
iptables A INPUT -p tcp -i eth1 -j REJECT —rejectwith icmp-port-unreachable

iptables -t nat -A POSTROUTING -o eth0 -j SNAT —to 10.10.10.10
iptables -t nat -A POSTROUTING -o eth1 -j SNAT —to 172.1.1.2


Pemahaman weight pada command diatas adalah jika bandwidth internet ADSL1 dan ADSL2 sama maka saya setting weight 1 weight 1 , jika ADSL2 lebih cepat 10 kali dari ADSl 1 maka disetting weight 1 weight 10.

Setelah konfigurasi diatas kita jalankan running well, maka dilakukan pengecekan :

kencana:/home/gtoms# ip route show table main
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.1
172.1.1.0/24 dev eth1 proto kernel scope link src 172.1.1.2
10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.10
default via 10.10.10.1 dev eth0
default via 172.1.1.1 dev eth1

kencana:/home/gtoms# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 5740 packets, 500K bytes)
pkts bytes target prot opt in out source destination

Chain POSTROUTING (policy ACCEPT 10 packets, 1672 bytes)
pkts bytes target prot opt in out source destination
5958 495K SNAT all — * eth0 0.0.0.0/0 0.0.0.0/0 to:10.10.10.10
3 744 SNAT all — * eth1 0.0.0.0/0 0.0.0.0/0 to:172.1.1.2

Chain OUTPUT (policy ACCEPT 1360 packets, 98808 bytes)
pkts bytes target prot opt in out source destination

Setup fail-over disini untuk membuat automatis routing dengan men-cek apakah ada koneksi ADSL yang mati, jika down akan diganti ke adsl 2, dan jika adsl1 up akan dikembalikan ke adsl1. Untuk ini memerlukan script yang dijalankan saat startup.

Berikut isi scripts yang saya pakai untuk Server Router :

#!/bin/bash
SLEEPTIME=10
TESTIP=www.yahoo.com
TIMEOUT=2
EXTIF1=eth0
EXTIF2=eth1
IP1=10.10.10.10
IP2=172.1.1.2
GW1=10.10.10.1
GW2=172.1.1.1
W1=1
W2=1
NAME1=adsl1
NAME2=adsl2
SUCCESSREPEATCOUNT=4
FAILUREREPEATCOUNT=1

LLS1=1
LLS2=1

LPS1=1
LPS2=1

CPS1=1
CPS2=1

CLS1=1
CLS2=1

COUNT1=0
COUNT2=0

while : ; do
ping -W $TIMEOUT -I $IP1 -c 1 $TESTIP > /dev/null 2>&1
RETVAL=$?

if [ $RETVAL -ne 0 ]; then
echo $NAME1 Down
CPS1=1
else
CPS1=0
fi

if [ $LPS1 -ne $CPS1 ]; then
echo Ping status changed for $NAME1 from $LPS1 to $CPS1
COUNT1=1
else
if [ $LPS1 -ne $LLS1 ]; then
COUNT1=`expr $COUNT1 + 1`
fi
fi

if [[ $COUNT1 -ge $SUCCESSREPEATCOUNT || ($LLS1 -eq 0 && $COUNT1 -ge $FAILUREREPEATCOUNT) ]]; then
echo Uptime status will be changed for $NAME1 from $LLS1
CLS1=0
COUNT1=0
if [ $LLS1 -eq 1 ]; then
LLS1=0
else
LLS1=1
fi
else
CLS1=1
fi

LPS1=$CPS1

ping -W $TIMEOUT -I $IP2 -c 1 $TESTIP > /dev/null 2>&1
RETVAL=$?

if [ $RETVAL -ne 0 ]; then
echo $NAME2 Down
CPS2=1
else
CPS2=0
fi

if [ $LPS2 -ne $CPS2 ]; then
echo Ping status changed for $NAME2 from $LPS2 to $CPS2
COUNT2=1
else
if [ $LPS2 -ne $LLS2 ]; then
COUNT2=`expr $COUNT2 + 1`
fi
fi

if [[ $COUNT2 -ge $SUCCESSREPEATCOUNT || ($LLS2 -eq 0 && $COUNT2 -ge $FAILUREREPEATCOUNT) ]]; then
echo Uptime status will be changed for $NAME2 from $LLS2
CLS2=0
COUNT2=0
if [ $LLS2 -eq 1 ]; then
LLS2=0
else
LLS2=1
fi
else
CLS2=1
fi

LPS2=$CPS2

if [[ $CLS1 -eq 0 || $CLS2 -eq 0 ]]; then
if [[ $LLS1 -eq 1 && $LLS2 -eq 0 ]]; then
echo Switching to $NAME2
ip route replace default scope global via $GW2 dev $EXTIF2
elif [[ $LLS1 -eq 0 && $LLS2 -eq 1 ]]; then
echo Switching to $NAME1
ip route replace default scope global via $GW1 dev $EXTIF1
elif [[ $LLS1 -eq 0 && $LLS2 -eq 0 ]]; then
echo Restoring default load balancing
ip route replace default scope global nexthop via $GW1 dev $EXTIF1 weight $W1 nexthop via $GW2 dev $EXTIF2 weight $W2
fi
fi
sleep $SLEEPTIME

done

Sumber henry.gultom.or.id

Related Posts with Thumbnails
Template by : kendhin kus-kas.blogspot.com