Network Monitoring Kavramı ve Monitorix Uygulaması

Monitoring kavramı bir sistemdeki darboğazları(sıkışıklık), veri tüketimini, sistemin yükünü, sistemde oluşan hataları, sistemin kötüye kullanımını, varsa sisteme yapılan saldırıları vb birçok işlemi görüp-gözetleme ve nihayetinde bununla ilgili gerekli operasyonları yerine getirme işlemidir. Yani kısaca performans takibidir. Monitoring işlemi sorun tespiti, önlemi ve çözümü açısından hayati önem arz eden bir konudur. Öyleki monitoring işleminin yapılmadığı sistemlerde hatayı tespit etmek ve sebeplerine dair fikir edinmek oldukça güçtür. Örneğin ağdaki tıkanıklığın bir sebebi monitoring işleminin düzenli yapıldığı ve kayıt altına alındığı bir sistemde kolayca anlaşılabilinirken monitoring işleminin yapılmadığı bir sistemde oldukça güçtür. Çünkü ilgili sıkıntının donanım kaynaklı, sistem kaynaklı, kullanıcı kaynaklı veya saldırı sonucu oluştuğu hakkında bir sonuca varmak çok fazla zaman alabilir. Net bir fikir edinmek için bütün bu parametreleri teker teker kontrol etmek gerekir.

Monitoring kavramı çok geniş bir kavram olmasının yanı sıra temelde CPU, Bellek (Memory), Giriş-Çıkış (I/O) ve Network gibi alt dallara ayrılır. Bu alt dallar birbiriyle alakalıdır. Herhangi birinde olan bir sıkıntı diğer sistem-(ler)-in çalışmasını engelleyebilir. Örneğin büyük miktarlardaki I/O işlemi belleği tüketebilir, ethernet üzerinden yapılan yüksek trafik çok fazla CPU tüketebilir, belleğe çok fazla miktarda yazma işlemi CPU’yu ve I/O kanallarını tüketebilir.Monitoring konusunda en zor olan kısım “network monitoring” kısmıdır. Bunun nedeni ağın soyut olmasıdır. Sistemin kontrolünün yanında ağda yaşanan gecikme, çarpışmalar, tıkanıklık, paket bozulması gibi birçok faktör daha vardır.

Herhangi bir sistemi monitor etmek için o sistemin çalışma prensiplerini analiz etmeliyiz. Genel olarak bir I/O (Giriş Çıkış)’ a bağlı uygulamalar bellek ve depolama sistemini tüketir. Bunun nedeni I/O işlemlerinin verilerinin büyük kısmı bellek üzerinde olmasındandır. Eğer depolama sistemi ağ üzerinde değiilse ağ performansını etkilemez. CPU’yu ise genelde istekler için kullanır ve daha sonra uykuya geçer. Veri tabanı uygulamaları I/O uygulamalarına güzel bir örnektir. CPU’ya bağlı uygulamalar ise CPU’yu yoğun şekilde kullanır. Web sunucuları, posta sunucuları, matematiksel işlem yapan uygulamalar bu sınıfa girer.

Linux Network Monitoring Araçları

Linux sistemleri hali hazırda birçok monitoring araçları ile kurulu gelir. Kurulu olmayan bir çoğu da ilgili dağıtımın depolarından inidirilip kurulabilir. Çok fazla açık kaynak kodlu ve third-party monitoring uygulama var olmasına rağmen ben burada bazılarının sadece ismini verip daha çok monitorix adlı uygulama hakkında bilgi vereceğim.

Nload, iftop, iptraf, tcptrack, vnstat, speedometer, trafshow, netload linuxta kullanılan network monitorng araçlarından bazılarıdır. Bunlarla ve daha fazlasıyla ilgili bilgilere linuxa ait belgelerden ulaşılabilir.

MONİTORİX ARACI

Linuxta sistem ve ağ kaynaklarını izlemek için tasarlanmış, açık kaynak kodlu, özgür, güçlü ve hafif bir araçtır. Düzenli olarak sistem ve ağ verilerini toplar ve bilgileri kendi web arayüzünü kullanarak grafikler halinde görüntüler.Başlangıçta Unix/Linux sunucuları altında çalışmak için geliştirilse de hafifliği sebebiyle gömülü sistemlerde dahi kullanılabilir. Monitorix genel sistem performansını izlemeye, darboğazları, arızaları, istenmeyen uzun cevap sürelerini ve diğer anormal etkinliklerin tespit edilmesine yardımcı olur. Perl dili ile yazılmıs ve FSP tarafından yayımlanan GNU kamu lisansıyla lisanslanmıştır. Grafikler üretmek ve web arabirimini kullanarak bunları görüntülemek için RRDtool aracını kullanır.

Monitorix temelde 2 programdan oluşur. Monitorix isimli bir toplayıcı ve monitorix.cgi isimli bir CGI betiği. Monitorix 3.0 ve sonrası kendi HTTP sunucusunu içerdiğinden kullanıcı bir web sunucusu yüklemek zorunda değildir.

ÖZELLİKLERİ

1– Sistem yük ortalaması, çalışan süreçler, işlemci başına çekirdek kullanımı, genel çekirdek kullanımı ve bellek tahisisi.
2-Disk sürücülerinin sıcaklığını ve çalışıp çalışmadığını izler.
3-Dosya sistemi kullanımı ve dosya sistemlerinin I/O aktivitilerini izleme.
4-10 network cihazına kadar network trafiğini izleme
5-Ssh ,ftp, Vsftpd, ProFtp, Smtp, Pop3, Imap, mail virüsü ve spam gibi sistem servislerini içerir.
6-Mail istatistikleri
7-Network Port trafiği. TCP, UDP gibi
8-FTP sunucularının log dosya formatlarına göre FTP istatistiği.
9-Local ve uzak sunucuların apache istatistikleri
10– Local ve uzak sunucuların mysql istatistikleri
11-Squid proxy web önbellek istatistikleri
12-Uzak sunucuları izleme
13-İstatistikleri grafikler halinde veya metin tabloları şeklinde, günlük , haftalık, aylık veya yıllık tutma.
14-Dahili http sunucusu.

Kurulumu

Monitorix Redhat, Centos, Fedora tabanlı sistemler için geliştirilmiş olsa da bugün birçok farklı dağıtımı desteklemektedir. Ben burada debian tabanlı Pardus 17.1 sürümü için kurulumunu anlatacağım. Öncelikle /etc/apt/sources.list dosyasına monitorixi indireceğimiz depoyu ekliyoruz.Bunun için komut satırından aşağıdaki komutu çağırıyoruz.

sudo nano /etc/apt/sources.list

gerekli root parolasını girdikten sonra açılan sayfanın en altına aşağıdaki satırı ekleyip kaydediyoruz.

deb http://apt.izzysoft.de/ubuntu generic universe

Depoyu ekledikten sonra PGP anahtarını indirip sisteme yükleyeceğiz.

sudo apt-get -y install wget
cd /tmp
wget http://apt.izzysoft.de/izzysoft.asc

şimdi de .asc dosyasını kaydettiğimiz dizine (tmp) gidip aşağıdaki komutu yazıyoruz.

sudo apt-key add izzysoft.asc

OK uyarısını aldıktan sonra sistem güncelleme işlemini yapıyoruz.

sudo apt-get update

Güncelleme işlemi sırasında

E: Yöntem sürücüsü /usr/lib/apt/methods/https bulunamadı.
N: apt-transport-https paketi kurulu mu?

Şeklinde bir hata alırsak

sudo apt-get install apt-transport-https komutunu yürütüp tekrar update komutunu çalıştırıyoruz. Eğer bir hata almadıysak devam ediyoruz.

Kurulum işleminden sonra bir iki ayar yapmamız gerekecek.

sudo nano /etc/monitorix/monitorix.conf

komutunu verip açılan dosyada aşağıdaki kısmı bulup “enabled=n “ kısmını “enabled=y” yapıp kaydedip çıkıyoruz.

enabled = n
msg = Monitorix: Restricted access
htpasswd = /var/lib/monitorix/htpasswd

ardından monitorix servisini restart ediyoruz.

sudo service monitorix restart

Monitorix uygulamasına giriş yapabilmek için bir kullanıcı adı ve parola oluşturuyoruz aşağıdaki komutla.

