On Fri, Sep 24, 2010 at 02:16:36PM +0700, Bambang Sumitra wrote:
> rekan-rekan,
> saya ada rencana mau buat topologi seperti ini
>     isp-1            isp-2
>       |                |
>       |                |
>       +--- Linux ------+
>            Centos
>              |
>              |
>           switch
>              |
>              |
>           Clients
> 
> * di linux centos ada squid proxy dengan settingan transparent
> 
> jadi di linux centos itu mau saya buat load balance multi isp, untuk
> load balancenya rencana saya ikuti dari link ini
> http://tetro.net/misc/multilink.html cuma dari info yang saya dapat
> dari beberapa link google, walaupun kita setting load balance, untuk
> koneksi squid internal hanya akan memakai default gateway aja ( tidak
> ikut load balance ). apakah emang seperti itu? atau di squid bisa di
> atur juga supaya bisa load balance?

Kalau pakai squid internal yang jadi satu dengan mesin router bisa
pakai metode loadbalancing seperti yang ditulis di
  http://lartc.org/howto/lartc.rpdb.multiple-links.html
Masalahnya adalah jika kita koneksi ke suatu situs yang menuntut agar
client agar selalu menggunakan wan yang sama (persistent connection),
maka metode load balancing ini tidak bisa dipakai.
Hal ini mengingat router hanya menyimpan atau cache table routing
ke suatu ip remote dalam periode tertentu, setelah timeout akan 
dibuat table routing baru. Jika beruntung, bisa jadi table routing
ini akan melalui wan yang sama seperti sebelumnya, jika tidak maka
akan melalui wan yang berbeda.

Trik agar koneksi ke suatu ip remote selalu melalui wan yang sama
adalah dengan menggunakan ipset. Trik ini saya peroleh setelah
mengamati load balancing pcc (per connection classifier) di mikrotik.

/usr/local/sbin/lb-pcc-lokal.sh:
--------------------------------
#!/bin/sh

# File: lb-pcc-lokal.sh
#
# ROUTING KONEKSI LOKAL
# DARI MESIN PROXY
# DESTINATION:
#   - TCP PORTS 1:1024,3128,8080
#   - UDP PORTS 1700:1800 (vpn)
# 
#
# Created: 24/07/10

# CREATE IPSET
# set dst.1 untuk menyimpan ip remote yang akan dilewatkan ke wan1
# set dst.2 untuk menyimpan ip remote yang akan dilewatkan ke wan2
#
# ipset -N dst.1 iphash --probe 2
# ipset -N dst.2 iphash --probe 2

# PARAMETER
IPTABLES="/usr/local/sbin/iptables"
IPSET="/usr/local/sbin/ipset"
PROTO="tcp"
PORTS="1:1024,3128,8080"
LAN="192.168.0.0/16"

# 
# Flush table OUTPUT
#
$IPTABLES -t mangle -F OUTPUT > /dev/null 2>&1
$IPTABLES -t mangle -F DST.1 > /dev/null 2>&1
$IPTABLES -t mangle -X DST.1 > /dev/null 2>&1
$IPTABLES -t mangle -F DST.2 > /dev/null 2>&1
$IPTABLES -t mangle -X DST.2 > /dev/null 2>&1

#
# Flush set
#
#$IPSET -F dst.1
#$IPSET -F dst.2

#
# Buat rule iptables chain DST.10 di table mangle
# Gunanya untuk menyimpan ip dst yang akan dilewatkan via wan1
#
$IPTABLES -t mangle -N DST.1
$IPTABLES -t mangle -A DST.1 -j SET --add-set dst.1 dst
$IPTABLES -t mangle -A DST.1 -j MARK --set-mark 10
#
# Buat rule iptables chain DST.11 di table mangle
# Gunanya untuk menyimpan ip dst yang akan dilewatkan via wan2
# 
$IPTABLES -t mangle -N DST.2
$IPTABLES -t mangle -A DST.2 -j SET --add-set dst.2 dst
$IPTABLES -t mangle -A DST.2 -j MARK --set-mark 11
#
# Buat rule iptables
# Menangkap paket dengan dst ip dan cocokkan dengan set yang sesuai
# Target "-j RETURN" digunakan biar paket yang match dengan mark yg sesuai
# tidak di-alirkan (traverse) ke bawah.
#
$IPTABLES -t mangle -A OUTPUT -p $PROTO -m multiport --dports $PORTS \
  ! -d $LAN -m set --match-set dst.1 dst -j MARK --set-mark 10
$IPTABLES -t mangle -A OUTPUT -p $PROTO -m multiport --dports $PORTS \
  ! -d $LAN -m mark --mark 10 -j RETURN
$IPTABLES -t mangle -A OUTPUT -p $PROTO -m multiport --dports $PORTS \
  ! -d $LAN -m set --match-set dst.2 dst -j MARK --set-mark 11
$IPTABLES -t mangle -A OUTPUT -p $PROTO -m multiport --dports $PORTS \
  ! -d $LAN -m mark --mark 11 -j RETURN

#
# Paket pertama 1 of 2 akan dilempar ke chain DST.10
# Paket kedua   2 of 2 akan dilempar ke chain DST.11
#
$IPTABLES -t mangle -A OUTPUT -p $PROTO -m multiport --dports $PORTS \
  ! -d $LAN -m statistic --mode nth --every 2 --packet 0 -j DST.1
$IPTABLES -t mangle -A OUTPUT -p $PROTO -m multiport --dports $PORTS \
  ! -d $LAN -m statistic --mode nth --every 2 --packet 1 -j DST.2

Logika script di atas adalah cek paket yang keluar apakah mempunyai
ip tujuan yang telah cocok/match dengan list ipset yang telah dibuat 
sebelumnya, jika tidak maka akan dilakukan load balancing nth lalu 
jump ke chain wan yang sesuai. Di chain wan yg sesuai akan disimpan 
data ip address tujuan ke list ipset. Kemudian mark paket sesuai 
dengan wannya.

# ip ru ls
0:      from all lookup local 
32762:  from all fwmark 0xb lookup T2 
32763:  from all fwmark 0xa lookup T1 
32764:  from 192.168.1.2 lookup T2 
32765:  from 192.168.2.2 lookup T1 
32766:  from all lookup main 
32767:  from all lookup default 

Jadi setiap kali user buka http://www.showip.com akan selalu ditunjukkan
ip wan yang sama. Kelemahan ipset adalah dia hanya sanggup menyimpan
sampai 65536 ip address per list.

-- 
Arief Yudhawarman
http://awarmanf.wordpress.com

-- 
FAQ milis di http://wiki.linux.or.id/FAQ_milis_tanya-jawab
Unsubscribe: kirim email ke tanya-jawab-unsubscr...@linux.or.id
Arsip dan info milis selengkapnya di http://linux.or.id/milis

Kirim email ke