My Headlines

Wednesday, May 14, 2008

Bandwidth Shaper di openSUSE

Wednesday, May 14, 2008
info : http://medwinz.blogsome.com/2008/02/14/bandwith-shaper-di-opensuse/

Seorang rekan menanyakan kenapa mengkonfigurasi openSuSE koq susah sekali. Katanya untuk ngejalanin script sederhana membuat default route aja musti ngebuat script yang njlimet. He…he..he….
Dia bilang kalau di RedHat dan turunannya seperti Fedora dan Centos khan ada rc.local, terus kalau di openSUSE padanannya apa?

OK. Sebetulnya masalah ini sudah pernah saya bahas diblog saya yang dulu dan dibeberapa email saya tapi tak mengapa saya ulang lagi di sini dan saya tambahkan beberapa hal yang saya anggap relevan karena kebetulan ada juga yang nanya tentang load balancing trafik internet ke dua gateway dan implementasi htb (hierarchical tocken bucket) untuk traffic shaping.

Jadi saya akan menjelaskan implementasi load balancing, traffic shaping dan rc.local di openSuSE sekaligus, mumpung lagi ada kesempatan nulis.

LOAD BALANCING TRAFIK INTERNET

Di tempat saya koneksi internet terhubung ke dua ISP, LC 128 kbps ke ISP-A dan ADSL ke ISP-B. Singkat cerita saya menggunakan sebuah server dengan 3 ethernet card

eth0 ip address 202.158.xx.yyy netmask 255.255.255.240 gw 202.158.xx.yyy
eth1 ip address 10.0.50.5 netmask 255.255.255.248 gw 10.0.50.1
eth2 ip address 192.168.117.171 netmask 255.255.255.0 gw 192.168.117.171

Untuk load balancing trafik ini saya mengacu pada dokumen LARTC (Linux Advanced Routing & Traffic Control) How To yang disusun oleh Bert Hubert (thanks Om Bert) di http://lartc.org. Syarat untuk load balancing adalah sudah terinstallnya paket iproute2, yang sudah terinstall saat saya menginstall openSUSE 10.3.

Selanjutnya

# pertama hapus semua default route dari ip route
#
ip route del default
ip route del 10.0.50.0/29
ip route del 202.158.xx.zzz/28
ip route del 169.254.0.0/16

# tambah ip route yang masuk akal
#

ip route add 10.0.50.0/29 dev eth1 proto kernel scope link src 10.0.50.5
ip route add 202.158.xx.zzz/28 dev eth0 proto kernel scope link src 202.158.xx.xxx

# tambah juga load balancing default route (ip router anda)
# weight menandakan mana yang lebih anda pilih, 2 > 1
ip route add default scope global \
nexthop via 202.158.xx.yyy dev eth0 weight 1 \
nexthop via 10.0.50.1 dev eth1 weight 2

# tambah table policy routing
#
ip route add via 202.158.xx.yyy dev eth0 src 202.158.xx.xxx table ISP-A
ip route add via 10.0.50.1 dev eth1 src 10.0.50.5 table ISP-B

# ini musti ditest sometimes we need this
ip route add 192.168.117.0/24 dev eth4 table ISP-A
ip route add 10.0.50.0/29 dev eth1 table ISP-A
ip route add 127.0.0.0/8 dev lo table ISP-A
ip route add 192.168.117.0/24 dev eth4 table ISP-B
ip route add 202.158.xx.yyy/28 dev eth0 table ISP-B
ip route add 127.0.0.0/8 dev lo table ISP-B

# jangan lupa setup dua ip rule agar sistem menggunakan policy routing diatas
#
ip rule add from 202.158.xx.xxx table ISP-A
ip rule add from 10.0.50.5 table ISP-B

# setting IP masquerade
#
iptables -t nat -A POSTROUTING -s 192.168.117.0/24 -d 0/0 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.117.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

perlu diingat bahwa balancing disini tidak sempurna, karena route based, dan routes di-cache. Jadi route ke site yang sering dikunjungi akan selalu melaui provider yang sama.
Contoh di server ini kalau saya traceroute www.detik.com akan selalu lewat ISP-A dan traceroute www.republika.co.id akan selalu melalui ISP-B.

TRAFFIC SHAPING

Tujuan traffic shaping di sini adalah (tentu saja anda bisa melakukan shaping dengan tujuan lain he..he…he..):
- menjaga low latency untuk interactive trafic, jangan sampai upload atau download mengganggu ssh.
- menjaga agar browsing berjalan pada reasonable speeds sementara melalukan up atau downloading.
- menjaga agar upload tidak mengganggu download dan sebaliknya.
- menandakan port atau host yang sering memakan traffic sebagai low priority.