sudo htpasswd -d -c /var/lib/monitorix/htpasswd admin

Kurulumu tamamladıktan sonra monitorix uygulamasını açmak için web browsera sunucuadresi:8080/monitorix (sunucuadresi kısmına monitorixin kurulu olduğu sunucu adresi veya localde ise localhost )yazıyoruz. Kullanıcı adı ve parola girdikten sonra aşağıdaki gibi bir ekran görüntüsü gelecektir. Görüntülemek istediğimiz türü seçip günlük, haftalık, aylık veya yıllık bazda monitoring işlemini başlatabiliriz.

Froxlor Sunucu Yönetim Paneli

Froxlor çoklu-kullanıcı hizmetlerini yönetmek için kullanılan bir sunucu yönetim paneli.Alan adı hizmetleri, e-posta hesapları ve web sunucusu vb işler için cpanel veya webmine iyi bir alternatiftir.

Özellikleri

  • Oluşturulan alan adları başına SSL tanımlayabilme ve buna bağlı olarak kullanılacak portu seçme imkanı
  • Oluşturulan alan adları başına İP adresi atama ve buna bağlı olarak kullanılacak domaini seçebilme
  • Tüm yönetim işlevleri yanında sisteme Ticket sistemi entegre edilmiştir böylelikle bir sorun oluştuğunda direk olarak sistem yöneticisine kullanıcılar ulaşabilmektedir.
  • Özelleştirilebilir temalar ile kendi temalarınızı oluşturabilirsiniz.
  • Farklı php.ini dosyaları oluşturabilirsiniz.Böylelikle istediğiniz zaman php.ini değiştirerek ayarları hemen aktif edebilirsiniz.
  • Tüm http, e-posta ve ftp trafik logları saklanır ve interaktif grafikler aracılığıyla ile takip edilebilir.
  • web-ftp sayesinde dosya indirme ve gönderme işlemlerini tarayıcı üzerinden kolaylıkla yapabilirsiniz.

Froxlor Nasıl Kurulur

Froxlor debian sistemler üzerinde sorunsuz çalıştığı bilinmektedir ayrıca test edilmiştir.Sisteminizde Mysql,Apache ve python paketlerinin kurulu olması gerekmektedir.

Sisteme froxlorun kurulumunu gerçekleştirmemizi sağlayacak paketleri dahil ettik aşağıdaki komut aracılığı ilede yönetim panelini kurabilirsiniz.Ayrıca php5-curl paketinide kurmanız gerekmektedir.

Komutları verdiğiniz zaman karşınıza ilk olarak mysql kurulum ekranı gelecek bu ekrandan mysql kullanımı için admin şifresini ayarlamanız gerekiyor.

web taraflı klasör oluşturulsunmu diye tarafınıza soracak ihtiyacınıza göre seçebilirsiniz.

 

Sonrasında postfix ayarına geliyor sura burada “Internet Site” seçin böylelikle ayarları otomatik olarak yapacak SMTP kurulumları vs.

Ardından kurulu olan apacheyi yeniden başlatmanız yeterli olacak.

Kurulum tamamlandıktan sonra sitenize ister alan adınızdan istersenizde ip adresinden erişebilirsiniz.Panelinizi kullanmak için “/froxlor” girmeniz yeterli.

Start install butonuna basıyoruz kurulum ekranı geliyor ve kurulumu otomatik olarak gerçekleştiriyor.

Kurulumun 2.aşamasına geçiş yapıyoruz burada froxlor için mysql ayarlarını vermemiz gerekiyor.

Bu aşamadan sonra kurulum tamamen bitmiş olacak artık panelinize giriş yapabilirsiniz.

Ayarlamış olduğunu kullanıcı adı ile giriş yapıyorsunuz ve artık istediğiniz herşeyi yapabilirsiniz.Kullanıcı tanımlayıp sunucunuzda müşterilerinizi barındırabilirsiniz.

Giriş yaptınız karşınızda aşağıdaki gibi bir panel karşılayacak sizi oldukça güzel ve grafiksel olarak iyi tasarlanmış kullanımıda oldukça kolay sitenizi bu panelden yönetebilirsiniz.

Froxlor yönetim paneli konusunda bilmeniz gereken bir noktada dosyaların /var/www/froxlor yada /var/www/html/froxlor bulunabilecek olması iki dizinide kontrol etmeniz önerilir tanımlanan ayarları kullanırsanız /var/www/html/froxlor dizininde olduğunu göreceksiniz.

 

Port Manipülasyonu ve Bitwise Mask

Merhaba arkadaşlar, bu yazımda arduino mikrodenetleyici kartlarının port işlemlerini basitçe nasıl manipüle edilebileceğine değineceğim. Bu konuyu ele alma sebeplerimden biri bu konu hakkında yeterli türkçe kaynağın bulunmaması ve port işlemlerinde biraz daha derine inip  arka planda dönen işleri ön plana çıkarmak istememdir. Hadi başlayalım. Umarım faydalı bir yazı olur 🙂 

Arduino kartları üzerindeki I/0 (bir/sıfır) pinlerinin daha hızlı bir şekilde ayarlama yeteneğine sahibiz. Bu yazımı Arduino Uno kartlarını baz alarak ele alıyorum. Diğer Arduino kartları da benzer bir mantıkla çalışmaktadır. Datasheet’ lerini inceleyerek gerekli bilgilere ulaşabilirsiniz.

İlk olarak Input/Output (I/O) olarak kullandığımız digital ve analog pinlerimiz bulunmaktadır. Bizler Arduino-IDE programlama dilinde normalde pinMode() fonksiyonu ile ilgili pini giriş veya çıkış olarak ayarlıyorduk. Aslında bu fonksiyonun içinde port manipülasyonu işlemleri yapılmaktadır. Port manipülasyonu olayında  register mantığı ile çalışmaktayız ve Arduino Uno kartında boyutu  maksimum 8 bit registerlar bulundurmaktadır.(Port manipülasyonu için kullandığımız registerlar için boyut maksimum 8 bittir.) Bundan dolayı elimizde 3 port kaydı bulunmaktadır. Bunlar D,B,C kayıtlarıdır.

D ---> D pinleri 0∼7 arasındaki pinler

B ---> B pinleri 8∼13 arasındaki  pinler

C ---> C pinleri ise analog pinleridir (0∼6)

D,B,C port kayıtlarına değindiğimize göre artık sıra ilgili pinlerimizi I/O (Input/Output) olarak ayarlamaya geldi. Bildiğiniz gibi normalde pinlerimizin I/O olarak pinMode(pin_no, INPUT/OUTPUT) fonksiyonu yardımıyla ayarlıyorduk. Port manipülasyonunda bu işlemi DDRx ( x değişkeni  D.B.C kayıtlarını belirtmektedir) komutuyla yapacağız. Çıkış olarak ayarlamak için ilgili pinlere 1 değerini, giriş olarak ayarlamak için 0 değerini atayacağız. Örnekle dahi anlaşılacaktır 😀

pinMode(3,OUTPUT);

pinMode(5,OUTPUT);        ———>  DDRD = 0b10101000; (binary tabanlı atama işlemi)

pinMode(7,OUTPUT);                        DDRD = 0xA8; (hexadecimal tabanlı atama işlemi)

Yukarıdaki 2 DDRD atama işlemi aynı işlem olup birisi binary tabanlı diğeri ise hexadecimal tabanlı atamadır. 2 atama işlemi de aynı işi yapmaktadır sadece farklı 2 yoldur. 0b10101000 burada 3, 5, 7. pinlerimiz çıkış(Output) olarak ayarlanmışken diğer pinlerimiz giriş(Input) olarak ayarlanmıştır.

pinMode(8,INPUT);

pinMode(9,OUTPUT);          ———->   DDRB = 0b00010010;

pinMode(10,INPUT);

pinMode(12,OUTPUT);

0b00010010  burada 9, 12. pinlerimiz Output diğer pinlerimiz Input olarak ayarlanmıştır.

