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:
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
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).
Untuk pengguna SuSEfirewall, buka file /etc/sysconfig/SuSEfirewall2 dan lengkapi bagian di bawah ini:
- 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
FW_DEV_EXT=’eth1′ ——> sesuaikan dengan eth ip publikKemudian mulailah menambahkan rule untuk PREROUTING chain pada tabel mangle:
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”
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:
- menandai traffic ICMP dengan FWMARK 0×1
- -j RETURN untuk trafik ICMP dimana ICMP tidak akan masuk ke rule lain dibawahnya
- menandai semua trafik TOS minimize delay sebagai FWMARK 0×1
- -j RETURN untuk trafik TOS minimize delay, dimana trafik TOS minimize delay tidak akan masuk ke rule lain dibawahnya
- menandai semua trafik TOS minimize cost sebagai FWMARK 0×5
- -j RETURN untuk trafik TOS minimize cost, dimana trafik TOS minimize cost tidak akan masuk ke rule lain dibawahnya
- menandai semua trafik TOS maximize throughput sebagai FWMARK 0×6
- -j RETURN untuk trafik TOS maximize throughput, dimana trafik TOS maximize throughput tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang berasal dari port SSH dengan FWMARK 0×1
- -j RETURN untuk trafik yang berasal dari port SSH dimana trafik yang berasal dari port SSH tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang menuju port SSH dengan FWMARK 0×1
- -j RETURN untuk trafik yang menuju port SSH dimana trafik yang menuju port SSH tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang memiliki SYN flag dengan FWMARK 0×1
- -j RETURN untuk trafik yang memilik SYN flag dimana trafik yang memiliki SYN flag tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang menuju port 587 dengan FWMARK 0×5
- -j RETURN untuk trafik yang menuju port 587 dimana trafik yang menuju port 587 tidak akan masuk ke rule lain dibawahnya
- menandai trafik yang menuju port 993 dengan FWMARK 0×5
- -j RETURN untuk trafik yang menuju port 993 dimana trafik yang menuju port 993 tidak akan masuk ke rule lain dibawahnya
- 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
Jalankan script yang saya berikan dan restart SuSEfirewall atau iptables, dan coba jalankan perintah :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
}
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
Post a Comment