Ada banyak sumber di intenet misalnya http://www.topwebhosts.org/tools/traffic-control.php dan favorit saya adalah sekali lagi om Bert di http://lartc.org/howto/lartc.cookbook.ultimate-tc.html. Jangan lupa baca pre-requisites untuk ngejalanin HTB dan pastikan kernel anda mendukungnya.

Implementasi di tempat saya sederhana saja seperti di bawah:

untuk eth0 dan eth1:

DOWNLINK=96 # untuk eth0, untuk eth1 –> DOWNLINK=288
UPLINK=80 # untuk eth0, untuk eth1 –> UPLINK=20
DEV=eth0 # ganti dengan eth1 untuk eth1

# low priority OUTGOING traffic - you can leave this blank if you want
# low priority source netmasks
NOPRIOHOSTSRC=

# low priority destination netmasks
NOPRIOHOSTDST=

# low priority source ports
NOPRIOPORTSRC=

# low priority destination ports
NOPRIOPORTDST=

if [ "$1" = "status" ]
then
tc -s qdisc ls dev $DEV
tc -s class ls dev $DEV
exit
fi

# clean existing down- and uplink qdiscs, hide errors
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null

if [ "$1" = "stop" ]
then
exit
fi

###### uplink

# install root HTB, point default traffic to 1:20:

tc qdisc add dev $DEV root handle 1: htb default 20

# shape everything at $UPLINK speed - this prevents huge queues in your
# DSL modem which destroy latency:

tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit burst 6k

# high prio class 1:10:

tc class add dev $DEV parent 1:1 classid 1:10 htb rate ${UPLINK}kbit \
burst 6k prio 1

# bulk & default class 1:20 - gets slightly less traffic,
# and a lower priority:

tc class add dev $DEV parent 1:1 classid 1:20 htb rate $[9*$UPLINK/10]kbit \
burst 6k prio 2

tc class add dev $DEV parent 1:1 classid 1:30 htb rate $[8*$UPLINK/10]kbit \
burst 6k prio 2

# all get Stochastic Fairness:
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10
tc qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10

# TOS Minimum Delay (ssh, NOT scp) in 1:10:

tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \
match ip tos 0x10 0xff flowid 1:10

# ICMP (ip protocol 1) in the interactive class 1:10 so we
# can do measurements & impress our friends:
tc filter add dev $DEV parent 1:0 protocol ip prio 10 u32 \
match ip protocol 1 0xff flowid 1:10

# To speed up downloads while an upload is going on, put ACK packets in
# the interactive class:

tc filter add dev $DEV parent 1: protocol ip prio 10 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 1:10

# rest is ‘non-interactive’ ie ‘bulk’ and ends up in 1:20

# some traffic however suffers a worse fate
for a in $NOPRIOPORTDST
do
tc filter add dev $DEV parent 1: protocol ip prio 14 u32 \
match ip dport $a 0xffff flowid 1:30
done

for a in $NOPRIOPORTSRC
do
tc filter add dev $DEV parent 1: protocol ip prio 15 u32 \
match ip sport $a 0xffff flowid 1:30
done

for a in $NOPRIOHOSTSRC
do
tc filter add dev $DEV parent 1: protocol ip prio 16 u32 \
match ip src $a flowid 1:30
done

for a in $NOPRIOHOSTDST
do
tc filter add dev $DEV parent 1: protocol ip prio 17 u32 \
match ip dst $a flowid 1:30
done

# rest is ‘non-interactive’ ie ‘bulk’ and ends up in 1:20

tc filter add dev $DEV parent 1: protocol ip prio 18 u32 \
match ip dst 0.0.0.0/0 flowid 1:20

########## downlink #############
# slow downloads down to somewhat less than the real speed to prevent
# queuing at our ISP. Tune to see how high you can set it.
# ISPs tend to have *huge* queues to make sure big downloads are fast
#
# attach ingress policer:

tc qdisc add dev $DEV handle ffff: ingress

# filter *everything* to it (0.0.0.0/0), drop everything that’s
# coming in too fast:


tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1

Script ini bekerja cukup baik pada ADSL tapi harus dicoba-coba sampai didapat nilai optimum untuk nilai di DOWNLINK dan UPLINK. Masalah umum ADSL adalah kecepatan upload yang jauh dibawah kecepatan download, dan karena sifat TCP/IP yang terus mengirim paket sampai akhirnya tidak ada tempat lagi untuk paket, biasanya modem akan hang. Dengan kecepatan dowload yang kencang biasanya user terus mendownload beberapa sites sekaligus sehingga akumulasi upload menjadi besar. Bila traffic upload ini mencapai modem ADSL maka modem akan hang.