Şimdi biraz düşünelim elimizde 13 tane digital pinimiz var ve her birini  tek tek ayarlamaya kalkarsak 13 tane pinMode() fonksiyonu kullanmak zorunda kalırız ama port manipülasyonu kullanarak ayarlama yaparsak tek atama işlemi ile tek satırda ayarlama işlemimizi halledebilir ve pinMode() fonksiyonuna nazaran programımız daha hızlı çalışmasını sağlayabiliriz. Arduino programlamada mili saniyelerin ne kadar önemli olduğunu hatırlatmama gerek yoktur sanırım 🙂

İlgili pinlerimizi Input/Output olarak ayarladığımıza göre artık ilgili pinlerimizi HIGH/LOW olarak ayarlamalıyız. Normalde bu işlemi digitalWrite() fonksiyonunu kullanarak yaparız. Şimdi tekrar düşünelim. 🙂 Elimizde 13 digital pinimiz var ve programın akışına göre bu pinlerin HIGH/LOW durumları değişmektedir. Bu durum bizim digitalWrite () fonksiyonunu defalarca kullanmamıza neden olacak bu durum hem zaman hem de programımızın çalışma hızını port manipülasyonuna nazaran yavaşlamasına sebep olacaktır. İşte bu sebeplerden ötürü port manipülasyonu tercih etmeliyiz.

Port manipülasyonu ile ilgili pinimizi HIGH/LOW olarak ayarlarken PORTy ( y değişkeni  D.B.C kayıtlarını belirtmektedir) komutunu kullanmaktayız. İlgili pinimizin HIGH olması için 1 değerini, LOW olması için 0 değerini atamalıyız. Örneklere geçelim 🙂

pinMode(2,INPUT_PULLUP);

pinMode(3,OUTPUT);          ———->   DDRB = 0b01101000;

pinMode(5,OUTPUT);                             DDRD = 0x68; (hexadecimal tabanlı atanmış hali)

pinMode(6,OUTPUT);

digitalWrite(2,HIGH);

digitalWrite(3,HIGH);     ————>  PORTD = 0b00001100;

digitalWrite(5,LOW);

digitalWrite(6,LOW);

3, 5,  6. pinlerimiz output olarak, 2. pinimiz Input_pullup olarak  ve 2,3. pinlerimiz HIGH 5,6. pinlerimiz LOW olarak ayarlandı. Pullup olayına kısaca değinecek olursak örneğin 2. pinimizde buton dinlemesi yapıldığını varsayalım. Push butonlara basarken ortaya çıkan basılı veya basılı olmama durumu (butona basarken oluşan 5,10 mili saniyelik kararsız durum) engellemek için Pullup işlemini kullanıyoruz. pinMode() fonksiyonu kullanarak pullup ayarlanması pinMode(2,INPUT_PULLUP) şeklinde yapılır. Port manipülasyonu ile ayarlamak için ise ilgili pinimizi INPUT ve HIGH olarak ayarlamalıyız. INPUT olarak ayarlamak için DDRx register’ında 0 (sıfır) değerini vermeli ve HIGH olarak ayarlanması için ise PORTy register’ında I (bir) değerini vermeliyiz. (Pullup olayını register’lar ile nasıl ayarlayabileceğimize değinmek istedim. Neyse konumuza dönelim 🙂 )

Bu örnekten sonra port manipülasyonunu kısaca özetlersek pinlerimizi INPUT/OUTPUT  olarak ayarlarken DDRx, HIGH/LOW olarak ayarlarken PORTy register’larını kullanıyoruz.

Şimdi tekrar düşünelim. 3,5,6 pinlerimizi çıkış olarak ayarlamak istiyoruz ama diğer pinlerimize şimdilik herhangi bir ayarlama yapmak istemiyoruz. Bu durumu sağlamak register’lara yaptığımız binary ve haxadecimal atamalarla mümkün olmuyor çünkü binary veya hexadecimal atamalar yaparsak ya ilgili pinlerimiz 0 (sıfır) ya da I (bir) oluyor buda ilgili pinlerimizin ya Input ya da output olmasına sebep oluyor. (DDRD =0b01101000; görüldüğü gibi) Peki bu durumu nasıl sağlarız? İlgili pinlerimizden geri kalan pinlerin ilk hallerini(herhangi bir ayarlanma yapılmamış halini) nasıl koruruz? işte bu durumda imdadımıza bitwise işlemleri koşuyor.

BİTWİSE İŞLEMLERİ

Bu bölümde kısaca bitwise işlemlerine değineceğim. Bildiğiniz and, or, not alma işlemleri arkadaşlar isim korkutmasın 😀

Bitwise AND (&)

          x: 10001101

          y: 01010111

x & y  --------------

             00000101

Bitwise OR  ( | ) 

          x: 10101000

          y: 01010111

x | y  --------------

             11111111

Bitwise NOT (∼)

          x: 10101001

         ∼x: 01010110

Bitwise XOR (^)

          x: 10001101

          y: 01010111

x ^ y  --------------

             11011010

Bitwise SHİFT (<< ve  >>)

Shift işlemi kaydırma işlemidir. Arkadaşlar 1, 0b00000001 register’larda bu şekilde algılanır yani buna eşittir. Şimdi bizim elimizde bir x sayısı olsun ve 1′ e eşit olsun x sayısını 5 kere sağa shift edelim.

  x = 1 = 0b00000001;

  (1 << 5) = 0b00100000;

Elimizdeki x sayısı 8 eşit olsun ve x sayısını 2 kere sola shift edelim.

  x = 8 = 0b00001000;

  (1 >> 2) = 0b00000010;

BİTMASK

Bitwise ile Pinlerin OUTPUT veya HIGH Olarak Ayarlanması

Bitwise işlemlerine kısaca değindikten sonra  bitwise işlemleri ile DDRx ve PORTy register’larımızı nasıl kullanabiliriz ona bakalım. Bitwise işlemleri ile register’ların kullanılması işlemine BitMask (maskeleme) denmektedir. Arduino kartlarımızın pinlerine herhangi INPUT/OUTPUT veya HIGH/LOW ayarlaması yapmadığımızda register durumu 0bXXXXXXXX (bilinmeyen değerler 0 veya 1) olsun. Biz bu değeri öyle bir değer ile öyle bir bitwise işlemine tabii tutalım ki istediğimiz pinler haricindeki diğer pinlere herhangi INPUT/OUTPUT veya HIGH/LOW  ayarlaması (ataması) yapmış olmayalım. Örnekle daha iyi anlaşılır olacaktır. 1=0b00000001 e eşit olduğunu unutmayalım. 🙂

Şimdi 4 pinini OUTPUT ve HIGH olarak bitwise işlemleri ile ayarlayalım.

DDRD = DDRD | (1 << 4);   (DDRD  |= (1 << 4) şeklinde kısaltıp da yazabiliriz. )

İşlemi inceleyelim.

DDRD’nin ilk durumu (herhangi ayarlama yapılmamış hali) bilinmiyor. DDRD’nin ilk hali

DDRD = 0bXXXXXXXX; olsun.

(1 << 4) = 0b00010000;  (00000001 ‘ i 4 kere shift ettik)

