-->

..:: seize the day ::..

November 19, 2008

Traffic Shaping (Penjelasan 2)

Filed under: IT stuff

Pada bagian ini kita akan mendiskusikan bagaimana mengklasifikasikan paket dan kemudian melakukan penandaan paket (packet marking) berdasarkan TOS field paket di linux kernel. Jadi kita akan menyerahkan klasifikasi paket untuk dilakukan oleh iptables selanjutnya HTB akan melakukan queueing berdasarkan penandaan oleh iptables. Secara singkat TOS (Type of Service, kudu dimengerti oleh pengguna linux yang berminat pada networking dan Quality of Service) merupakan bagian dari paket yang menentukan prioritas dari paket. TOS terdiri dari 8 bit (octet), bit 0, 1, 2 adalah precedence, bit 3, 4, 5, 6 adalah TOS, dan bit 7 adalah bit MBZ (Must Be Zero).

             TOS octet

Secara default nilai dari TOS bits adalah sebagai berikut:

  • 1000 (binary)      8 (decimal)       Minimize delay (md)
  • 0100 (binary)      4 (decimal)       Maximize throughput (mt)
  • 0010 (binary)      2 (decimal)       Maximize reliability (mr)
  • 0001 (binary)      1 (decimal)       Minimize monetary cost (mmc)
  • 0000 (binary)      0 (decimal)       Normal service 

Untuk mengetahui lebih jauh tentang TOS silakan membaca RFC1349 dan RFC2474.

Dengan iptables kita dapat melakukan penandaan paket (packet marking) berdasarkan TOS bits dan inilah yang akan kita lakukan dengan script yang kita buat. Header dari paket akan dibongkar (mangle) oleh iptables dan disisipi tanda (mark) sesuai keinginan kita. (Thanks to Rusty Russel, Harald Welte, Patrick McHardy etc to make iptables as a nice userland for linux communites. Sekitar 2 tahun lalu kebetulan saya pernah kerja bareng dengan salah satu kontributor iptables/netfilter Fabrice Marie, dia salah satu pembuat howto nya netfilter, orangnya sangat down to earth, ramah dan mau berbagi ilmu. Saat itu saya gak tahu kalau dia salah satu kontributornya……..)

Pada script yang saya berikan perhatikan bagian

        tc filter add dev eth1 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:10
        tc filter add dev eth1 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:11
        tc filter add dev eth1 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:12
        tc filter add dev eth1 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:13
        tc filter add dev eth1 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:14
        tc filter add dev eth1 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:15

Pada tulisan sebelumnya kita sudah membuat 6 class htb qdisc tetapi belum melakukan klasifikasi paket, sehingga seluruh paket upload dari network kita akan melalui class 1:15 (kita mendefinisikan tc qdisc add dev eth1 root handle 1: htb default 15). Sekarang kita harus mengklasifikasikan paket agar paket tertentu akan masuk kedalam class htb qdisc tertentu pula. Script di atas adalah filter yang akan membagi paket kedalam class tertentu berdasarkan klasifikasi paket oleh iptables. Penggunaan iptables sangat dianjurkan karena sangat fleksibel, menghitung paket untuk setiap rule dengan cepat, dan juga dengan adanya RETURN target paket tidak perlu menjelajah ke semua rule.

Perintah yang dilakukan pada script di atas adalah memberitahu kernel bahwa paket dengan nilai spesifik FWMARK (handle x fw) harus masuk ke class tertentu (classid x:xy). 

Bagi anda yang belum memahami cara kerja iptables silakan download howtonya di sini, atau setidaknya pahami diagram dari Jan Engelhardt (jengelh adalah pengguna openSUSE, dia salah satu kontributor di openSUSE Build Service. rt-kernel dari dia dipakai untuk Jacklab Audio Distribution).

Misalkan ip lokal anda 192.168.0.0/24 dan ip public anda 202.170.1.2, maka jalankan NAT dengan iptables (untuk pengguna SuSEfirewall tidak perlu menjalankan perintah iptables ini, tetapi ikuti langkah untuk SuSEfirewall di paragraf berikutnya. Saya pengguna SuSEfirewall juga).

  •  ech0 1 > /proc/sys/net/ipv4/ip_forward
  •  iptables - t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j SNAT –to-source 202.170.1.2
Untuk pengguna SuSEfirewall, buka file /etc/sysconfig/SuSEfirewall2 dan lengkapi bagian di bawah ini:

FW_DEV_EXT=’eth1′       ——> sesuaikan dengan eth ip publik
FW_DEV_INT=’eth2′        ——> sesuaikan dengan eth ip lokal
FW_ROUTE="yes"
FW_MASQUERADE="yes"
FW_MASQ_DEV="zone:ext"
FW_MASQ_NETS="192.168.0.0/24"
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"

Kemudian mulailah menambahkan rule untuk PREROUTING chain pada tabel mangle:

iptables -t mangle -A PREROUTING -p icmp -j MARK –set-mark 0x1
iptables -t mangle -A PREROUTING -p icmp -j RETURN

iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j MARK –set-mark 0x1
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j RETURN

iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j MARK –set-mark 0x5
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Cost -j RETURN

iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j MARK –set-mark 0x6
iptables -t mangle -A PREROUTING -m tos –tos Maximize-Throughput -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 22 -j MARK –set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp –sport 22 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j MARK –set-mark 0x1
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 22 -j RETURN

iptables -t mangle -I PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j MARK –set-mark 0x1
iptables -t mangle -I PREROUTING -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 587 -j MARK –set-mark 0x5
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 587 -j RETURN

iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 993 -j MARK –set-mark 0x5
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 993 -j RETURN