Karena itu harus diatur agar traffic upload kita kontrol dan tidak mencapai modem ADSL hal ini dilakukan dengan menurunkan nilai UPLOAD sampai nilai optimum. Hal ini tercapai jika network latency mencapai nilai terendah dan network tidak putus. Lebih jauh silakan baca pada dokumen LARTC Om Bert di atas.

rc.local di openSUSE

Tidak ada rc.local di openSUSE (he..he…he…)
Kalau kita lihat di RedHat (dan cloningnya) rc.local dijalankan setelah semua service selesai dijalankan di run level 5. Ini gak ada padanannya di openSUSE.

User biasanya mengira boot.local di /etc/init.d adalah padanan dari rc.local. Ini adalah perkiraan yang salah karena boot.local akan jalan paling awal sebelum service-service yang lain dijalankan. Sehingga seringkali user membuat script iptables dan disisipkan pada boot.local kemudian komplain karena scriptnya tidak jalan. Ini terjadi karena script iptables dipanggil sebelum service network dikonfigurasi di run level 3 sehingga sudah pasti tidak akan berfungsi.

Di openSUSE kita harus mengetahui pada saat mana script kita harus jalan apa saja syarat yang dibutuhkan, walaupun umumnya akan jalan di run level 3 dan 5. Misalnya kita ingin menjalankan script load balancing di atas, maka sebelum script ini jalan service network harus sudah jalan dulu.

Untuk dasar dari script tersebut kita dapat menggunakan file /etc/init.d/skeleton sebagai dasar, walaupun tidak tertutup kemungkinan menggunakan script lain seperti yang akan saya contohkan.

Script untuk traffic shapper:

#!/bin/sh
#
#
# /etc/init.d/bwshaper_eth0
#
### BEGIN INIT INFO
# Provides: bwshaper_eth0
# Required-Start: $network
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Custom shapping using htb for eth0 to ISP-A
# Description: decreased the upload traffic on eth0 to ISP-A by doing queuing using htb,
# script by medwin@gmail.com
### END INIT INFO
#

test -s /etc/rc.status && . /etc/rc.status && rc_reset

case "$1" in
start )

## letakkan script and di sini

rc_status -v
;;
stop)
# ok kita test
;;

esac

rc_exit

# end of script



Script di atas hanya satu contoh sederhana saja. Perhatikan bagian:

### BEGIN INIT INFO
# Provides: bwshaper_eth0 —> ini nama service anda
# Required-Start: $network —> ini adalah service yang harus jalan sebelum script anda di jalankan
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 3 5 —> ini run level script anda bekerja
# Default-Stop: 0 1 2 6
# Short-Description: Custom shapping using htb for eth0 to ISP-A
# Description: decreased the upload traffic on eth0 to ISP-A by doing queuing using htb, script by medwin@gmail.com
### END INIT INFO

bagian ini akan dipelajari oleh insserv untuk menjalankan script anda pada run level berapa.
Copy script anda di /etc/init.d
Untuk memasukkan service anda ke service maka daftarkan dengan perintah

> insserv (nama service)

kemudian check dengan

> chkconfig –list

untuk mengetahui kalau service anda sudah masuk ke daftar service di run level tertentu.

Anda juga bisa berkreasi dengan membuat script service yang bisa dijalankan dan diberhentikan seperti misalnya dengan menyisipkan

case "$1" in

start)

echo -n "Starting bandwidth shaping on eth0: "
start
echo "done"
;;

stop)

echo -n "Stopping bandwidth shaping on eth0: "
stop
echo "done"
;;

restart)

echo -n "Restarting bandwidth shaping on eth0: "
restart
echo "done"
;;

status)

echo "Bandwidth shaping status for $IF:"
show
echo ""
;;

*)

pwd=$(pwd)
echo "Usage: tc.bash {start|stop|restart|status}"
;;

pada script anda. Kemudian melakukan symbolic link file tersebut ke /usr/sbin atau /sbin, misalnya dengan nama rcbwshaper_eth0

> ln-s /etc/init.d/bwshaper_eth0 /usr/sbin/rcbwshaper_eth0

sehingga anda bisa memanggilnya dengan perintah

> rcbwshaper_eth0 {start|stop|restart|status}

OK selamat mencoba.
Till then keep safe and stop global warming emoticon


Related Posts



0 comments:

Post a Comment

 
Copyright © Share Knowledge in OpenSource | Powered by Blogger | Template by Blog Go Blog