DDRD = 0bXXXXXXXX;    --------->   XXXXXXXX    (DDRD)

                                   00010000    (1 << 4)

                               |------------  (OR işlemi)

                                   XXX1XXXX    (DDRD'nin yeni değeri)

İşlemin detaylarını incelediğimizde 1 ile OR işlemine hangi değer girerse girsin sonuc 1 çıkacaktır. 0 ile OR işlemine hangi değer girerse girsin sonuç işleme giren değere eşit olacaktır. Yani 1 ile  X’in OR işlemine girmesinin sonucunda X ister 0 ister 1 olsun sonuç 1’e ,0 ile  X’in OR işlemine girmesinin sonucu  ise X ister 0 ister 1 olsun sonuç X ‘e eşit olacak ve böylece pinlerimizin ilk hali korunmuş olacaktır. Sonucumuz  DDRD = 0bXXX1XXXX; eşit oldu. Yani 4. pinimiz OUTPUT olarak ayarlandı ve diğer pinlere herhangi bir ayarlanma (atama) işlemi yapılmadı. Diğer pinlerimiz ilk hallerini korudu.

PORTD |=(1 << 4); (4. pinimiz HIGH olarak ayarlandı. Yukardaki işlem adımlarının aynısı geçerlidir.)

Pekişmesi için bir örnek daha 🙂 2,3,5 pinlerimizi OUTPUT ve HIGH olarak ayarlayalım.

DDRD |= (1 << 2) | (1 << 3) | (1 << 5);

İşlemi açalım…

DDRD = 0bXXXXXXXX; ( register’ın ilk durumu)

(1 << 2)|(1 << 3)|(1 << 5) = 0b00101100; ——>  00000100  (1 << 2)

                                               00001000  (1 << 3)

                                         | -------------  (1<<2)|(1<<3)

                                               00001100 

                                               00100000  (1<<5) 

                                            | --------------

                                               00101100

DDRD = 0bXX1X11XX;   ———–>  XXXXXXXX

                          00101100

                      | --------------

                          XX1X11XX 

PORTD |=(1 << 2) | (1 << 3) | (1 << 5);

Yukardaki işlemler ile aynı adımlar izlenir. Tek fark PORTy register’ını kullanıp HIGH olarak ayarlamamızdır. İşlemler incelendiğinde istediğimiz pinler çıkış olarak ayarlanacak ve diğer pinler ilk hallerini koruyacaktır.

Bitwise ile Pinlerin INPUT veya LOW Olarak Ayarlanması

Örneğe geçelim ve bu arada 1 =0b00000001 ‘dır hatırlatayım dedim 😛

10. pinimizi INPUT ve LOW olarak ayarlayalım…

DDRB &=  ∼(1 << 3);

işlemi açıyoruz 😀

DDRB = 0bXXXXXXXX;  (DDRB register’ının ilk durumu)

(1 << 3) = 00001000; (shift işlemi)

∼(1 << 3); = 11110111; (not işlemi)

DDRB =0bXXXX0XXX;   ———–>  XXXXXXXX

                          11110111

                      & -------------

                          XXXX0XXX

İşlemi incelediğimizde 0 ile hangi değer And işlemine girerse girsin değerimiz ister 1 ister 0 olsun sonuç 0, 1 ile hangi değer And işlemine girerse girsin değerimiz ister 1 ister 0 olsun sonuç işleme giren değere eşit olcaktır. Yani 0 ile  X’in And işlemine girmesinin sonucunda X ister 0 ister 1 olsun sonuç 0’a ,1 ile  X’in And işlemine girmesinin sonucunda  ise X ister 0 ister 1 olsun sonuç X ‘e eşit olacak ve böylece pinlerimizin ilk hali korunmuş olacaktır. Sonucumuz  DDRB = 0bXXXX0XXX; eşit oldu. Yani 10. pinimiz INPUT olarak ayarlandı ve diğer pinlere herhangi bir ayarlanma (atama) işlemi yapılmadı. Diğer pinlerimiz ilk hallerini korudu.

PORTB &=  ∼(1 << 3);

Yukardaki işlemler ile aynı adımlar izlenir. Tek fark PORTy register’ını kullanıp LOW olarak ayarlamamızdır.

Şimdi sıra son örneğimize geldi. 2,3. pinlerimizi Input 4,6. pinlerimizi Output olarak ve 2,3.pinlerimizi HIGH 4,6. pinlerimizi LOW olarak ayarlayalım.

Arkadaşlar işlemleri uzun uzadıya açmıyorum bu sefer yukarıdaki örneklerde nasıl yapıldığı öğrendiniz zaten ama siz uzun uzadıya açın öğrenmek için 😛

DDRD &=  ∼(1 << 2) & ∼(1 << 3); (2 ve 3. pinlerimiz INPUT olarak ayarlandı)

DDRD |= (1 << 4) | (1 << 6);   (4 ve 6. pinlerimiz OUTPUT olarak ayarlandı)

PORTD |=(1 << 2) | (1 << 3); (2 ve 3. pinlerimiz HIGH olarak ayarlandı)

(2 ve 3. pinlerimiz Pullup olarak ayarlanabilir)

PORTD &=  ∼(1 << 4) & ∼(1 << 6); (4 ve 6. pinlerimiz LOW olarak ayarlandı)

Arkadaşlar yazıma burada son veriyorum. Yazı ile ilgi yorumlarınızı bekliyorum. Sorularınızı yorum olarak veya o.erdemir1997@gmail.com adresine göndererek sora bilirsiniz. İnşAllah faydalı bir yazı olmuştur. Sağlıcakla ve Open Source ile kalın. Ömer Ali ERDEMİR

ACL (Access Control List)

Hızla büyüyen ve yenileşen network dünyasında unutulmaması gereken en önemli konulardan biri güvenlik tehlikelerine karşı alınması gereken önlemlerdir.Networkler arası iletişimin kontrol altına alınması, ideal network ortamının yaratılması, gereksiz ve güvenlik açığı olan protokollerin filtrelenmesi konusunda Firewall çözümlerine ihtiyaç duyarız. Sektörde yazılımsal veya donanımsal olarak geniş bir yelpazeye sahip olan firewall ürünlerini kullanarak bu tür işlemleri yapabileceğimiz gibi mevcut topolojimiz içerisinde var olan ve farklı networkler arasında iletişimi sağlamayı esas alan Router’larımızın basic firewall özelliğini kullanarak’ta yapabilmekteyiz. Topoloji içerisinde yer alan mevcut Router’lar üzerinde erişim listeleri ile paket filtreleme işlemlerini yaparak güvenlik seviyesini arttırabilir ve standart filtrelemeler için ek maliyeti ortadan kaldırabilmekteyiz.

ACL farklı networkler arasında iletişim kurmamızı sağlayan Router (yönlendirici) üzerine gelen ya da giden iletişim trafiğini kaynak ip bazında ya da port bazında filtreleme yapabilmemizi sağlayan kontrol mekanizmasıdır. ACL’ler kaynak ip’ye göre filtreleme yapabilmekle beraber gelişmiş listeleri kullanarak hedef ip, port numarası protokol bazında filtreleme işlemleri yapabilmekteyiz.

ACL’ler protokol, yön ya da port temelli olarak tanımlanmalıdır. Bir arabirim üzerindeki trafik akışını kontrol etmek için arabirim üzerinde çalışır durumdaki her bir protokol için bir ACL tanımlanmalıdır. ACL’ler trafiği arabirim üzerinde, tek bir yönde ve tek zamanda kontrol ederler. Her farklı yön için ayrı ayrı bir ACL oluşturulmalıdır; giriş trafiği için bir tane, çıkış trafiği için bir tane. Sonuç itibarıyla her bir arabirim çok sayıda protokole ve tanımlanmış yöne sahip olabilir. Erişim listeleri oluşturmanın temel nedenleri aşağıdaki gibidir.

1. Ağ trafiğini sınırlamak ve ağ performansını artırmak. Örneğin ACL’ler video trafiğini sınırlamak suretiyle ağdaki yükü büyük ölçüde azaltır ve neticede ağ performansını artırır.

2. Trafik akışı kontrolünü sağlamaktır.

3. Ağ erişiminde temel bir güvenlik düzeyi sağlamak. ACL’leri bir host’un ağın bir kısmına erişmesine izin verebilir ve diğer bir host’un aynı bölgeye erişimini engelleyebilir.

4. Yönlendirici arabirimlerinde hangi tip trafiğe yol verileceği ya da bloke edileceğine karar verir.

5. Bir yöneticiye, bir istemcinin ağa hangi alanda erişebileceğini kontrol etmek iznini verir.

ACL’NİN OLUŞTURULMASI

Standart, uzatılmış, IPX, Apple Talk ve başka diğerlerini de içeren çok farklı tiplerde ACL’ler vardır. Bir yönlendirici üzerinde ACL’leri konfigüre ederken her ACL kendisine atanan bir rakamla kendine özerk tanımlanmalıdır. Bu rakam, oluşturulan erişim listesinin tipini tanımlar.

ACL tipleri ve numaraları

Access Kontrol List’lerin Genel Yazım Biçimi

Router(config)# access-list ACL_# permit|deny koşul

Genel bir ACL tanımlama adımı bu şekildedir. Özellikle 1–99 ve 1300–1999 arası kullanılan numaralar tablo da görüldüğü gibi standart erişim listelerini tanılamada kullanılır. Bu adımdaki koşul yönlendirici tarafından kabul veya red işlemi yürütüldüğünde paketlerin içeriklerinin nelere göre eşleme yapılması gerektiğini yönlendiriciye söyler.

Router(config-if)# ip access-group ACL_# in|out

ACL’ler bir ya da daha fazla arabirime atanabilir ve access-group (erişim-küme) komutu kullanılarak giriş ve çıkış trafiğini filtreleyebilir. İn ve out parametresi yönlendirici arabirimine giriş ve çıkış trafiğini simgeler.

Router(config)# access-list 2 deny 192.168.1.2

Router(config)# access-list 2 permit 192.168.1.0 0.0.0.255

Router(config)# access-list 2 deny 192.168.0.0 0.0.255.255

Router(config)# interface serial 0

Router(config-if)# ip access-group 2 in

Access-group komutu arabirim yapılandırmasına iletilir. Bir giriş ya da çıkış arabirimine herhangi bir ACL atandığında konumlandırma özelleştirilmelidir. Filtreleme yönü içeri ya da dışarı giden paketleri kontrol için ayarlanabilir. ACL’nin giriş trafiği mi yoksa çıkış trafiğine mi adreslenmiş olduğunu saptarken ağ yöneticisi yönlendiricinin içinden gelen arabirimlere göz atma gereği duyabilir. Bu çok önemli bir düşüncedir. Bir arabirimden gelen trafik giriş erişim listesince, arabirimden çıkan trafik de çıkış erişim listesince filtrelenir. Numaralandırılmış bir ACL oluşturulduktan sonra bir arabirime ataması yapılmalıdır. Numaralandırılmış ACL bildirimleri içeren bir ACL değiştirilecekse içindeki tüm bildirimler no access-list / liste no komutu kullanılarak silinmelidir.

Router(config)# no access-list 2

Erişim listeleri oluşturulurken ve uygulanırken şu temel kurallar takip edilmelidir:

1.Protokol ve yön temelli bir erişim listesi olmalıdır.

2. Standart erişim listesi alıcı adresine en yakın olmalıdır.

3. Genişletilmiş listesi kaynağa en yakın olmalıdır.

4. Giriş ve çıkış arabirim referansları yönlendiricinin içinden sanki “porta bakıyormuş” gibi kullanılmalıdır.

5. Bildirimler, bir eşleme gerçekleşene kadar listenin en başından en sona kadar ardışık olarak gerçekleşecektir. Eğer eşleşme olmaz ise paket reddedilecektir.

6. Erişim listesinin sonunda gizli bir ret olacaktır. Bu normal olarak yapılandırma listelemesinde ekranda görüntülenmez.

7.Erişim listesi girişleri özelden genele bir sıra içinde filtrelenmelidir. Önce özel hostlar reddedilmeli ve sonrada gruplar ya da genel filtrelemeler gelmelidir.

8. Eşleşme koşulu ilk önce incelenir. İzin ya da ret sadece eşleşme doğru ise incelenir.

9. Erişim listesinin sonuna daima yeni satırlar eklenir. No access-list x komutu tüm listeyi silecektir. Numaralandırılmış bir ACL’si seçerek silme ya da ekleme mümkün değildir.

10. Bir erişim listesi silinirken dikkatli olunmalıdır. Eğer erişim listesi bir ürünün arabirimine uygulanır ve silinirse ROS’un sürümüne bağlı olarak arabirime default (varsayılan) bir ret uygulanır ve dolayısıyla tüm sistem durur.

11 Çıkış filtrelemesi yerel yönlendiriciden kaynaklanan trafiği etkilemez.

Wildcard Mask(Joker maske)

Wildcard mask, dört sekizliğe bölünmüş bir 32 bittir. Wildcard mask bir IP adresi ile eşleşir. Maskedeki sıfır ve birler, IP adres bitleriyle nasıl haberleşeceğini tanımlamak için kullanılır. Wildcard maskelemesi terimi tıpkı bir arama işleminde tüm karakterler yerine kullanılabilen joker karakterler mantığında olup ACL’ nin mask-bit eşleşmesi için bir tür takma addır (nickname). Wilcard Mask’ların alt ağ maskeleriyle işlevsel bir ilişkisi yoktur. Onlar farklı amaçlar ve farklı kurallar doğrultusunda kullanılır. Alt ağ maskeleri IP adresinin sol tarafından başlar ve host alanından ödünç bitler almak suretiyle ağda genişlemek için sağ tarafa doğru ilerler. Wilcard Mask’ları, adrese bağlı olarak kaynaklara erişimi kabul ya da red eden bireysel veya grup IP adreslerini filtrelemek için tasarlanmıştır. Wilcard Mask’larının alt ağ maskeleriyle nasıl ilişkilendirilip çalıştırılacağını düşünmek sadece kafa karıştır. Wilcard Mask ile alt ağ maskesi arasındaki tek benzerlik her ikisinin de otuz iki bit uzunlukta olması ve maskelemede sıfır ve birleri kullanıyor olmasıdır. Diğer bir açıdan, Wilcard Mask’ta ki sıfır ve birler, alt ağ maskesindekilerden çok farklıdır. Bu karışıklığı gidermek için, grafikte Wilcard Mask’ta ki 1’lerin yerine X’ler konmuştur. Bu maskeleme 0.0.255.255 olarak yazılabilirdi. Buradaki sıfırın anlamı, kontrol edilecek değerlere izin vermek, X’lerin (yani 1’lerin) anlamı ise karşılaştırılan değerlerin bloklanmasıdır.

Wilcard Mask eşleme

Wilcard Mask işleminde, erişim listesi bildiriminde yer alan ip adresi kendisine uygulanmış bir Wilcard Mask’a sahiptir. Bu, bir paketin ACL tarafından işleme konup konmayacağını görmede ve karşılaştırmada kullanılacak bir değer üretir ya da bir sonraki bildirimi kontrol amacıyla gönderir. ACL işleminin ikinci kısmı, belli bir ACL bildirimince kontrol edilmiş olan herhangi bir IP adresinin bildirim tarafından ona uygulanacak olan wilcard mask’ın alınmasıdır. IP adresinin ve wilcard maskesinin sonucu ACL’nin değerini eşlemede eşit olmalıdır. Bu işlem çizimde gösterilmiştir.

wilcard mask örneği

ACL’lerde kullanılan iki özel anahtar sözcük vardır. Bunlar; any ve host seçenekleridir. Basit şekliyle, any seçeneği IP adresi için 0.0.0.0 in yerini, wilcard için de 255.255.255.255’in yerini tutar. Bu seçenek, karşılaştırılmış olan herhangi bir adresi eşleştirecektir. Host seçeneği, 0.0.0.0 maskesinin yerini tutar. Bu maske, ACL adresinin tüm bitlerine ve paket adresinin eşleşmiş olmasına gerek duyar. Bu seçenek tek bir adresi eşleştirecektir.

Router(config)# access-list 2 permit 0.0.0.0 255.255.255.255

Yukarıdaki adım yerine

Router(config)# access-list 2 permit any yazılabilir.

Router(config)# access-list 2 permit 192.168.1.2 0.0.0.0

Komut adımı yerine de aşağıdaki adım yazılabilir

Router(config)# access-list 2 permit host 192.168.1.2

Yönlendirici üzerinde ACL’lerin yerleşimini ve içeriğini doğrulamak için pek çok show komutu vardır. Show access-list komutu yönlendirici üzerindeki tüm ACL’lerin içeriğini görüntüler.

ACL Türleri

Standart ACL

Standart ACL’ler yönlendirilmiş IP paketlerinin kaynak adresini kontrol ederler. Ağa, alt ağa ve host adreslerine bağlı olarak tamamen protokol için karşılaştırma izin ya da red ile sonuçlanacaktır. Örneğin, F0/0’dan gelen paketler kaynak adresi ve protokolü için kontrol edilecektir. Eğer izin verilmişse paketler yönlendiricide doğru bir çıkış arabirimine yönlendirilecektir. Eğer izin verilmemişse daha giriş arabirimindeyken düşeceklerdir.

Standart Erişim Listelerinin Genel Yazım Biçimi

Access-list [liste numarası] [permit | deny] [IP adresi] [wilcard]

Liste numarası: ACL numarası 1’den 99 ve 1300 den 1999’a kadar olabilir.

Permit | deny:Her ikisi de olabilir. Permit belirttiğiniz ip adresini, bir eşleme girişini içerir.

IP adresi: Bir IP adresi, belirlenmiş kuralları içeren IP adreslerini eşlemede ve kararlaştırmada kullanılır.

Wilcard:İsteğe bağlı olarak kullanılan wilcard eşlemede bir IP adresindeki bitlerin değerlerini (0/1) kontrol eder.

Router(config)# access-list 1 permit 192.168.1.1

Router(config)# access-list 1 deny 192.168.1.2

Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255

Router(config)# access-list 1 deny any

Router(config)# interface serial 0

Router(config-if)# ip access-group 1 in

Bu örnekte ACL’nin en başında bulunan permit işlemi düzenli bir şekilde yürütüldüğünde IP paketinde kaynak adresin 192.168.1.1 olmalıdır. Eğer değilse yönlendirici ikinci adıma geçecektir. ACL’nin ikinci satırı deny işlemi yürütüldüğünde IP paketinde kaynak adres 192.168.1.2 olmalı, değilse yönlendirici üçüncü satıra geçecek. ACL deki üçüncü satırda permit işlemi yürütüldüğünde IP paketinde kaynak adres 192.168.1.0 ile 192.168.1.255 arasında olmalıdır. Değilse dördüncü satıra geçecektir. Dördüncü satır genelde gerekli değildir, çünkü bütün IP paketlerini düşürecektir. Bu adıma her ACL’nin sonunda gizli olarak belirtilen bir red işlemi olmadığı sürece ihtiyacınız yok demektir. Yukarıdaki ACL örneğinde son iki komut serial0’ dan arabirime gelen trafiği ACL#1’de aktifleştirecektir. Aslında aşağıdaki gibi yazılmış olması gerekirdi.

Router(config)# access-list 1 deny 192.168.1.2

Router(config)# access-list 1 permit 192.168.1.0 0.0.0.255

Router(config)# interface serial 0

Router(config-if)# ip access-group 1’in

Bu düzenleme listeniz dört satır olacak ve iki satır düşmüş olacaktır. Bu da yönlendiricinizin performansını artıracaktır.

Genişletilmiş (Extended) Erişim Denetim Listeleri

Genişletilmiş ACL’ler, geniş bir kontrol aralığı sağladığı için standart ACL’lerden daha sık kullanılırlar. Genişletilmiş ACL’ler port numaraları ve protokolleri de kontrol edebileceği gibi paketin kaynağını ve alıcı adresini de kontrol eder. Bu, ACL’nin neyi kontrol edeceğini tanımlama konusunda büyük bir esneklik sağlar. Erişim izni ya da reddi verilen paketler, protokol tipi ve port adresinin yani sıra, paketin nereden çıktığı ve nereye yollandığına dayalıdır. Genişletilmiş bir ACL, Fa0/0’dan özel bir S0/0 adresine yapılacak olan mail trafiğine dosya transferi ve web tarayıcı reddi olma koşuyla izin verir. Paketler göz ardı edildiğinde, bazı protokoller göndericiye alıcı adresine ulaşılamadığını bildiren bir yankı paket yollar. Tek bir ACL için, birden çok bildirim düzenlenebilir. Bu bildirimlerin her biri, bildirimi aynı ACL’ ye ilintilendirmek için aynı erişim listesi numarası içermelidir. Gerektiği ölçüde koşul bildirimlerinin sayısı artabilir, bu sayıyı sınırlayan sadece yönlendiricinin kullanılabilir belleğidir. Doğal olarak bildirimlerin artırılması ACL’nin yönetimini ve anlaşılmasını daha bir zorlaştıracaktır.

Genişletilmiş Erişim Listelerinin Genel Biçimi

Şimdi genişletilmiş erişim listelerinin tipik olarak kullanımlarının genel biçimini tanımlayalım. Genişletilmiş erişim listeleri aşağıdaki biçimi alır:

Access-list [liste numarası] [permit | deny] [protokol] [kaynak belirtme] [hedefbelirtme] [protokol niteleme] [logging]

Liste numarası:Erişim liste numarası 100’den 199’a ve 2000’den 2699’a kadar olabilir.

Permit | deny:Her ikisi de olabilir. Permit belirttiğiniz ip adresini bir eşleme girişini içerir.

Protokol belirtme: Paket protokolüdür. Burası, IP,TCP,EDP veya ICMP ve diğer IP protokollerinden biri olabilir. Bununla birlikte İP protokol numarası da olabilir.

Kaynak belirtme: [Ip adresi] [wilcard] [port numarası belirtme (sadece UDP ve TCP için kullanılır)] biçiminde belirtilir.

Hedef belirtme:[Ip adresi] [wilcard] [port numarası belirtme (sadece UDP ve TCP için kullanılır)] biçiminde belirtilir.

IP adresi Bir IP adresini eşlemek için kullanılır.

Joker maske: İsteğe bağlı olarak kullanılan wilcard eşlemede bir IP adresindeki bitlerin değerlerini 0/1) kontrol eder.

