12 Ağustos 2016 Cuma

"Traceroute" Nasıl Çalışır?

İnternette "traceroute" programının ne işe yaradığına dair -doğru, yanlış- birçok bilgi olmasına rağmen bu programın çalışma prensibine dair pek fazla doyurucu doküman bulunmamakta. (İngilizce olarak bazı bilgilere ulaşmak mümkün olsa da bu konuyla ilgili Türkçe bilgi bulmak oldukça zor.) Bundan dolayı bu yazıda "traceroute" programının çalışma prensibini anlatmayı düşünüyorum.
 
Bundan önce TTL (time to live) kavramından kısaca bahsetmekte fayda var. TTL, IP başlığında (IP header) yer alan bir baytlık bir alandır. TTL değeri, IP paketinin oluşturulduğu işletim sistemi tarafından belirlenir ve işletim sisteminden işletim sistemine farklılık gösterir. IP paketi hedefine doğru giderken, her bir "hop"ta IP başlığında yer alan bu TTL değeri "bir" düşürülerek bir sonraki "hop"a gönderilir. TTL değeri "1" olan bir IP paketini alan bir yönlendirici bu paketi düşürür. Böylece IP paketlerinin ağ üzerinde sonsuz bir şekilde dolaşmasının önüne de geçilmiş olunur. Yani IP başlığında yer alan TTL alanının temel amacı, ağlarda ortaya çıkması muhtemel IP yönlendirme döngülerinin (IP routing loop) zararlarını en aza indirmektir.
 
Bu bilgilerden sonra "traceroute" programının nasıl çalıştığına gelelim.

Yazıya başlamadan önce bir başka noktayı daha hatırlatmakta fayda var: Yazımızda IP paketlerinin geçtiği her "hop"u yönlendirici (router) olarak adlandırdık. Fakat bu "hop"ların yönlendirici olmasına gerek yoktur. Bu "hop"ların yönlendirme yapabilen herhangi bir cihaz olması yeterlidir. Normal bir bilgisayar, bir sunucu ya da bir üçüncü katman anahtarı da yönlendirme yapabilmektedir.
Örneğimizde bilgisayarımızın 216.58.212.36 adresine "traceroute" yapmaya çalıştığını farzediyoruz. Bilgisayarımız bu adrese gitmeye çalışırken üç adet yönlendiriciden geçtiğini düşünüyoruz. Birinci "hop" 61.61.61.61, ikinci "hop" 72.14.218.250 ve üçüncü "hop" da 176.22.1.20 olsun. Bundan sonra da hedef IP adresimiz olan 216.58.212.36 ulaşıyoruz.. Yani:
 
192.168.61.1 -> 61.61.61.61 -> 72.14.218.250 -> 176.22.1.20 -> 216.58.212.36
 
Bilgisayarımız ilk olarak kaynak IP adresi kendi IP adresi olan üç adet paket oluşturur. Bu paketlerin hedef IP adresinde hedefimiz olan 216.58.212.36 IP adresi vardır. Oluşturulan bu paketlerinin IP başlıklarının içindeki TTL değerleri de "1" yapılmıştır. ("traceroute" da hedefe her defasında üç adet paket gönderilir.)
 
Bu paketler ilk olarak 61.61.61.61 IP adresine sahip olan yönlendiriciye ulaşır. 61.616.61.61 IP adresine sahip olan yönlendirici TTL değeri "1" olan bir IP paketi aldığı zaman bu IP paketini bir sonraki "hop"a yönlendirmez ve bu IP paketini düşürür. IP paketini düşürdükten sonra da paketin gelmiş olduğu IP adresine (yani bizim bilgisayarımıza) bir ICMP mesajı gönderir. Bu ICMP mesajının adı "TTL time exceeded" mesajıdır. Bu mesaj, ICMP başlığındaki Type:11 ve Code:0 değerlerine denk gelmektedir.

Bilgisayarımız bu durumda bir sonraki "hop"undan bir adet "TTL time exceeded" mesajı almıştır. Bu alınan mesajdan sonra bilgisayarımız hedef IP adresinde 216.58.212.36 olan üç adet IP paketi daha oluşturur. Bu sefer bu IP paketlerinin TTL değeri "2" yapılmıştır. Bu paketler ilk olarak 61.61.61.61 IP adresine giderler. 61.61.61.61 IP adresine sahip olan bilgisayar "2" olan TTL değerini "1" yaparak paketi bir sonraki "hop" olan 72.14.218.250 IP numaralı yönlendiriciye gönderir.

