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