Port numarası belirtme: İsteğe bağlı belirtme, port için bir dizi numaralara karar verir.

Protokol niteleme: İsteğe bağlı belirtme, protokol numaralarına daha fazla özellik tanımlar.

Logging (Kayıtlama): Logging anahtar kelimesi. Erişim liste girişlerinin eşlendiğinde paket bilgilerini hepsini kayıt altına alır.

Genişletilmiş ACL bildirimlerin için yazım formatı oldukça uzun olabilir ve çoğu kez terminal ekranını hepten kaplayabilir. Wilcard da komutlarda host ve anahtar sözcüklerinin kullanımında seçenekler içerir. Genişletilmiş ACL bildiriminin sonunda, opsiyonel TCP ya da UDP port numaralarının özelleştiği bir alandan kazanılan ilave bir kesinlik vardır.

Operatörler TCP ve UDP ile birlikte kaynak ve hedefi veya her ikisinin numara ve ismini açıkça belirtebilirsiniz. Yapılandırmada operatör kullandığınız takdirde eşlemede açıkça belirtmiş olursunuz. Operatörler yönlendiriciye port numaralarında veya numaralarda nasıl eşleme yapacağınızı söyler. Aşağıdaki tabloda operatörlerin açıklamalarını görebilirsiniz. Bu operatörler sadece TCP ve UDP bağlantılarda uygulanabilir. Diğerleri kullanmaz.

