Load Balancing Trafik Internet
Mengingat banyaknya teman-teman yang bertanya ke saya tentang hal ini, saya usahakan untuk menjelaskan di sini bagaimana mensetup koneksi internet dengan lebih dari satu koneksi ke gateway server kita. Saya sudah pernah membahas masalah ini pada tulisan saya sebelumnya tapi kelihatannya belum memadai. Saya usahakan membahas sekali lagi di sini.
Konfigurasi gateway kira-kira seperti ini
Misalkan anda mempunyai koneksi internet ke dua provider, katakan CBN dan TelkomSpeedy (ini bukan iklan lho
). Anda berniat untuk membagi bandwidth ke kedua ISP tersebut, anda dapat melakukannya dengan Linux. Pada kasus saya, saya menggunakan openSUSE 10.3 dengan patch kernel dari Julian Anastasov yang dapat didonlod di sini. Tetapi, ada baiknya sebelum anda menginstall patch tersebut anda mengetahui benar apa yang dilakukan. Sebagai langkah awal bacalah dokumen lartc sebagai pengantar yang menurut saya sangat baik.
Ringkasnya patch dari Julian Anastasov akan memungkinkan kernel anda melakukan "dead gateway detection" untuk selanjutnya mengalihkan trafik ke gateway yang lain yang masih berfungsi. Kombinasi implementasi patch ini dengan ip, iproute dan iptables memungkinkan mesin linux kita mampu melakukan load balancing traffic internet melalui multiple gateway. Kalau di baca di sitenya di atas, dia mengembangkan Linux Virtual Server untuk implementasi cluster/fault-tolerant di linux. Dan sebagai side-effectnya kita bisa menggunakan patchnya untuk load balancing traffic. Walaupun untuk project fault-tolerant saya hanya menggunakan vrrpd script yang implementasinya lebih sederhana
. Sorry ya Om.
Keterbatasan
Sebelum melangkah terlalu jauh saya jelaskan di sini, bahwa instalasi load balancing ini "tidak mudah". Saya membutuhkan waktu berhari-hari untuk yakin bahwa server saya tidak mengalami masalah. Menurut Christoph Simon, yang pernah membuat dokumen how-to ada beberapa keterbatasan yaitu
- setup ini tidak berfungsi untuk pengguna tunggal dengan dua koneksi modem
- load balancing akan berjalan baik tetapi hanya untuk kasus dimana terjadi koneksi simultan yang banyak dan ke alamat yang berbeda-beda
- dalam kasus saya, saya menggunakan 1 koneksi leased channel dan 1 koneksi ADSL
- dalam kasus saya, ADSL yang saya gunakan, karena tidak simetrisnya kecepatan upload dan download, ternyata cukup mengganggu. Sehingga saya harus membatasi upload (yang untungnya bisa di set di susefirewall) dan mengkombinasikannya dengan htb.
- dalam kasus saya juga, saya harus mengatur ethernet secara manual dengan ethtool sampai didapat angka optimum data transfer. Selanjutnya dapat diotomasi dengan menjalankan script pada saat start-up
Keunggulan
Beberapa hal yang saya amati dapat berjalan dengan baik, tentunya setelah berhasil mengatasi kendala-kendala yang saya sebutkan di atas, setelah mengimplementasi Julian Patch adalah:
- bekerja dengan baik pada kernel 2.4-2.6
- bekerja dengan baik untuk kasus 2 sambungan internet (secara teoritis dapat bekerja pada lebih dari satu sampai tidak terbatas)
- kedua sambungan akan bekerja, ketika salah satu jalur down maka secara otomatis akan beralih ke jalur lain yang masih bekerja
- jka jalur putus, tidak perlu mengkonfigurasi ulang network
- berinteraksi dengan baik dengan ip dan iptables
Langkah Pengerjaan
1. Patching kernel
Anda harus melakukan patching kernel dengan mendownload dari sini. Pilihlah patch routes-2.X.diff dibagian Linux kernel patches atau anda dapat juga mendonload paket jumbo patch di bagian Jumbo. Pilihlah yang sesuai dengan kernel anda. Untuk mencheck versi kernel anda ketiklah di prompt uname -r.
Setelah mendownload kernel jalankan perintah /usr/src/linux # patch -p1 < file.diff
Kalau anda juga akan mengimplementasikan htb, ada userspace yang bagus untuk dicoba dan bisa didonload di sini. Jangan lupa baca sedikit dokumentasinya di sini siapa tahu anda perlu mengkonfigurasi ulang kernel anda. Bagaimana mengkonfigurasi ulang kernel tidak akan saya bahas di sini, biasanya telah tersedia dokumentasi untuk setiap distribusi linux.
2. Setting Netfilter
Saya tidak akan menjelaskan bagaimana mengkonfigurasi iptables dan netfilter di sini. Sudah banyak dokumen di internet menjelaskan hal tersebut dengan sangat baik. Tapi pastikan bahwa iptables anda mendukung stateful firewall, kernel forwarding, ALLOW policy dan dua buah SNAT masing-masing untuk ISP1 dan ISP2.
3. Definisi
Di bawah ini adalah definisi dari singkatan yang digunakan (stolen from Christoph Simon nano.txt):
IFI = internal interface
IPI = IP address of internal interface
NMI = netmask for the internal interface
IFE1, IFE2 = external interfaces
IPE1, IPE2 = external IP address
NWE1, NWE2 = external network address
NME1, NME2 = mask for the external network (number of bits, like in /24)
BRD1, BRD2 = broadcast address for external network
GWE1, GWE2 = gateway for external interface
4. Script
Script ini (stolen shamelessly from Christoph Simon nano.txt) mengasumsikan bahwa komputer yang digunakan memiliki 3 ethernet card. Satu buah untuk koneksi ke internal network dan dua buah ke dua gateway yang berbeda.
ip link set IFI up
ip addr add IPI/NMI brd + dev IFI
ip rule add prio 50 table main
ip route del default table main
ip link set IFE1 up
ip addr flush dev IFE1
ip addr add IPE1/NME1 brd BRD1 dev IFE1
ip link set IFE2 up
ip addr flush dev IFE2
ip addr add IPE2/NME2 brd BRD2 dev IFE2
ip rule add prio 201 from NWE1/NME1 table 201
ip route add default via GWE1 dev IFE1 src IPE1 proto static table 201
ip route append prohibit default table 201 metric 1 proto static
ip rule add prio 202 from NWE2/NME2 table 202
ip route add default via GWE2 dev IFE2 src IPE2 proto static table 202
ip route append prohibit default table 202 metric 1 proto static
ip rule add prio 222 table 222
ip route add default table 222 proto static \
nexthop via GWE1 dev IFE1 \
nexthop via GWE2 dev IFE2
Script ini adalah dasar dari script load balancing yang saya gunakan. Tentu saja anda dapat mengeditnya untuk dipanggil sesuai running config yang anda butuhkan. Bagaimana membuat script jalan di running config tertentu tidak akan saya jelaskan di sini. Ada banyak dokumen di internet yang dapat membantu anda mengedit rc.local atau membuat script tersendiri yang akan diletakkan di /etc/init.d
Dalam kasus saya, saya menggunakan openSUSE 10.3 dan saya buat suatu file bernama megwbalance (or any name you like) di /etc/init.d, chmod 755, chown root:root kemudian isi file sebagai berikut:
#!/bin/sh
#
#
# /etc/init.d/megwbalance
#
### BEGIN INIT INFO
# Provides: megwbalance
# Required-Start: $network
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Custom 2 gateway load balancing for ISP1 and ISP2
# Description: Custom 2 gateway load balancing for ISP1 and ISP2
### END INIT INFO
#
test -s /etc/rc.status && . /etc/rc.status && rc_reset
case "$1" in
start )
# script untuk 2 gateway load balancing for SuSE 10.3 by medwinz@gmail.com
# free to copy
#
echo -n "Starting ME gateway load balancing"
ip link set IFI up
ip addr add IPI/NMI brd + dev IFI
ip rule add prio 50 table main
ip route del default table main
ip link set IFE1 up
ip addr flush dev IFE1
ip addr add IPE1/NME1 brd BRD1 dev IFE1
ip link set IFE2 up
ip addr flush dev IFE2
ip addr add IPE2/NME2 brd BRD2 dev IFE2
ip rule add prio 201 from NWE1/NME1 table 201
ip route add default via GWE1 dev IFE1 src IPE1 proto static table 201
ip route append prohibit default table 201 metric 1 proto static
ip rule add prio 202 from NWE2/NME2 table 202
ip route add default via GWE2 dev IFE2 src IPE2 proto static table 202
ip route append prohibit default table 202 metric 1 proto static
ip rule add prio 222 table 222
ip route add default table 222 proto static \
nexthop via GWE1 dev IFE1 weight 1\
nexthop via GWE2 dev IFE2 weight 3
# setting IP masquerade
#
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth1 -j MASQUERADE
# set TOS field agar router gak bingung, supaya ssh dan ftp bisa jalan
iptables -t mangle -A PREROUTING -j TOS –set-tos 0x00
iptables -t mangle -A OUTPUT -j TOS –set-tos 0x00
rc_status -v
;;
stop)
# delete routing and rule table 201, 202, 222
echo -n "Stoping ME gateway load balancing and delete routing"
ip route del NWE1/NME1
ip route del NWE2/NME2
ip rule delete table main
ip rule delete table 201
ip rule delete table 202
ip rule delete table 222
rc_status -v
;;
restart)
## Stop the service and regardless of whether it was
## running or not, start it again.
$0 stop
$0 start
# Remember status and be quiet
rc_status
;;
esac
rc_exit
Save file tersebut, kemudian di openSUSE jalankan pada prompt # insserv /etc/init.d/megwbalance untuk mendaftarkan service tesebut di running level. Selanjutnya reboot server anda. Untuk pengguna distribusi lain silakan jalankan # chkconfig -a levels35 megwbalance start atau yang sejenisnya.
Sekarang fungsi load balancing (termasuk patching kernel untuk dead gateway detection dan reverse path checking) akan dipanggil pada saat boot di run level 3 dan 5.
Selanjutnya anda harus memastikan bahwa ethernet anda berfungsi dengan baik. Biasanya untuk ADSL MTU harus di set ulang, dalam kasus saya eth1 terhubung ke ADSL dan MTU saya set ke 1492. Untuk eth0 dan eth2 yang terhubung ke leased line dan LAN saya set MTU ke 1500 (default). Selain itu dengan ethtool saya set eth0 menjadi 100 MB/s dan half duplex sedangkan eth1 saya batasi kecepatannya ke 10 MB/s dan half duplex. Karena saya menggunakan SuSEfirewall saya dapat menset upload HTB device dengan FW_HTB_TUNE_DEV masing-masing 51200 kbps untuk eth0 dan 63 kbps untuk eth1. Sedangkan untuk eth2 yang terhubung ke LAN saya implementasikan HTB-tools. Anda harus mencari sendiri kombinasi yang tepat untuk network anda. Anda dapat mulai dari kecepatan, duplex dan class HTB yang terkecil dan menaikkannya sedikit demi sedikit sampai didapat kombinasi yang optimum.
Apa saja yang dilakukan oleh Julian Patch? Di bawah ini saya ambil dari how-to nya Christoph Simon:
- Dengan patch tersebut, kita dapat menggunakan "proto static" untuk semua routes. Dengan demikian route untuk sebuah link akan tetap tersimpan di kernel walaupun koneksi terputus tetapi kernel akan secara otomatis mengalihkan trafik ke link yang lain. Kita dapat melakukan ping ke gateway untuk mengetahui bahwa sebuah link itu berfungsi atau tidak. Sebenarnya Equal cost multipath telah ada tanpa patch ini tetapi tidak akan bekerja.
- Kalau sebuah device tetap tersedia walaupun tidak berfungsi, kernel memerlukan suatu cara untuk memutuskan apakah routes ini harus dipilih. Hal ini dinamakan “dead gateway detection'’; hal ini bekerja untuk semua unicast routes (multipath/unipath, input/output) dan disediakan oleh Julian Patch.
- Sebuah multipart route terdiri dari beberapa route dengan sumber dan tujuan yang sama, tetapi dengan jalan yang berbeda, yang didefinisikan dengan device dan gateway. Dengan Julian patch kernel akan mengetahui bagaimana membedakan route tidak hanya dari sumber dan tujuannya, tetapi juga dari device dan gateway. Juga, setidaknya ketika setiap jalur memiliki device yang berbeda, reverse path checking (rp_filter) akan berfungsi dengan baik.
- NAT tidak mampu untuk berinteraksi dengan alternative route. Yang harus melakukannya adalah routing. Julian Patch akan membuat routing system mempersiapkan route bagi sebuah paket individual dari sebuah NAT sistem untuk memilih sebuah route yang tepat (dari beberapa pilihan route).






Nice articles, tapi saya masih curious banyak hal tentang load balancing.. dgn Mas callSign hehhehe
‘Medwinz’ can i send you an email somethimes. Thanks
Comment by wawan — July 15, 2008 @ 12:21 pm