72.14.218.250 IP numaralı yönlendiriciye gelen IP paketinin TTL değeri "bir" azaltılarak "0" yapılır. 72.14.28.250 IP numaralı yönlendirici TTL değeri "0" olan bu IP paketlerini bir sonraki yönlendiriciye göndermez ve bu paketleri düşürür. Bu IP paketlerinin gelmiş olduğu kaynak IP adresine de -yani bizim bilgisayarımıza- "ICMP TTL time exceeded" mesajını gönderir.

Bilgisayarımız bu durumda iki tane "TTL time exceeded" mesajı almıştır.
 
Bu alınan ikinci "ICMP TTL time exceeded" mesajından sonra bilgisayarımız hedef IP adresinde 216.58.212.36 olan üç adet daha IP paketi oluşturur. Bu IP paketlerinin başlığındaki TTL değeri bu sefer "3" yapılmıştır. Bu IP paketleri ilk olarak 61.61.61.61 IP numaralı yönlendiriciye gider. Burada TTL değerleri "bir" düşürülerek "2" yapılır. Bu paketlerin bir sonraki durağı 72.14.218.250 IP numaralı yönlendiricidir. Bu yönlendirici almış olduğu bu IP paketlerinin TTL değerlerini "bir" düşürerek "1" yapar ve IP numarası 176.22.1.20 olan bir sonraki yönlendiriciye gönderir. Bu yönlendiricide IP paketlerinin TTL değeri "bir" azaltılarak "0" yapılır. 176.22.1.20 IP numaralı yölnendirici TTL değeri "0" yapılmış olan bu IP paketlerinin düşürür ve bu paketlerin gelmiş olduğu kaynak IP adresine -yani bizim bilgisayarımıza- "ICMP TTL time exceeded" mesajını yollar.
Bilgisayarımız bu durumda üç adet "ICMP TTL time exceeded" mesajı almıştır. Bundan sonra bilgisayarımız hedef IP adresinde yine 216.58.212.36 olan üç adet IP paketi daha oluşturur. Bu IP paketlerinin TTL değerleri bu sefer "4" yapılır. IP paketleri 61.61.61.61 IP numaralı yönlendiriciye geldikleri zaman TTL değerleri "3", 72.14.218.250 IP numaralı yönlendiriciye geldikleri zaman TTL değerleri "2", 176.22.1.20 IP numaralı yönlendiriciye geldikleri zaman da TTL değerleri "1" yapılır. 176.22.1.20 IP numaralı yönlendiriciden sonra IP paketleri 216.58.212.26 IP numaralı hedef bilgisayarımıza gelir. Hedef bilgisayarımız bu IP paketlerine "ICMP Echo Reply" mesajıyla cevap verir. Çünkü gelen IP paketlerinin "Hedef IP" kısmında kendi IP adresi yer almaktadır. ICMP Echo Reply mesajı, ICMP başlığında Type:0 Code:0 değerlerini almaktadır.

"ICMP Echo Reply" mesajını alan bilgisayarımız göndermiş olduğu IP paketlerinin hangi yönlendiricilere uğramış olduğunu görmüş olur. Son olarak "ICMP Echo Reply" mesajını almış olduğu için de aynı hedefe başka IP paketi göndermez. Böylece "traceroute" işlemi de sonlandırılmış olur.

 

5 Ağustos 2016 Cuma

Suricata Rule Thresholding


Three types of threshold values can be defined in Suricata rules: limit, threshold and both. I want to make some further explanations about them because this concept may be a bit confusing.

The notation of rule thresholding in Suricata is shown below:

threshold: type <threshold|limit|both> track , count <M>, seconds <T>

type threshold
Type threshold alerts every M times we see this event during the time interval.

threshold: type threshold track by_src, count 4, seconds 360;

In the above example the rule generates "1" alarm everytime the event is met "4" times in "360" seconds.

The figure below depicts "type threshold":

type limit
Type limit alerts on the 1st M events during the time interval, then ignores events for the rest of the time interval. 

threshold:type limit, track by_src, count 4 , seconds 360;

In the above example the rule generates "4" alarms if the event is met first "4" times in "360" seconds. After the detections it doesn't generate any alarms in the rest of the 360 seconds.

The figure below depicts "type limit":
 
type both
Type both alerts once per time interval after seeing M occurrences of the event, then ignores any additional events during the time interval.

threshold:type both, track by_src, count 4 , seconds 360;

In the above example the rule generates "1" alarm if the event is met "4" times in "360" seconds. After the detection it doesn't generate an alarm in the rest of the 360 seconds.

The figure below depicts "type both":