TCP ve UDP operatörleri

Genişletilmiş ACL konfigürasyonu;

Router(config)# access-list 100 permit udp any host 172.16.1.1 eq dns log

Router(config)# access-list 100 permit tcp 172.17.0.0 0.0.255.255 host 172.16.1.2 eq telnet log

Router(config)# access-list 100 deny ip any any log

Router(config)# interface ethernet 0

Router(config-if)# ip access-group 100 in

Bu örnekteki amaç ağdan gelen trafiği sınırlamaktır. Bir dahili DNS sunucusuna (172.16.1.1) herhangi bir kaynak cihaz tarafından gönderilen DNS sorgusuna izin verecektir. 0.0.0.0 wilcard kaldırılmış ve host anahtar kelimesi IP adresinin önüne konmuştur. Bu adımda diğer bir eşlemde log’dur. İkinci adımda 172.17.0.0/16 ağındaki herhangi bir cihaza hedef cihaz 172.16.1.2 ise izin verecektir. Aslında üçüncü adıma gerek yoktur çünkü önceki adımda bütün trafik eşlemesi kabul (permit) edilmediğinden düşecektir. Bununla birlikte ne düşürüldüğünü bilmek istiyorsanız, örnekte yapıldığı gibi, log parametresi ile yapılandırma yapmanız gerekmektedir. Yapılandırmanın en son kısmında ACL ethernet0 üzerinde sınırlama yapacaktır.

Örneğin 192.168.1.100 bilgisayarının 212.1.1.8 bilgisayarına 80. porttan erişmemesini, aynı bilgisayara 25. porttan erişebilmesini, diğer bilgisayarlar için herhangi bir kısıtlama olmamasını istiyoruz (Söz konusu portlar TCP’de çalışır). Bu durumda komut satırına;

