Jumat, 18 Februari 2011

Load Balancing yang bersahabat dengan NAT

Sebuah organisasi berlangganan koneksi INTERNET ke lebih dari satu ISP (Internet Service Provider). Salah satu metoda untuk mengoptimalisasikan penggunaan bandwidth adalah menggabungkan koneksi-koneksi tersebut sehingga trafik dari jaringan lokal organisasi tersebut ke INTERNET secara otomatis tersebar melalui beberapa ISP. Konsep ini dinamakan Load Balancing.



Sebuah jaringan lokal yang beranggotakan PC1 (192.168.0.1) dan PC2 (192.168.0.2). PC1 dan PC2 memiliki default gateway yang menunjuk ke 192.168.0.254 yang merupakan alamat IP dari interface eth0 milik ROUTER1. ROUTER1 sebagai gateway dari network 192.168.0.0/24 memiliki dua buah gateway ke INTERNET, yang pertama melalui interface eth1 (10.0.0.1) ke GW1 (10.0.0.2), dan yang kedua melalui interface eth2 (10.0.1.1) ke GW2 (10.0.1.2).
GW1 dan GW2 adalah milik dua buah ISP yang berbeda. Karena bukan milik sendiri, GW1 maupun GW2 tidak mengenal routing ke jaringan 192.168.0.0/24. Oleh karena itu, ROUTER1 melakukan NAT sehingga trafik dari PC1 dan PC2 terbungkus oleh IP yang dikenal oleh GW1 dan GW2.
Penjelasan pada artikel Routing for multiple uplinks/providers sudah dapat menerangkan konsep load balancing sederhana. Akan tetapi metoda pada artikel tersebut tidak mendukung penggunaan NAT. Artikel tersebut hanya dapat diterapkan jika PC1 dan PC2 menggunakan alamat IP publik, yang dikenal oleh server-server di INTERNET dan juga router-router antara (dalam hal ini GW1 dan GW2).
Tanpa penanganan khusus, pemakaian NAT pada load balancing akan menimbulkan kekacauan. Misal, paket pertama sebuah trafik dari PC1 dialirkan melalui GW1, dalam hal ini paket tersebut akan dibungkus proses NAT oleh ROUTER1 sehingga memiliki IP 10.0.0.1 sebelum diteruskan ke GW1. Tanpa penanganan khusus, tidak ada jaminan paket berikutnya tetap melalui GW1. Misalkan paket ketiga dialirkan melalui GW2, yang sebelumnya akan dibungkus oleh ROUTER1 sehingga memiliki IP 10.0.1.1. Server tujuan akan menolak paket tersebut karena IP asal tidak sesuai dengan IP asal paket-paket sebelumnya.
CONNMARK adalah modul pada iptables dan netfilter yang dapat digunakan untuk mengatasi permasalahan konsistensi routing pada load balancing yang menggunakan NAT. Sebuah trafik ditandai (diberi MARK) yang konsisten. Jika paket pertama diberi tanda 1, maka paket-paket berikutnya dari trafik tersebut diberi tanda 1 pula. Jika paket pertama diberi tanda 2, maka paket-paket berikutnya dari trafik tersebut akan diberi tanda 2 pula.
Berikut adalah contoh script yang dapat digunakan. Ini hanyalah merupakan sebuah contoh yang dibuat sesederhana mungkin untuk memudahkan pemahaman. Harap sesuaikan dengan kebutuhan.
#!/bin/bash
# Inisialisasi awal iptables
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# Inisialisasi target-target CONNMARK
# Pada contoh ini, dibuat 2 buah target (2 ISP), sesuaikan dengan kebutuhan
iptables -t mangle -N CONNMARK1
iptables -t mangle -N CONNMARK2
iptables -t mangle -A CONNMARK1 -j MARK –set-mark 1
iptables -t mangle -A CONNMARK1 -j CONNMARK –save-mark
iptables -t mangle -A CONNMARK2 -j MARK –set-mark 2
iptables -t mangle -A CONNMARK2 -j CONNMARK –save-mark
# tandai ulang dengan tanda sebelumnya jika paket merupakan
# kelanjutan dari koneksi yang sudah ada
iptables -t mangle -A PREROUTING -p tcp -m state –state ESTABLISHED,RELATED \
-j CONNMARK –restore-mark
# tandai paket-paket pertama pada awal koneksi
iptables -t mangle -A PREROUTING -p tcp -m state –state NEW \
-m statistic –mode nth –every 2 –packet 0 -j CONNMARK1
iptables -t mangle -A PREROUTING -p tcp -m state –state NEW \
-m statistic –mode nth –every 2 –packet 1 -j CONNMARK2
# NAT koneksi keluar
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
# buat tabel routing baru
if ! cat /etc/iproute2/rt_tables | grep -q ‘^251′
then
echo ‘251 koneksi1′ >> /etc/iproute2/rt_tables
fi
if ! cat /etc/iproute2/rt_tables | grep -q ‘^252′
then
echo ‘252 koneksi2′ >> /etc/iproute2/rt_tables
fi
# kosongkan tabel routing khusus
ip route flush table koneksi1 2>/dev/null
ip route add table koneksi1 default dev eth1
ip route flush table koneksi2 2>/dev/null
ip route add table koneksi2 default dev eth2
# bikin aturan routing sehingga paket di-routing ke tabel routing
# sesuai dengan tanda yang dimiliki
ip rule del from all fwmark 0×1 lookup koneksi1 2>/dev/null
ip rule del from all fwmark 0×2 lookup koneksi2 2>/dev/null
ip rule del from all fwmark 0×2 2>/dev/null
ip rule del from all fwmark 0×1 2>/dev/null
ip rule add fwmark 1 table koneksi1
ip rule add fwmark 2 table koneksi2
# flush cache tabel routing
ip route flush cache

Tidak ada komentar:

Posting Komentar