Linux sunucu üzerinde bant genişliği limiti tanımlama

  • Konuyu başlatan Konuyu başlatan ANNE
  • Başlangıç tarihi Başlangıç tarihi

ANNE

Profesör
Cezalı
Katılım
5 Eylül 2009
Mesajlar
1,657
Reaksiyon puanı
75
Puanları
0
" tc ve iptables " ile Linux sunucu üzerinde bant genişliği limiti tanımlama

20091117222646.jpg


Epeydir sunucum üzerindeki bant limiti uygulamasını ağır aksak yürütüyordum. Ama kullandığım bant limiti politikaları pek içime sinmiyordu. http için apache sunucusu üzerinde mod_bw, ftp için ise proftpd içindeki bant limiti modülünü kullanıyordum.

Apache üzerinde bir değişiklik yapmak istediğimde apache sunucusunu tekrar yüklemem (reload) yada baştan başlatmam (restart) gerekiyor bu da istemciler yada apache üzerinde ya dengesizliğe yada kopmalara sebep oluyordu. cacti üzerinden sunucu istatistikleri aldığımda bu istatistiklerinde sağlıksız sonuç almama sebep oluyordu. Daha dinamik bir yol olmalıydı ama ne ?

Bu soru epey bir süredir beni rahatsız ediyordu. Bu arada internet üzerinde araştırma yaparken tc programına rastladım. Bu program ile yapılıyordu ama biraz göz gezdirdim ve her zamanki üşengeçliğim ile bir türlü başlayamadım. Fakat dün artık canım epey sıkıldı. Tamam bant limiti ayrı ayrı güzel çalışıyor ama bu iş sunucu bazında bir bant limiti sınırı değilde program bazında çalıştığından biraz verimsiz oluyordu.

Eski bant limiti politikasında diyelim 10 birim hattınız var. http için 8 birim, ftp içinde 2 birim limit uyguladınız. Ama bu durumda http 6 birim kullanırken ftp sunucunun 3 birime ihtiyacı olsada, ftp için 2 birim limit tanımlandığından ftp bu bant genişliğini kullanamıyor ve 1 birim boşta kalıyor. Yada tam tersi ftp hiç kullanılmazken http 10 birim kullanmak istese bile bu mümkün olmuyor. Bu yüzden bu gün nihayet tc ile bant sınırı uygulamaya karar verdim. Aşağıda bu düzenlediğim kuralları inceleyebilirsiniz.

eth0 için qdisc kurallar dizisini önce temizliyoruz sonra tekrar tanımlıyoruz.

tc qdisc del dev eth0 root handle 1:0 htb
tc qdisc add dev eth0 root handle 1:0 htb

Bu kısımda servisler için toplam bant genişliğini tanımlıyoruz

tc class add dev eth0 parent 1: classid 1:1 htb rate 200Mbit

Aşağıda farklı hızlarda 2 kural tanımlıyoruz. Bunlardan bir tanesi ftp diğeri http için

tc class add dev eth0 parent 1:1 classid 1:2 htb rate 150Mbit ceil 200Mbit
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 50Mbit ceil 200Mbit

Burada ise kuralların 10 saniyede bir denetlenmesi için kural tanımlıyoruz.

tc qdisc add dev eth0 parent 1:2 sfq perturb 10
tc qdisc add dev eth0 parent 1:3 sfq perturb 10

Aşağıdaki kural ise daha sonra iptables ile tanımlayacağımız mask değerlerine göre uygulanacak filtreleri tanımlıyoruz.

bant-genisligi.jpg


tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 2 fw flowid 1:2
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 3 fw flowid 1:3

Evet. tc kuralları tanımlandı. Şimdi sırada hangi paketlerin işleneceğini iptables ile tanımlamaya geldi.

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m tcp --sport 80 -j MARK --set-mark 2
iptables -t mangle -A POSTROUTING -o eth0 -m helper --helper "ftp" -j MARK --set-mark 3

Ve işlem tamamlandı. Artık sunucumuz 200 Mbit hız ile ftp ve http servislerine hizmet veriyor. ftp sunucumuz bunun 50 Mbit hızını kullanıyor. http ise 150 Mbit kısmını kullanıyor. Fakat ihtiyaç olması halinde her iki protokolde kullanılmayan kısmı kendi kullanım hızına ekleyebiliyor.

Bu kurallar zincirini bir adım daha ile götürüp iptables ile geoip tabanlı hız limit de uygulayabilirsiniz. Örneğin sadece ABD kullanıcılarında gelen isteklere hız limiti uygulamak için aşağıdaki kuralları da eklememiz gerekecek.

tc class add dev eth0 parent 1:1 classid 1:4 htb rate 50Mbit ceil 50Mbit
tc qdisc add dev eth0 parent 1:4 sfq perturb 10
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 4 fw flowid 1:4

Bu kısımda 1:4 şeklinde bir sınıf tanımlayıp bunun özelliğini 50Mbit olarak belirledik. Burada dikkat etmeniz gereken ceil parametresinden sonra da 50Mbit değeri vermemiz. Böylece bu kural uygulandığında hız 50Mbit üstüne boş bant genişliğimiz olsada çıkmaz.

iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m tcp --sport 80 -m geoip --dst-cc US -j MARK --set-mark 4

Daha sonra ise iptables yardımı ile hangi paketlerin 1:4 tarafından işleneceğini seçiyoruz. Buradaki püf nokta ise bu kuralın diğer 80 portuna uygulanan kuraldan sonra gelmesi gerekliliğidir.

Kaynak
 

maske

Doçent
Katılım
21 Kasım 2008
Mesajlar
511
Reaksiyon puanı
5
Puanları
0
ince bir konu, tesekkurler
 
Üst