Router(config)#access-list 101 deny tcp host 192.168.1.100 host 212.1.1.8 eq 80

Router(config)#access-list 101 permit tcp host 192.168.1.100 host 212.1.1.8 eq 25

Router(config)#access-list 101 permit ip any any

Router(config)# interface ethernet 0

Router(config-if)# ip access-group 101 in

yazılmalıdır.

Swift Nedir ?

swift programming ile ilgili görsel sonucu

Merhabalar Arkadaşlar

Bugün ki yazımda iOS platformunun gözde programlama dili olan Swift’i yakından tanımaya çalışacağız.

Swift, Apple tarafından iOS ve OS X platformlarına iOS ve Mac uygulamaları geliştirmek için oluşturulan bir dildir.

Swift, güçlü , kullanımı ve öğrenilmesi kolay, nesne yönelimli bir programlama dilidir.

Swift, 2 Haziran 2014’te WWDC konferansında tanıtıldı.

Apple Worldwide Developer Conference (WWDC) (Apple Dünya Geliştiricileri Konferansı),  Apple tarafından her yıl Amerika Birleşik Devletleri’nin Kaliforniya eyaletinde, yazılım geliştiricileri için düzenlenen bir konferanstır.

Swift programlama dili Xcode ide si kullanılarak uygulamalar yazılabilir.

Swift, Objective-C, Haskell, Ruby, Python, C# gibi birçok programlama dilinden faydalanılarak yazılmıştır.

Swift , ebabil kuşu anlamına gelen swift kelimesinden gelmektedir.

Swift‘in logosunda bulunan kuş , ebabil kuşunu temsil etmektedir.

Swift dili Objective-C dilinden daha kolay ve güçlü bir dildir. Çevremdeki insanlara iOS geliştirmek için hangi dil ile başlamalıyım sorusuna cevap olarak hep Swift cevabını aldım. Biraz araştırdım ve neden bu Objective-C dili beğenilmiyor , yazılımcılara ne yapmış olabilir ki ? Öncelikle Objective-C dilinin syntax yapısı karmaşık ve zordur. Ağır bir dildir. Onun için Apple Swift gibi dinamik bir dil çıkartarak bu hantallıktan kurtulmak istedi. Objective-C dili hâlâ kullanılmaktadır. Swift gibi bir dil varken büyük bir aksilik olmaz ise bu dil ile yüzgöz olmak istemiyorum.

 

İlgili resim

 

Swift dili ile ilgili yararlı makale,ders ve video linklerini aşağıdaki gibi listeledim :

Swift dilinden bahsetmiş olduk. Umarım beğenerek okursunuz. Bol kodlu geceleriniz olsun 🙂

NFS

NFS (Network File System)

Network File System yani ağ dosya sistemi , Sun Microsystems tarafından 1984 yılında geliştirilmiş , ağdaki bilgisayarların ortak bir dosya sistemine RPC (Remote Produce Call)  temelli dağıtık dosya sistemi yapısıdır. Ağ dosya sistemi (NFS), bir ağ üzerindeki birden fazla bilgisayarda bulunan dosyaların , tek bir sabit diskte yer alır gibi yönetilmesini sağlar.

Bu durumda dosyalara erişebilmek için fiziksel olarak nerede bulunduklarnın bilinmesi gerekmez.

NFS sayesinde bir makinede yer alan belirli bir disk bölümü , başka makinalar tarafından kolayca okunabilir veya yazılabilir. Genellikle bu işleme özellikle büyük organizasyonlarda disk alanından tasarruf etmek için başvurulur. Bu işlemlerin tek bir sunucuda toplanması , her makinada aynı dosyalar ve programlar kullanılmasını zorunlu tutmadan kolayca yapılabilmesi için önemlidir. Tek bir sunucuda toplanan dizinler diğer bilgisayarlar ile bu alanı ortak paylaşırlar ve paylaşılan dosya yerel bilgisayardaki bir dizinmiş gibi davranır.

Kendi disk alanını paylaşan makinaya NFS sunucusu , bu diske erişim yapan makinalara NFS istemcisi adı verilir.

NFS Protokolü hakkında ;

NFS olarak adlandırılan Network File System (Ağ Dosya Sistemi) birbirinden farklı 4 ayrı protokolün birleşiminden meydana gelmiştir. Bu 4 protokolde RPC ve prtmap (rpc.portmap) portmapper , RPC program numaralarnı port numaralarna çevirir. RPC sunucusu çalışmaya başladığında portmap’a hangi kapının kullanılacağını ve yönetilen RPC program numarasını söyler. Bir kullanıcı bir program numarasına bir RPC isteği göndermek istediğinde ise ; istenilen programa erişim veren port numarasını almak için ilk olarak sunucu “portmap” ile bağlantı kurar sonrasında ise RPC paketleri ilgili portlara gönderilir.

Ağ dosya sisteminin çalışmasını sağlayan 4 yardımcı şunlardır ;

  1. NFS : Temel protokol olup dosya yaratma , arama , okuma , yazmaya izin verir. Güvenilirlik ve dosya istatistiğini de yöneten protokoldür.
  2. mountd : İhraç edilen dosya dizgilerinin ağ dosya yönetimi ile erişimlerini sağlamak amacı ile kurulmasından sorumludur. “mount” ve “umount” gibi istekleri alan sunucu ihraç edilen dosya dizgilerine ait bilgileri tutmak zorundadır.
  3. Nsm (Ağ Durum Ekranı) : Bir makinanın durumunu (sunucu – istemci) belirlemek için ağ düğümlerini izleyip kontrol etmek amacı ile kullanır.
  4. Nlm (Ağ Kilit Yöneticisi) : Aynı anda farklı istemcilerin verileri değiştirmesini engellemek için bu protokol bir kilit dizgesi kullanır. Hangi dosyaların kullanıldığını bilir ve nsm protokolünün yardımıyla bir istemcinin ne zaman başladığını saptar. NSM her kullancının kilidini geri vermeden önce serbest bırakır.

Ağ Üzerinde Paylaşım ;

NFS’in çalışması yerel bir diskin mount edilmesi kadar kolaydır.

Örnek olarak NFS sunucusu olan aspendos makinasında yer alan /home dizinini , yerel makinadaki /users dizinine yerleştirmek için :

# mount -t nfs pardus:/home/users kullanılır.

mount , karşı makinanın erişim izinleri doğru olduğunu teyit ettiği anda bu işlemi gerçekleştirir. Sunucu ile istemci arasında mesaj alış-verişini mountd programı üstlenir.

NFS kullanabilmek için çekirdekte NFS desteği olması şartdır. Eğer aşağıdaki satırlarda nfs kelimesi geçmiyorsa çekirdeğe NFS desteği verilerek tekrar derlenmesi gerekir.

$cat /proc/filesystems

minix

ext2

msdos

nodev proc

nodev nfsd

 

NFS için mount programının genel kullanımı ;

mount -t nfs <sunucu-adresi:paylaşma-dizini> <yerel-dizin> -0 <seçenekler>

Sistem açılırken /etc/fstab dosyasında yer alan bilgilerle uzak makinanın diski otomatik olarak paylaştırılabilir.  Mount programı bazı seçenekleri destekler. Bu seçenekler -o yardımıyla komut satırında verilebildiği gibi /etc/fstab

icinde de belirtilebilir. Her iki durumda da birden fazla seçenek kullanılırsa bunlar birbirinden virgulle ayrılırlar.

Açılış sırasında news makinasındaki /usr/spool/news dosyasını yerel makinadaki /usr/spool/news dizini altına yerleştiren /etc/fstab satırı ;

news:/usr/spool/news  /usr/spool/news nfs timeo=20   şeklinde yazılır.

NFS ile kullanılan timeo seçeneğinin karşısında yer alan sayı (saniyenin onda biri) , bağlantının kurulabilmesi için geçecek maksimum zamanı gösterir. Bu zamanın aşılması halinde sunucuyla bağlantı kesilir.

Kurulum ;

Sunucu :

