Skip to main content

Traffic Shaping - Bagian 2

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).


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 Tahun 2006 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 (pada tulisan sebelumnya) 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).

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 0×1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
iptables -t mangle -A PREROUTING -m tos –tos Minimize-Delay -j MARK –set-mark 0×1
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 0×5
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 0×6
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 0×1
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 0×1
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 0×1
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 0×5
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 0×5
iptables -t mangle -A PREROUTING -p tcp -m tcp –dport 993 -j RETURN
iptables -t mangle -A PREROUTING -j MARK –set-mark 0×6
Maksud dari script di atas adalah:
  1. menandai traffic ICMP dengan FWMARK 0×1
  2. -j RETURN untuk trafik ICMP dimana ICMP tidak akan masuk ke rule lain dibawahnya
  3. menandai semua trafik TOS minimize delay sebagai FWMARK 0×1
  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 0×5
  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 0×6
  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  0×1
  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  0×1
  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  0×1
  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 0×5
  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 0×5
  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 0×6 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 0×3. 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 0×1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
…….. dan seterusnya
iptables -t mangle -A PREROUTING -j MARK –set-mark 0×6
iptables -t mangle -A  OUTPUT -p icmp -j MARK –set-mark 0×1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
…….. dan seterusnya
iptables -t mangle -A OUTPUT -j MARK –set-mark 0×3
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

Popular posts from this blog

Prejudice and Privilege

Notes : It is not about Linux or other geeky stuff nor it is a political writing.  It was a day in the end of March 2007. I was just landed at the Franz Josef Strauss Munich Airport  around 10 AM in the morning. I had 5 days free time from my work in Astrium. At that time I was contracted by EADS Astrium  (now become Airbus Defense and Space) to work with them in Toulouse . I worked for one of their project. I flew from Toulouse where I worked to visit my brother family in Munich. Just after I picked up my luggage from the conveyor, three guys without uniform approaching me and asked me in English what i'm doing in Munich. I asked them if I did anything wrong. One of them told me that it was a random checked.     "Who are you guys? Sorry sir if it is a random check, why do you choose me instead of other?" I reply to their answer.  One of them said they're from the Munich immigration, and at the same time showing a gun behind his jacket. For my itinerary Munich was not

Asterisk 1.6.1 on openSUSE 11.1 (Part 2)

In this second part I will explain step-by-step configuration to use our appliance to build an Asterisk PABX server. Without further ado, here is the list: Install the Digium card on the PCI slot Install our appliance. You can also use any linux distribution, download asterisk from its website and install it. There are several softwares I forget when I made the appliance, it is not the mandatory (dependencies) but they are useful when we want to use asterisk optimally. They are: mpg123, sox, libmad, and festival. The easiest way to install it in openSUSE is using zypper. Check it first where they reside in repositories and add the repositories accordingly. mpg123 and sox are in the packman repositoriy, libmad in OBS (please check with webpin) and festival in oss. Then as root run: "zypper install mpg123 sox libmad0 festival". It is always useful to update your installation to update repository, to make sure that all the security update is up to date. Download the

In Search of Manohara

Notes: I always write note in my laptop and put it somewhere either on disk or cloud when I think there is an interesting experience. I found this 7 years old note when I try to clear some space in my disk, and before I wipe it out from my disk I think it is an interesting story to share with you. This happened in 2011, at that time I was working to build Linux based computer labs for 500 elementary and junior high schools in Yogyakarta Indonesia. No it is not about computer and other geeky stuff. So here it is.  Well, it is very out of topic everyone, you've already been warned 😁 During my busy weeks in implementing openSUSE Li-f-e for schools in Yogyakarta Indonesia (see the pictures below), me and one of my colleague use our free time in a Sunday afternoon to visit Borobudur , the biggest Buddhist temple in the world. One of the World Heritage preserve by Unesco. 85% of Indonesia population are Moslem and this make Indonesia the biggest Moslem country in the world. We