iptables -t mangle -A PREROUTING -j MARK –set-mark 0x6

Maksud dari script di atas adalah:
  1. menandai traffic ICMP dengan FWMARK 0x1
  2. -j RETURN untuk trafik ICMP dimana ICMP tidak akan masuk ke rule lain dibawahnya
  3. menandai semua trafik TOS minimize delay sebagai FWMARK 0x1
  4. -j RETURN untuk trafik TOS minimize delay, dimana trafik TOS minimize delay tidak akan masuk ke rule lain dibawahnya
  5. menandai semua trafik TOS minimize cost sebagai FWMARK 0x5
  6. -j RETURN untuk trafik TOS minimize cost, dimana trafik TOS minimize cost tidak akan masuk ke rule lain dibawahnya
  7. menandai semua trafik TOS maximize throughput sebagai FWMARK 0x6
  8. -j RETURN untuk trafik TOS maximize throughput, dimana trafik TOS maximize throughput tidak akan masuk ke rule lain dibawahnya
  9. menandai trafik yang berasal dari port SSH dengan FWMARK  0x1
  10. -j RETURN untuk trafik yang berasal dari port SSH dimana trafik yang berasal dari port SSH tidak akan masuk ke rule lain dibawahnya
  11. menandai trafik yang menuju port SSH dengan FWMARK  0x1
  12. -j RETURN untuk trafik yang menuju port SSH dimana trafik yang menuju port SSH tidak akan masuk ke rule lain dibawahnya
  13. menandai trafik yang memiliki SYN flag dengan FWMARK  0x1
  14. -j RETURN untuk trafik yang memilik SYN flag dimana trafik yang memiliki SYN flag tidak akan masuk ke rule lain dibawahnya
  15. menandai trafik yang menuju port 587 dengan FWMARK 0x5
  16. -j RETURN untuk trafik yang menuju port 587 dimana trafik yang menuju port 587 tidak akan masuk ke rule lain dibawahnya
  17. menandai trafik yang menuju port 993 dengan FWMARK 0x5
  18. -j RETURN untuk trafik yang menuju port 993 dimana trafik yang menuju port 993 tidak akan masuk ke rule lain dibawahnya
  19. trafik yang tidak termasuk dalam klasifikasi sebelumnya akan ditandai dengan FWMARK 0x6 dan akan masuk ke class 1:15

Kemudian lakukan hal yang sama untuk OUTPUT chain. Ulangi script tabel mangle untuk PREROUTING, dan ganti semua kata PREROUTING dengan OUTPUT. Kegunaannya adalah agar semua trafik yang dihasilkan secara lokal di server tempat script ini terletak juga akan diklasifikasi. Tetapi bagian paling akhir dari script diganti dengan: iptables -t mangle -A OUTPUT -j MARK –set-mark 0x3. Hal ini membuat lokal trafik akan mempunyai prioritas lebih tinggi dan akan masuk ke class 1:12.

Masukan script OUTPUT chain dan PREROUTING chain dalam iptables script yang selama ini anda gunakan. Untuk pengguna SuSEfirewall, edit file /etc/sysconfig/scripts/SuSEfirewall2-custom, dan masukkan script tersebut pada bagian before antispoofing seperti dibawah ini

      fw_custom_before_antispoofing(){

            iptables -t mangle -A PREROUTING -p icmp -j MARK –set-mark 0x1
            iptables -t mangle -A PREROUTING -p icmp -j RETURN
            …….. dan seterusnya
            iptables -t mangle -A PREROUTING -j MARK –set-mark 0x6

            iptables -t mangle -A  OUTPUT -p icmp -j MARK –set-mark 0x1
            iptables -t mangle -A OUTPUT -p icmp -j RETURN
            …….. dan seterusnya
            iptables -t mangle -A OUTPUT -j MARK –set-mark 0x3

        true
        }

 

Jalankan script yang saya berikan dan restart SuSEfirewall atau iptables, dan coba jalankan perintah :

       tc -s class show dev eth1

Sekarang perhatikan bahwa jumlah paket akan meningkat di setiap class. Jika ada class yang kosong berarti anda musti mengatur ulang priority atau FWMARK yang diberikan, karena hal ini berbeda disetiap network tergantung dari karakteristik pengunaan network oleh user. Selain itu sekiranya ada class yang penuh terus, maka perlu ditambahkan queuing dicipline lain supaya pembagian bandwidth lebih fair. Hal ini dilakukan dengan sfq (stochastic fairness queueing). Pada contoh script saya tambahkan class sebagai berikut:

        tc qdisc add dev eth1 parent 1:12 handle 120: sfq perturb 10
        tc qdisc add dev eth1 parent 1:13 handle 130: sfq perturb 10
        tc qdisc add dev eth1 parent 1:14 handle 140: sfq perturb 10
        tc qdisc add dev eth1 parent 1:15 handle 150: sfq perturb 10

Maksudnya adalah menambahkan queueing disc sfq pada class 1:12 (dan seterusnya) dengan nama handle 120 (dan seterusnya) dengan hashing dilakukan setiap 10 detik. SFQ akan mengatur bandwidth dibagi secara fair untuk setiap paket trafik. Untuk kasus di tempat anda mungkin berbeda tetapi script ini dapat dijadikan dasar untuk anda mengkonfigurasi di network anda.

Mudah-mudahan penjelasan singkat ini bisa dimengerti.  Pada tulisan berikutnya akan saya jelaskan bagian script yang lain.

Comments »

The URI to TrackBack this entry is: http://medwinz.blogsome.com/2008/11/19/traffic-shaping-penjelasan-2/trackback/

No comments yet.

RSS feed for comments on this post.

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>



Anti-spam measure: please retype the above text into the box provided.