İlk olarak yapılması gereken , NFS de yapılması istenen portmap protokolünü çalıştırmaktır. NFS başlatılmadan önce konfigürasyon ayarları yapılmalıdır. Sadece bir konfigürasyon dosyası vardır ve /etc/exports olarak bilinir. Her satır ihraç yerini ve erişime sahip istemcilerin listesini işaret etmektedir. Her istemci adının sonuna parametre eklemek mümkündür. ‘man exports’ sayfası istemci adları ve parametreler için söz dizimini açıklar. Istemci adları için izin verilen biçimler şunlardır ;

  • Alan adının başındaki ‘wildcard’ karakteri (acemipenguenler-*.alanadi.tr)
  • NFS kullanılıyorsa bir ‘netgroup’
  • Bir IP adresi

Server kurulumu için terminal ekranına yazılması gereken komut apt-get install nfs-common nfs-kernel-server

Client kurulumu için ise apt-get install nfs-common

NFS konfigürasyon seçenekleri ;

/home/olgu/Masaüstü/nfs 192.167.0.22(ro,sync) Belirtilen IP adresine yazma okuma ve zamanlı çalışma kipinde bağlantı izni verir.

/home/olgu/Masaüstü/nfs 192.167.2.0/24(ro,sync)

NFS Servis için senaryomuz şöyle olsun;

Sunucu X : NFS Server

Sunucu Y : NFS Client

Sunucu X ‘in işlem adımları (server için);

apt-get install nfs-common nfs-kernel-server

mkdir /home/olgu/nfs

touch /home/olgu/nfs/test.txt

echo “Pardus NFS Test”> /home/olgu/nfs/test.txt

chmod 777 -R /home/olgu/nfs

/home/olgu/nfs 192.167.0.22(rw,sync) ardından nfs servisi yeniden başlatılır.

Sunucu Y işlem adımları (Client);

apt-get install nfs-common

mkdir /home/olgu/nfs_local

mount -t nfs 192.167.2.0:/home/olgu/ortak/home/olgu/Acemipenguen

#FSTAB eklenmek istenirse ;

192.167.2.0:/home/pardus/nfs~/yedek nfs defaults 0 0

Sistem yeniden başlatılır yada mount -a kullanılır.

python -m SimpleHTTPServer

Kurulum seçeneklerinin önemlileri şunlardır ;

  • ro (read only) : İstemci ihraç edilen dosyayı sadece okuyabilir.
  • rw (read write) : İstemci ihraç edilen dosyayı okuyabilir ve ona yazabilir.
  • root_squash : Bir kullanıcının ‘root’ olarak ‘root’ izni ile yazamaması tercih edilir. no_root_squash kullanılarak önüne geçilebiririz.
  • all_squash : İhraç edilen sisteme erişen tüm kullanıcılar ‘nobody’ kullanıcısına ait UID/GID i kullanır.
  • anonuid , anongid : ‘nobody’ kullanıcısı bu seçeneklerle UID ve GID i kullanır.

NFS Kullanım Avantajları ;

  • Yerel bir işletmede tüm kullanıcılar tek bir bilgisayar üzerindeki aynı disk alanını paylaşabilirler. NFS’nin NIS ile birlikte kullanımı sayesinde bir kullanıcı herhangi bir makinaya girip diğer kullanıcılarla birlikte aynı dosya yapısı ile çalışabilir.
  • Paylaşım sayesinde büyük disk alanı isteyen programlar tek bir sunucuda toplanabilir ve bu sayede önemli miktarda diskten tasarruf sağlanabilir.
  • Bir makina üzerinde yapılan değişiklik , her makinada yapılmış gibi olur. Böylece ayni yazılımı ağ içerisinde olan diğer bilgisayarlara yükleme zorunluluğu ortadan kalkar.

Kaynaklar ;

NFS ile ilgili aktaracaklarım bu kadar arkadaşlar bir sonraki yazımda görüşmek üzere 🙂

Olgu Koze

Apache Web Server Kurulumu

GİRİŞ:

Apache, açık kaynak kodlu ve özgür bir web sunucu programıdır.Bugün internette web sunucuların %60’ını Apache oluşturmaktadır. Sağlamlık, güvenilirlik ve yüksek performansın yanı sıra Apache’nin bu yaygınlığının en önemli nedenleri de çok esnek olmasıdır. Gereksinimlere göre Apache’ye birçok modül eklenerek web üzerinde hemen her uygulama gerçekleştirilebilir.

KURULUM:

#apt-get install apache2

Kurulum bitince Firefox’u açıp adres satırına http://localhost yazıldığında,tarayıcıya “It works!” başlıklı metin geldiyse kurulum sorunsuz tamamlanmış demektir.

 

 

 

 

 

 

 

 

 

 

 

APACHE WEB SUNUCU SERVİS İŞLEMLERİ:

/etc/init.d/apache2 start

/etc/init.d/apache2 stop

/etc/init.d/apache2 reload

/etc/init.d/apache2 restart : Apache servisini yeniden başlatır.

/etc/init.d/apache2 status

/etc/init.d/apache2graceful-stop: Apache servisini durdurur ancak mevcut bağlantılar sonlanana kadar bekler.

apachectl configtest :Konfigürasyon dosyasını control eder.

APACHE TEMEL PARAMETRELER:

ServerAdmin

ServerName

ServerAlias

DocumentRoot

DirectoryIndex

Listen

Port

Error Log

Access Log

APACHE WEB SERVİSİNE YENİ BİR SİTE EKLEME:

1-Web siteleri için dizin oluştur:Web sitesi dosyalarını saklamak için her alan adı için ayrı bir dizin oluşturmamız gerekir. Varsayılan olarak, belge kökü / var / www / html olacaktır.

mkdir /var/www/html/pardus.org.tr

sudo chown -R www-data:www-data /var/www/html/pardus.org.tr

cd /var/www/html/pardus.org.tr

2- Html dosyamıza içerik ekliyoruz.

sudo vi index.html

<HTML>

          <HEAD>

          <TITLE> Anadolu Parsı

          </TITLE>

          </HEAD>

           <BODY>

                    <H1> Anadolu Kaplanı </H1>

                    Pardus ismi Anadolu Parsından gelir.

           </BODY>

</HTML>

3-VirtualHost dosyaları oluşturma:Bu adımda, alan adlarının her biri için virtualhost dosyaları oluşturacağız. Bu sanal konak dosyaları, web sunucusuna her bir web sitesi isteği için doğru dosyaları işleyeceklerini söyler.

Varsayılan olarak, istekte varsayılan Apache web sunucusu sayfasının yüklenmesine yardımcı olan “000-default.conf” adlı virtualhost dosyası olacaktır.

Web sitemiz için varsayılan yapılandırmayı kopyalayacağız ve pardus.org.tr alan adıyla çalışmak için bazı değişiklikler yapacağız.

sudo cp -a /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/pardus.org.tr.conf

4-Yukarıdaki komut, 000-default.conf içeriğini pardus.org.tr.conf’a kopyalayacaktır. Şimdi pardus.org.tr.conf dosyasını pardus.org.tr alan adının isteğini kabul edecek şekilde değiştireceğiz.

sudo vi /etc/apache2/sites-available/pardus.org.tr.conf

ServerName pardus.org.tr

ServerAdmin ozgun@pardus.org.tr

ServerAlias www.pardus.org.tr

DocumentRoot: /var/www/html/pardus.org.tr

ErrorLog ${APACHE_LOG_DIR}/pardus.org.tr_errorlog

CustomLog ${APACHE_LOG_DIR}/pardus.org.tr_access.log combined

 

 

 

 

 

 

 

 

 

 

 

 

4- Kısayol oluşturuyoruz.

sudo ln -s /etc/apache2/sites-available/pardus.org.tr.conf /etc/apache2/sites-enabled/pardus.org.tr.conf

5- Chown komutuyla sitemize apache2 (www-data:www-data) sahipliği ekliyoruz.

sudo chown -R www-data:www-data /var/www/html/pardus.org.tr

6- Apache2 servisini tekrar başlatıyoruz.

systemctl restart apache2

7-VPS’ye gösterilen gerçek bir alan adı kullandıysanız, sadece web tarayıcısından bu alan adını yükleyebilirsiniz. Aksi takdirde, sahte alan adını web sunucunuzun IP adresine yönlendirmek için yerel ana bilgisayar dosyasını düzenlemeniz gerekir

sudo vi /etc/hosts

(0.0.0.0 pardus.org.tr eklenir)