Load Balancing & Failover With multiple ADSL/Cable Connections on Linux

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 di daerah Pancoran Jakarta  Selatan.  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 –reject-with tcp-reset
iptables -A INPUT -p tcp -i eth1 -j REJECT –reject-with tcp-reset

iptables -A INPUT -p tcp -i eth0 -j REJECT –reject-with icmp-port-unreachable
iptables -A INPUT -p tcp -i eth1 -j REJECT –reject-with 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

Setelah selesai saya menambahkan MRTG(gbr diatas), iftop dan beberapa testing lainnya sbb :

donlot capture kencana

iftop kencana3

Speedtest.net - Warnet Kencana

Bacaan : http://lartc.org/howto/lartc.rpdb.multiple-links.html

Need my support email to : henry@gultom.or.id

11 thoughts on “Load Balancing & Failover With multiple ADSL/Cable Connections on Linux

  1. newbie

    Bos, pemilihan DNS server yang digunakan gimana?? misalkan kedua koneksi ADSL kita mempunyai DNS yang berbeda…

    mohon bantuannya…… Thaks..

  2. Henry Gultom

    Untuk distribusi IP ke client saya menggunakan DHCP, dan pada dhcpd.conf saya memasukkan DNS Telkom sbb :

    202.134.0.155
    202.134.0.61
    203.130.196.155

    Kadang DNS Telkom sering ngawur jadi saya pakai Public DNS Google dengan IP :
    8.8.8.8
    8.8.4.4
    cukup cepat,cerdas dan tidak lelet.

  3. xcitchx

    maaf gan mau tanya,saya mau menerapkan loadbalancing dengan 2 koneksi yaitu :
    1. smart (modem dialup)
    2. speedy (lan)
    saya mau menerapkan loadbalancing di windows,mohon pencerahannya??
    sebelumnya saya sudah coba dengan menggunakan software kerio winroute, tetapi kendalanya jika salah satu koneksi terputus maka koneksi pun mati.saya tunggu balasanya.mohon email saya di xcitchx@yahoo.com.terima kasih sebelumnya

  4. Henry Gultom

    Yang pernah saya coba dan jalan pakai Windows Load Balancing Service (WLBS) atau Network Load Balancing (NLB) pada Windows Terminal Server. OSnya Windows 2000 Advanced Server.

  5. ibnu

    maaf mo tanya stelah sy bc tuts diatas, untuk LB 2 speedy dgn modem diset bridge menggunakan PFsense gimn ya mas?
    sebelumnya makasih atas pencerahannya…
    salam ….

  6. victor

    Saya sudah coba sampai pada tahap setting routing, load balancing, tapi pada saat menjalankan perintah “ip route show table main” tidak keluar default gatewaynya. ini gimana ya?

  7. Henry Gultom

    @victor,

    untuk mengisolasi masalah anda, jalankan satu persatu baris perintah routing dimulai dari :

    ip route flush table adsl1
    dst………

    double check pasti ada yang error…makanya “ip route show table main” gak kasih output..

  8. brury

    Halo Pak, salam kenal saya Brury.
    Saya ingin tanya untuk settingan nya itu ada yang versi GUI nya tidak ???
    #maklum baru blajar… :D

    thaks…

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.