BAND GENİŞLİĞİ YÖNETİMİ Hakan KUTUCU İzmir Yüksek Teknoloji Enstitüsü Matematik Bölümü [email protected] ÖZET Band Genişliği Yönetimi yerel bir ağda bulunan tüm istemci makinaların internet band genişliği sınırlarını belirleyen ve anlık internet kullanım miktarını ölçen bir programdır. Sistem veri tabanı ve ara yüz olarak iki ana bölümden oluşmaktadır. Bunun yanında sistemde entegre 3 adet modül bulunmaktadır. Veri tabanında sadece 1 tablo ve bu tabloda ağda bulunan tüm istemci makinalara ait kullanım politikaları tutulmaktadır. Ara yüzün oluşturulmasında Java programlama dili kullanılmıştır. Ara yüzle veri tabanı arasında JDBC köprüsü kullanılmaktadır. İlk modül C programlama dili ile posix threadleri kullanılarak yazıldı. Bu modül soket kullanarak Java RMI sunucusuna elde ettiği verileri göndermektedir. İkinci modül RMI teknolojisi kullanarak veritabanı, arayüz ve 1. modül arasında java sunucusu olarak çalışmaktadır. Üçüncü ve sonuncu modül ise Perl dili kullanılarak yazıldı. Bu modül veritabanından gerekli bilgileri alarak istmecilere band genişliğini vermektedir. ABSTRACT Bandwidth Management is a program that restricts the internet bandwidth of all clients at Local Area Networks (LAN) and measures their rates of usage of internet. Altough this project consists of two main parts: Database and Graphical User Interface (GUI), there exists 3 more modules embedded in the system. Database includes 1 table and this table includes policies belonging to all clients at LAN. Java programming language is used to construct GUI. JDBC Bridge exists between interface and database. Users access to data base by using interface, via this bridge. The first module of the project is written by using POSIX threads in C programming language. This module uses a socket in order to send the evaluated data to the Java RMI server. The second module works as a Java server between GUI, database and first module by using RMI technology. The last module is written by using Perl. This module grants bandwidth to clients by taking necessary information into consideration from database. Anahtar Kelimeler: HTB(Hierarchical Token Bucket), TC(Trafic Control), RMI(Remote Machine Invocation) 1. GİRİŞ İnternet'in, her firmanın ve kurumun can damarı olduğu günümüzde, bir çok firma ve kurum, tüm kullanıcılarına internet hizmeti sağlamaktadır. Fakat birçok alanda araştırma ve iş amaçlı kullanılan internet, kullanıcıların yanlış kullanımlarına da maruz kalmaktadır. Bu gibi durumlarda da elektronik posta alışverişlerinde problemler yaşanmakta, gerekli sitelerde sörf hızı düşmekte ve iş, zaman, para kayıpları söz konusu olmaktadır. Çözüm ise internet trafiğini kontrol altına almak ve kullanıcıların internet band genişliğini kısıtlamaktır. Bu kısıtlamayı yapan bazı donanımsal cözümler mevcuttur. Bunların başında CISCO, 3Com, DLINK, NORTEL, ALLOT gibi üreticiler gelmektedir. Bu çalışmada bir çok modül birleştirilerek yerel ağa bağlı istemcilerin internet trafiklerini kontrol altına alınmıştır. Projede kullanılan programlar Java, C ve Perl ile yazılmıştır. Linux (Slackware 8.1) işletim sistemi kurulu ağ geçidi (gateway) olarak kullanılan bir sunucu üzerinde çalıştırıldı. Aynı zamanda trafik kontrol mekanızması olarak linux kernel 2.4.18 ve sonrasının desteklediği “htb” kuyruklama disiplini ile tc aracı kullanılmıştır. “tc” ve kuyruklama disiplinleri ileride açıklanacaktır. 2. Neden Bu Proje? İzmir Yüksek Teknoloji Enstitüsünde, internet band genişliği 8 Mbps dir. Yaklaşık 500 bilgisayar gün boyu internete bağlanmakta ve bu da kullanıcı başına elde edilebilir ortalama 16 Kbps’lık bir band genişliği vermektedir. Kampüsteki kullanıcılar interneti farklı amaçlar için kullanmaktadırlar. Dosya transferi, internette sörf, bilimsel araştırma, elektronik posta trafiği, internette sohbet (chat) bunların belli başlı olanlarıdır. Bunlardan özellikle dosya transferi (mpeg,divx,mp3, vb...) band genişliğini fazlasıyla sömürmektedir. Bu da bir kullanıcının herhangi bir araştırma yapmak istemesi durumunda internette aradığı makalelere geç ulaşmasına neden olmaktadır. Şekil 1’deki istatistik UlakNet Ana yönlendiriciler üzerindeki ATM arayüzlerinden alınmıştır. Yeşil renk UlakNet'ten kullanıcıya doğru giden trafiği gösterir. Mavi renk ise kullanıcıdan UlakNet'e doğru giden trafiği göstermektedir. Burada görüldüğü üzere 8 Mbps lik band genişliği zaman zaman zorlanmıştır. Band genişliğinin yetmediği yerlerde uygulanabilecek en kolay çözüm band genişliğinin artırılmasıdır. Fakat bu geçici bir çözüm olacaktır. Band genişliği ne kadar arttırılırsa arttırılsın hemen hemen hepsinin kullanıldığını ve bunun sonunun olmadığı görülecektir. Sonuç olarak bu çözüm şirkete ya da kuruma pahalıya mal olacaktır. Token Bucket Filter (TBF) Hierarchical Token Bucket (HTB) Class Based Queue (CBQ) First in First Out (FIFO) Random Early Detection (RED) Stochastic Fairness Queuing (SFQ) Bunlardan günümüzde en çok kullanılanları CBQ ve HTB dir. En genel filtre u32 dir, bu bize ANY header'a dayalı trafiği seçebilmemize izin verir. 3.2 Kuyruklama Nedir? Kuyruklama ile gönderilen verinin sırası belirlenir. Burada bilinmesi gereken önemli nokta sadece transfer edilecek verinin kontrol edilebilmesidir. İnternet bu yolla çalışır. Bize paket gönderen insanları doğrudan kontrol edemeyiz. Şöyle basit bir örnek verelim. Evlerimizdeki posta kutusu (fiziksel olan) düşünülürse gönderilen postaların adedini belirlemek ya da onları kısıtlamak elinizde değildir. İnternet çoğunlukla, içerisinde bize yardımcı olacak birkaç özelliğe sahip olan TCP/IP tabanlıdır [1]. TCP/IP iki host arasındaki hat kapasitesini bilemez. Bu yüzden paket gönderecek olan host gönderebildiği kadar hızlı gönderir ve daha sonra paketler kaybolmaya başladığı zaman yavaşlar. [İnternet]---<E3,ADSL,v.b.>---[Linux Ağ Geçidi]--[Yerel Ağ] eth1 Tüm bu nedenlerden dolayı kullanıcıların interneti efektif kullanmalarını sağlamak, kullanıcı bazlı politikalar üretip kullandıkları servislere ve önceliklere (priority) göre onlara bir band genişliği verebilmek için bu proje seçilmiştir. 3. Proje Öncesi 3.1 Band Genişliği Yönetimi için Sınıf Tabanlı Kuyruk Oluşturma Kullanımı Trafik kontrolü için iki temel birim vardır. Bunlar filtreleme ve kuyruklamadır. Filtreler trafiği kuyruğa yerleştirirler, bu kuyruklar trafiği toplayıp hangisinin önce, hangisinin sonra gönderileceğine ya da paketin gönderilmeyip kesileceğine (drop) karar verirler. Linux'un desteklediği bir çok kuyruklama disiplini vardır. Bunlardan bazıları sınıf tabanlı bazıları ise sınıf tabanlı olmayan kuyruklama disiplinleridir. Aşağıda bunlara örnek bir kaç kuyruklama çeşidi verilmiştir [8]. eth0 Yukarıdaki şemada ağ geçidi olarak kullanılan Linux sunucu eth0 ve eth1 adında iki adet ağ arabirimine sahiptir. eth1 fiber kanala paket koyar ve fiber kanala paket gönderir, eth0 ise alt ağa bağlı olup kullanıcıların paketlerini ele alır. Daha önceden de bahsedildiği gibi sadece gönderilecek veri kontrol edilebildiğinden dolayı iki ayrı benzer kurallar kümesine ihtiyaç olacaktır. eth0 üzerindeki kuyruğu modifiye ederek ağda bulunan istemcilere paketlerin hangi hızda gönderildiği hesaplanır ve bu da bize onlar için elde edilebilir indirim (downstream) band genişliğini verir. Kısaca istemcilerin indirme hızını (download speed) verir. eth1 üzerinde ise internete gönderilen verinin hangi hızda olduğunu belirlenir. Bu da bize “upload” hızını verir. 3.3 HTB (Hierarchical Token Bucket) HTB Martin Devera tarafından yazılmıştır. CBQ’dan daha basit parametler kümesine sahiptir. Konfigürasyonu kullanıcıyı sınırlamaz ve zorlamaz. HTB verilen bir hat üzerindeki giden trafiğin kontrolünü sağlar. Fiziksel bir hattın birçok daha yavaş hatmış gibi görünmesine (simulated link) ve farklı trafiklerin bu hatlardan gönderilmesine izin verir. Her iki durumda da fiziksel hattın nasıl simulated hatlara bölüneceğine ve verilen bir paketin gönderilmesi için kullanılacak olan simulated hattın hangisi olması gerektiğine karar verileceği belirlenmek zorundadır. HTB her sınıfa verilmiş olan servis kaynaklarının minimumunun verildiğinden emin olur. Eğer bir sınıf atanmış kaynaklardan daha azını kullanıyorsa ya da hiç birini kullanmıyorsa kalan band genişliği diğer sınıflar tarafından paylaşılır. Buna ödünç alma (borrowing) diyoruz. 3.4 Hiyerarşik Ağaç İnternet trafiği şekillendirilmek isteniyorsa önce trafik ağacı iyice şekillendirilmelidir. Ağacın gövdesi maksimum band genişliğini temsil eder. Sınıf (class) adı verilen her dal babasının (parent) kullanılabilir band genişliğinin bir kısmını kullanır. match ip src x.x.x.x/x : kaynak ip bu gruptan olursa match ip dest x.x.x.x/x : hedef ip bu gruptan olursa match ip sport xx : kaynak port bu porttan olursa match ip dport xx : hedef port bu porttan olursa şeklinde anahtarlar kullanılabilir. İsteğe ve ihtiyaca bağlı olarak kombinasyonların da kullanılması mümkündür. Aşağıdaki filtre örneği 1 numaralı ağ kartına gelen, kaynak ip adresi 192.168.10.10 olan paketleri 10 numaralı sınıfa yönlendirir. Yani yerel ağımızda bulunan ip adresi 192.168.10.10 olan istemci makinaya 10 numaralı sınıfta tanımlanan kuyruklama disiplinini uygular. tc filter add dev eth1 protocol ip parent 1:0 u32 match ip src 192.168.10.10 flowid 1:10 3.6 Örnek Bir Uygulama Aşağıdaki uygulama HTB kullanılarak yapılan basit bir trafik kontrol mekanızmasıdır. Öncelikle 256 Kbit lik bir internet çıkışının var olduğu varsayılmıştır. # tc qdisc add dev eth0 root handle 1: htb default 30 # tc class add dev eth0 parent 1: classid 1:1 htb rate 256Kbit burst 15K Buraya kadar 256 Kbit lik bir band alanı tanımlaması yapıldı. Servisler bazında sınırlamalar yapılmak istenirse örneğin; web erişimi için bu bandın 150 Kbit’i, ftp için ise 50 Kbit’i geriye kalan band aralığını ise diğer servislerin kullanması için şu şekilde konfigürasyon yapılır: Şekil 2’deki örnek yapılandırmada toplam 5 adet dal vardır. Fakat band genişliği yönetimleri uç dallarda yapılmaktadır. Eğer tüm sınıflarda yeterince trafik varsa sınıf 11 ve 12 %30, sınıf 2 ve 3 te %20 lik bir band genişliği alır. Eğer sınıf 2 de herhangi bir trafik yok ise sınıf 11 ile 12 %37,5, sınıf 3 te %25 lik bir band genişliği alır. Eğer sınıf 11 de bir trafik yok ise sınıf 12 %60, sınıf 2 ile 3 te %20 lik bir band genişliği alacaktır. Eğer sınıf 2 ve 3 de trafik yok ise sınıf 11 ve 12 %50 lik bir band genişliği alacaktır. Herhangi bir sınıfta trafik varsa o sınıfa atanan band genişliği miktarı garantilenmiştir. Bunun yanında diğer sınıflardan borç almalarda olabilir. 3.5 Filtreleme Filtreler sınıfların hangi paketleri değerlendirileceğinin belirlendiği bilgilerdir. U32 filtresi uygulamalarda en sık kullanılan filtredir. U32 paketleri başlığına (header) bakarak sınıflara ayırabilir [8]. Temelde tüm filtreler içinde ; # tc class add dev eth0 parent 1: classid 1:10 htb rate 150Kbit ceil 256Kbit burst 15K # tc class add dev eth0 parent 1: classid 1:20 htb rate 50Kbit ceil 256Kbit burst 15K # tc class add dev eth0 parent 1: classid 1:30 htb rate 56Kbit ceil 256Kbit burst 15K Yukarıda oluşturulan sınıflar tek başlarına bir anlam ifade etmezler. Bunun için oluşturulan bu sınıfları servislere eşlemek için filtrelerin oluşturulması gerekmektedir. # tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 80 0xffff flowid 1:10 # tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 21 0xffff flowid 1:20 Bu tanımlamalarla 1:10 sınıfının www (80) 1:20 sınıfının ise ftp (21) tarafından kullanacağı belirlenmiştir. Görüldüğü üzere sınıfın neyi işleyeceğini belirlemek için filtre kavramı kullanılmaktadır. Filtreler sınıf kurallarının neye uygulanacağının belirlendiği bilgilerdir. Sonuç olarak 256 Kbit’lik bir band genişliğinin 150 Kbit’liği web için, 50 Kbit’liği ise ftp için ayrılmıştır. Bunun dışındaki gelişen tüm trafik (smtp,chat vb..) ise geriye kalan 56 Kbit’lik bir alandan akacaktır. Tabii bu durum diğer tüm servisler dolu olduğunda böyle olacaktır. Bir servis boş kaldığında diğer servisler öbür servislerden borç band alabileceklerdir. Trafik kontrolünde IP bazlı çok daha geniş filtreler de uygulamak mümkündür. gerçekleşmektedir, böylelikle Java dilinin özellikleri ve avantajları dağıtık programlamada da kullanılabilmiş olmaktadır. Java RMI ağ işlem (networking) için kullanıcıya soket veya stream'lere göre daha üst düzeyde bir arayüz sunmaktadır. Bu nedenle, RMI ile dağıtık programlama yapmak soket ve stream kullanımına göre daha az karmaşıktır. Programcı açısından bakıldığında, RMI kullanıldığında istemci/sunucu uygulamaların geliştirilmesi sırasında ağ işlem ayrıntıları ile uğraşmak gerekmemektedir. 4. RMI (Remote Machine Invocation) [7] İnternet ve Network teknolojilerinin sürekli artan popülaritesi ve kullanım alanları, daha az çaba ile daha güçlü olan dağıtılmış uygulama geliştirmeye olan talebi artırmıştır. Bunun sonucunda birçok dağıtılmış uygulama geliştirme teknolojileri ortaya çıkmıştır. Bu dağıtılmış uygulama teknolojilerinin belli başlıcaları; Soketler, RPC (Remote Procedure Call), Corba (Common Object Request Broker Architecture), DCOM (Distributed Component Object Model), SOAP (Simple Object Access Protocol), RMI (Remote Machine Invocation). 4.1 Java RMI Nedir? RMI salt Java nesne modelini tüm ağa yayan yeni bir dağıtık teknolojidir. Bir JVM (Java Virtual Machine)’deki nesnelerin başka bir JVM’deki nesnelerin metodlarını çağırmalarına imkan verir. Tipik bir RMI uygulaması istemci ve sunucu olmak üzere iki ayrı programdan oluşur. RMI, sunucu ve istemciler arasında davranış (behaviour) taşımaya izin verdiğinden alanında tektir. Java RMI, internet üzerinde farklı yerlerde bulunan ve TCP/IP ile bağlantısı sağlanmış sanal Java makinaları üzerindeki Java nesnelerinin, normal metot çağrımları kullanarak iletişimde bulunabilmesi için gerekli olan katmanları içermektedir. Şekil-3'te 1. Java sanal makinesi (JVM-1) üzerinde bulunan bir Java uygulamasının (veya Java applet'inin) 2. Java Sanal Makinası (JVM-2) üzerinde bulunan RemoteObject isimli bir nesnenin Remote_Method() isimli bir metodunu çağrımı görülmektedir. Java RMI kullanıldığında istemci ve sunucu da Java ile yazılacağı için dağıtık programlama tümüyle Java dilinde 4.2 Java RMI Mimarisi Java RMI mimarisi üç katmandan oluşmaktadır. Bunlar; 1. 2. 3. Koçan (Stub) & İskelet (Skeleton) Katmanı Uzak Referans (Remote Reference) katmanı İletim (Transport) Katmanı Şekil-4'ten de görüldüğü gibi uzakta bulunan bir Java nesnesinin metodlarını çağıran bir istemci ilk önce kendi tarafında bulunan "koçan" kod ile iletişime geçer. "Koçan" kod, isteği "Uzak Referans" katmanına, bu katman da "İletim" katmanına geçirir. Daha sonra, karşı taraftaki bilgisayarda istek önce "Uzak Referans" oradan da "iskelet" koda iletilerek istenen servise ulaşılır. Servisin sonuçları da aynı biçimde istemciye iletilmektedir. 4.2.1 Koçan & İskelet Katmanı İstemci, uzakta bulunan bir nesnenin metodlarını çağırmaya başladığı anda ilk olarak "koçan" kod ile iletişime geçecektir. İstemcinin uzaktaki nesne ile ilgili olarak elinde bulunan referans aslında yerel "koçan" koda olan referanstır. Karşı tarafta bulunan "iskelet" kod ise uzak nesnenin istenen metodunun gerçekleştiriminin çağrılması ve sonuçların elde edilmesinden sorumludur. Bir RMI çağrımında gerçekleşen olayların adımları ve bu adımlar içerisinde koçan ve iskelet kodların görevleri aşağıda verilmiştir. a) Koçan kodu, “object serialization” (nesnelerin byte stream'leri biçimine dönüştürülüp aktarılması) tekniği kullanarak çağrımı parametreleriyle birlikte paketler. b) Koçan kodu, isteğin uzak nesneye gönderimini yapar. Bu istek "uzak referans" ve "iletim" katmanları yolu ile karşı tarafa aktarılır. Karşı taraftaki "iletim" ve "uzak referans" katmanları ile de iskelet koda ulaşır. c) Karşı taraftaki iskelet kodu gelen paketi açar, parametreleri çıkarır ve uzak nesnenin istenen metodunun gerçekleştirimini çağırır. Bu katmanın görevlerinden birisi koçan kodundan gelen çağrımları aktarım katmanı biçimlerine dönüştürmek veya aktarım katmanından gelen istekleri iskelet kodunun anlayacağı biçime dönüştürmektir. Bu katmanın diğer bir görevi uzak referans protokollerini (remote reference protocols) gerçekleştirmektir. Bu protokoller, uçtan uca (point to point) veya tekrarlı (replicated) nesnelere çağrım protokolleri olabilir. 4.2.3. İletim Katmanı d) İskelet kod sunucudaki nesneden gerçekleştirimin sonucunu alır. e) İskelet kod sonucu paketleyerek, isteğin geldiği yoldan benzer biçimde karşı tarafa gönderir. f) Sonuçlar koçan koda gelir. Koçan kodu, sonuçların paketini açar ve sonuçları istemciye geçirir. "Koçan & İskelet" katmanının diğer bir özelliği de, yazılan programların platform bağımsız olmasını sağlamasıdır. Bu katman kullanıcıyı uzak nesnenin gerçekleştirim ayrıntılarını veya aktarım katmanı ayrıntılarını bilme zorunluluğunu ortadan kaldıran bir soyutlama sağlamaktadır. 4.2.2 Uzak Referans Katmanı Bu katman temel olarak programcının yazdığı kodlar ve bilgisayar ağı iletişimi arasında bir köprü görevi yapmaktadır. Bu katman bağlantının sağlanması, bakımı, kapatılması gibi işlerden sorumludur. İletişimin sağlanmasında Java soketleri kullanılmaktadır. JDK1.1 sürümünde, aktarım protokolü olarak TCP (Transmission Control Protocol) kullanılmaktadır. RMI mimarisinde her katman birbirinden bağımsız olduğu için aktarım protokolü değiştirmek örneğin; UDP (User Datagram Protocol) protokolünü programcıların kullanımına sunmak olasıdır. 4.3 Java RMI’ın Yararları Kullanım Kolaylığı : RMI kullanımı kolaydır ve Java nesnelerini ağ üzerinde yaymak için basit bir modeldir. Kod ve Veri Taşıma : RMI uzak nesne çağrılarında nesnelerin bütünlüğünün bozulmadan iletilmesine tam destek sağlar. Yeni Dağıtık Uygulama Çeşitleri : RMI’ın kullanım kolaylığı ve sanal makineler arası davranış taşımaya olanak vermesi yeni tür taşınabilir dağıtık uygulamalar geliştirmeye olanak verir. Güvenli , Taşınabilir Uygulamalar : RMI Java çalışma zamanı güvenliğini korur ve kullanıcılara güvenli ve taşınabilir uygulamalar geliştirme olanağı verir. Platform Kolaylığı : Java platformunun çekirdeği olarak RMI, platformun olduğu heryerdedir. Bu, salt java dağıtık uygulamalarının bir defa yazılıp her yerde çalıştırılabilmesine olanak verir. belirleme modülü ise sadece verileri okumaktadır. Band Genişliği Yönetimi Programı Yapısı Servis kullanımlarını belirlemek için Snort adlı program kullanıldı. Snort’ta belli başlı 5 adet servis için kurallar yazıldı. Bu kurallar; Servis 1: Yasaklı web sayfaları için alert tcp any any->any any (content lists:”rule1.txt”;msg:”rule1”;) Servis 2: HTTP&FTP alert tcp any any ->any 80 (msg:”rule2”;) Servis 3: POP3&SMTP alert tcp any any-> any 110 (msg:”rule3”;) Servis 4: pdf,gs,zip,rar formatındaki dosya transferleri alert tcp any any ->any any (contentlist:”rule4.txt”;msg:”rule4”;) Servis5: divx,mpeg,mov formatındaki dosya transferleri alert tcp any any ->any any (contentlist:”rule5.txt”;msg:”rule5”;) Proje birçok birimden oluşmaktadır; 1. 2. 3. 4. 5. Kullanıcı bilgilerini tutan bir veritabanı (MySql kullanıldı). Kullanıcıların hangi servisleri kullandığı (Snort ile bulundu). Kullanıların “download&upload” hızlarının hesaplanması (C kodu ile yapıldı) [2], [3]. Band genişliği sınırlaması getiren karar verme mekanızması (Perl ile yapıldı) [4]. Ağ yöneticisinin kullanacağı bir arayüz (GUI java ile yapıldı) [5], [6]. Şekil 5’de şekilde görüldüğü üzere tüm bilgisayarlar Linux ağ geçidine bağlıdır ve bu ağ geçidinden internete çıkmaktadırlar. Band genişliği yönetimi programı da bu ağ geçidinde çalışmaktadır ve veri akış şeması Şekil 6 da görülmektedir. 5.1 Veri Tabanı Yapısı Linux işletim sisteminde kullanılan Mysql veritabanı kullanılmıştır. Tüm veriler tek bir tabloda tutulmaktadır. Veritabanına erişim JDBC (Java Database Connectivity) köprüsü ile yapılmaktadır. Alanlar Özelliği uid : ip : up_min up_max down_min down_max prio serv1 serv2 serv3 serv4 serv5 changed birincil anahtar Kullanıcı IP adresi garantilenmiş Upload Hızı maximum upload hızı garantilenmiş download hızı maximum download hızı kullanıcı önceliği (1-5) Servis 1 kullanımı, 1 ise kullanımda 0 ise değil Servis 2 kullanımı, 1 ise kullanımda 0 ise değil Servis 3 kullanımı, 1 ise kullanımda 0 ise değil Servis 4 kullanımı, 1 ise kullanımda 0 ise değil Servis 5 kullanımı, 1 ise kullanımda 0 ise değil Kullanıcının bilgileri güncellendi mi? Tablo 1: Veritabanı Yapısı Bu veri tabanı Java RMI sunucu modülü, servis kullanımı tarama modülü ve band genişliği belirleme modülü tarafından ortaklaşa kullanılmaktadır. Bunlardan Java RMI sunucu modülü ve servis kullanımı tarama modülü veritabanına veri yazmakta, band genişliği Veritabanında kullanılan tablo yapısı Tablo 1 de verilmiştir. 5.2 Servis Kullanımı Tarama Modülü rule1, rule4 ve rule5 metin dosyalarından aldığı kelimelere göre çalışır. Rule2 ve rule3 en sık kullanılan portları izler. Bu kurallara göre Snort tüm ağı inceler ve kurallara göre alarm verir. Bu alarmlar bir log dosyasına kayıt edilir. Aşağıdaki örnek bize 192.168.10.10 IP adresli bir istemcinin Servis 3 yani POP ve SMTP servislerini kullandığını alarm ediyor. [**] [1:0:0] rule3 [**] [Priority: 0] 05/27-14:25:39.705667 192.168.10.10:1150 -> 199.237.72.126:80 TCP TTL:128 TOS:0x0 ID:3903 IpLen:20 DgmLen:40 DF ***A**** Seq: 0x89F2C9A9 Ack: 0xA3E619B1 Win: 0x42C8 TcpLen: 20 Log dosyasında bunun gibi yüzlerce alarm mevcut. Bu log dosyasını Perl ile yazılan ve her 2 saniyede bir devreye giren bir modül kontrol etmektedir. İstemci bilgisini ve kullandığı servisi belirleyip bunu veritabanına güncellemektedir. Şekil 7’de modülün akış şeması verilmiştir. 5.3 Hız Belirleme Modülü Bu modül C programı ile yapıldı. Burda üç adet “thread” kullanılmıştır. Şekil 8’de “thread”lerin kotardığı işler ve aralarındaki ilişki görülmektedir. Birinci “thread” “producer”; “producer” ağ geçidine gelen tüm internet çıkış ve giriş paketleri bilgilerini (ip numarasi, upload mı download mı yaptıgını, paket büyüklüğünü) “fifo”ya yaziyor. İkinci “thread” “fifo” dan “buffer” alıp bu paketlerden aynı makinaya ait olanların paket büyüklüklerini bir “array” de toplamaktadır. 3. “thread” ise 2 saniye uyuyup “array”de tutulan paket büyüklüklerini 2’ye bölerek (saniyede iletilen paket büyüklüğünü belirlemek için) açılan bir soket aracılığı ile java sunucusuna gönderiyor. Java istemci programı RMI teknoloji ile bilgileri java sunucu programından alıp GUI de ilgili yere yazılıyor. 5.4 Band Genişliği Atama modülü Bu modül Perl kullanılarak yapıldı. Her 2 saniyede bir veritabanındaki değişiklik kontrol edilmektedir. Veritabanından değişen kayıtların parametreleri alınarak projenin başında bahsedilen Hierarchy Token Bucket kuyruklama disiplini kullanılarak tc (traffic control) mekanizması ile band genişliği atama işlemi sağlanıyor. Tc mekanizmasının hangi seviyede çalıştığı Şekil 9’da görülmektedir. 5.5 Java RMI Sunucusu ve GUI (Kullanıcı Arayüzü) Kullanıcı arayüzü oluşturmak için iki adet program yazıldı. Bunlar sunucu ve istemci modellidir. Sunucu veritabanınından kullanıcılara atanan band genişlikleri, öncelik bilgisi, kullandığı servisler gibi bilgileri alır ve istemciye gönderir. Bunu RMI teknolojisi ile kotarmaktadır. Ağ yöneticisi herhangi bir kullanıcının upload ve download band genişliklerini bu arayüzden belirleyebilmektedir. Aynı zamanda bir kullanıcıya öncelik (priority) verilerek boş kalan band genişliği kaynaklarından daha fazla yararlanması sağlanmaktadır. Yüksek öncelik numarasına sahip bir internet kullanıcısı boş kalan kaynaklardan daha fazla yararlanacaktır. Şekil 10-11-12-13-14 te ağ yöneticisinin bu program için kullanacağı arabirimi Şekil 15-16 ve 17 de sunucu üzerinde çalışan modüllerin ekran görüntüleri görülmektedir. 6.SONUÇ Band genişliği yönetimi projesi amacına ulaşmış bir projedir. Önümüzdeki aylarda kampüsteki internet trafiğini band genişliği seviyesinde yönetmek için kullanıma geçmesi düşünülmektedir. Linux işletim sisteminin performansi ve güvenliği bu projede kullanılmıştır. Veritabanı yönetimi ve kullanımından kaynaklanan hiç bir sorun yaşanmamıştır. Tüm modüller hatasız çalışmaktadır. Proje ayrı bir alt ağ oluşturularak üzerinde denenmiştir. Band genişliği yönetimi programı çalıştırılmadan önce internet kullanımı kontrolsüz olmakta istemcilerde download accelerator türü programlar kullanılarak en üst sınırlarda dosya indirimi yapılmaktaydı. Band genişliği yönetiminden sonra istemcilerin interneti kullanma yoğunluğu efektif hale getirilmiştir. KAYNAKLAR DİZİNİ [1] Andrew S. Tanenbaum, 1996, Computer Networks, Prentice Hall Inc., New Jersey, 814p. [2] Harvey M. and Paul J. Deitel, 2003, C How To Program, Prentice Hall Inc., New Jersey, 1312p. [3] Beej's Guide to Network Programming, Using Internet Sockets Brian “Beej” Hall,1995, 49p [4] Harvey M. and Paul J. Deitel, 2001, Perl How To Program, Prentice Hall Inc., New Jersey, 1057p. [5] Harvey M. and Paul J. Deitel, 1999, Java How To Program, Prentice Hall Inc., New Jersey, 1355p. [6] Schildt, H., 2001, Java 2 (Çev. T. Akbaş), Alfa Basım Yayım Dağıtım Ltd. Şti., 975-316-866-7, İstanbul, 810s. [7] Sunucu Yazılım Teknolojileri, Yrd. Doç. Dr. R. Cenk Erdur, Ege Üniversitesi Bilgisayar Mühendisliği [8] Linux Advanced Routing& Traffik Control. http://lartc.org