traceroute
traceroute komutu bir sunucuya erişene kadar gidilen yolu tespit etmeye yarar. Bunun için bu yol boyunca uğradığı bütün sunuculara ICMP paketleri gönderir. Van Jacobson traceroute programını 1987'de geliştirmiştir ve aslında ping'in yaptığından farklı neredeyse hiçbir şey yoktur. Sadece ping'i doğru şekilde kullanarak çok faydalı bir araç geliştirmiştir. İlerleyen yıllarda Mike Muss (ping'in gelişricisi) bu kullanım şeklini atladığını, bu fikri geliştirdiği için de Van Jacobson'ı resmen kıskandığını ifade etmiştir.
I was insanely jealous when Van Jacobson of LBL used my kernel ICMP support to write TRACEROUTE, by realizing that he could get ICMP Time-to-Live Exceeded messages when pinging by modulating the IP time to life (TTL) field. I wish I had thought of that! :-) Of course, the real traceroute uses UDP datagrams because routers aren't supposed to generate ICMP error messages for ICMP messages.
Nasıl çalıştığını anlamak için ping komutunda karşımıza çıkan (ancak üstünde durmadığımız) TTL (Time To Live) mekanizmasını anlamak gerekir.
TTL
TTL basitçe, gönderdiğimiz paketin kaç noktadan geçmesine izin verdiğimizi ifade eder. Ping programını incelerken kullandığımız örneklerde genellikle bu değerin 54 olduğunu gördük. Bu şu anlama geliyor, "bu paket en fazla 54 noktadan geçebilir, daha fazlasına iletilmemeli."
Ağ'daki (internet veya yerel ağ, fark etmez) her nokta (sunucu, router vb.) kendisine gelen paketin TTL'ine bakar, eğer bu değer 1'den büyükse, değeri 1 azaltıp bir sonraki noktaya iletir, eğer değer 1'se, o zaman paketi göz ardı, eder, ICMP hata pakedi gönderir ve bu bilgi içerisinde kendi IP adresi de yer alır.
Öyleyse uzaktaki bir sunucuya ping atarken, eğer TTL değerimizi aradaki router sayısından daha küçük tutarsak, bu paket hedef sunucuya asla ulaşmaz, ancak arada bir noktadan cevap alırız.
Örneğin google.com sunucusuna ping atmak istersek, ancak TTL değerini 1 tutarsak,
TTL değerimizi 2'ye çıkardığımızda,
Giderek artırırsak, Google'a ulaşana kadar geçtiğimiz yolu deşifre edebiliriz...
Yukarıdaki örneklerde, Google'a ping pakedi (ICMP echo) gönderdik, ancak TTL'ini sırayla 3, 4, 5 yaptık. Yani "paket yola çıksın ama 3 router/hop noktası geçebilsin en fazla" dedik. 4. hata noktasında da bize cevap gönderdi. Aynı işlemi birer birer artırarak her hata aldığımız router/hop noktasından cevap toplamış olduk.
Traceroute programı da aslında arka planda bu mantığı uygular. Sırasıyla ICMP paketlerimizin TTL'ini artırarak ilgili noktaya ulaşana kadar bu işi tekrar eder.
Kullanımı
Kullanımı gayet basittir ve çıktısı aşağıdaki gibidir.
Yukarıdaki çıktıyı incelediğimizde, 11 noktadan sonra Google'a erişebildiğimiz görüyoruz. Gerçekten de TTL 11 ile ping atarsak, Google'un cevap vereceğini görebiliriz.
Ancak arada bazı noktalarda "*" işaretleri mevcut. Bu işaretler, ilgili sunucuya giderken pinglenen noktaların cevap vermediği, veya DNS çözümlemesinde hata yaşandığı gibi pek çok şeyi ifade edebilir.
Farkındaysanız 9. satırda başta bir "*" işareti var, sonra satır normal devam ediyor. Bunun sebebi, traceroute her noktayı pinglerken, 3 defa deniyor. Belli ki denemelerinden birinde başarısız olmuş. Her satır için 3 farklı ms değeri olması, ancak 9. satırda sadece 2 farklı ms değeri olması da bundan kaynaklanmaktadır.
Her nokta (hop) için yapılacak pingleme (query) miktarını -q
parametresiyle değiştirebilirsiniz. Ayrıca hostname çözümlemesi yapmayıp, doğrudan çıktıda IP adreslerinin görünmesini de -n
ile sağlayabilirsiniz.
Traceroute algoritmasında TTL değerinin 1'den başladığını ifade etmiştik. Dilerseniz bu değeri 1'den başlatmak yerine farklı değerle taramaya başlayabilirsiniz.
ICMP, UDP ve TCP Kullanımı
traceroute'un çalışma prensibini anlamak için ping komutunu farklı TTL'ler kullanarak denedik. Aslında traceroute komutu, parametre belirtilmediğinde ping atarak bu işlemi gerçekleştirmez, ancak mekanizmanın rahat anlaşılması için bu yöntemi tercih ettik.
traceroute programı, parametre kullanılmadığında UDP ile yol çıkarmaya çalışır. Bunu nasıl yaptığını ve sebebini aşağıda inceleyeceğiz, ancak traceroute ile istediğimiz metodu kullanarak yol çıkarmak mümkün, yeter ki ağ yapısı buna müsaade etsin.
Bağlantı tipini belirlemek için -M
(method) parametresi kullanılır. Örneğin TCP yöntemini seçmek için
NOT: MS Windows sistemlerde traceroute programı tracert
ismiyle bulunur. Bunun sebebi, eski DOS sistemlerinde dosya isimlerine getirilen kısıtlamadır. Eski DOS sistemlerinde dosya adları en fazla 8 karakter olabilir, dosya uzantıları ise 3 karakter olabilirdi. Bunun için programı tracert.exe
olarak isimlendirmişlerdir. Bu programın bir diğer farklılığı, standart tarama mekanizması olarak UDP değil, ICMP paketleri kullanmasıdır.
UDP ile Kullanımı
Daha önce belirttiğimiz gibi, traceroute programı GNU/Linux üzerindeki dağıtımında parametre belirtilmeyince bu tekniği kullanır. UDP taramasıyla program, karşı tarafın UDP üzerinde bir servis çalıştığı "düşünülmeyen" portlarına datagram gönderir. Eğer karşı tarafta gerçekten bu portlarda bir servis çalışmıyorsa, cevap olarak "Destination Port Unreachable" içerikli bir ICMP paketi gönderir.
traceroute UDP üzerinden tarama yaparken, 33434 portundan başlar, her hop'ta değeri bir artırır.
ICMP ile Kullanımı
Bu yöntemi kullanmak için -M icmp
veya -I
parametreleri tanımlanır. traceroute programının algoritmasını anlatırken belirttiğimiz gibi ICMP paketleri kullanır, özetle karşı tarafı ping'leyebiliyorsanız, bu yöntemi kullanabilirsiniz.
TCP ile Kullanımı
Aslında çok sık kullanılması gereken bu yöntem, biraz tecrübe gerektirdiğinden standart olarak sunulmaz, bu durum bir çok kişinin yol çıkarma işlemini doğru yapamamasına sebep olur. Pek çok firewall UDP paketlerini belirli port aralığı haricinde (DNS vb.) engeller, ICMP paketlerinin de engellenmesi çok sık karşılaşılan bir durumdur. Ancak ağ yöneticilerinin neredeyse her zaman izin verdiği bir takım servisler TCP üzerinden çalışır. Örneğin tarayacağımız ağ üzerinde çok büyük ihtimalle HTTP protokolünün standart portu olan TCP 80 izin veriliyordur. Bu durumdan faydalanarak firewall engellerini aşabiliriz. 80 en yaygın kullanılan olduğu için, standart port olarak belirlenmiş, ancak farklı port belirtmek de mümkün.
TCP taraması yapılırken, karşı tarafta bir bağlantı açmış olmayız. Normal şartlar altında bir TCP bağlantısı şu şekilde gerçekleştirilir:
Karşı tarafa SYN paketi gönderilir
Karşı taraftan SYN+ACK paketi alınır
Karşı tarafa ACK paketi gönderilir
Yukarıda tanımlanan "three-way handshake" ile iki sunucu arasında bir TCP bağlantısı kurulmuş olur. Son aşamada, ACK paketi geldikten sonra bağlantı başlayacağından, sunucu üzerindeki bir yazılım ancak bu aşamada bir bağlantı geldiğinden haberdar olur.
Ancak traceroute aşağıdaki yöntemi izler.
Karşı tarafa SYN paketi gönderilir
Karşı taraftan SYN+ACK paketi alınır
Karşı tarafa RST paketi gönderilir
Son aşamada RST paketi gönderdiğimiz için karşı taraftaki hiçbir yazılım bizim SYN paketi veya RST paketi gönderdiğimizi görmez. Ancak network trafiğinin detaylı analiziyle (veya firewall yardımıyla) bu mümkün olur. Traceroute programının kullandığı bu bağlantı biçmine "half-open" (yarı-açık) teknik denilir.
"Half-open" tekniği yerine programın gerçek bir TCP bağlantısı sunan, yani SYN -> SYN+ACK -> ACK şeklinde bağlantı kuran parametresi de mevcuttur. -M tcpconn
ile bu sağlanabilir. Ancak bu durum tavsiye edilmez, hem karşı tarafta dinleyen servis gelen rastgele pakete ne cevap vereceğini bilmeyebilir, hem de application seviyesinde bağlantı kurduğunuz karşı tarafın loglarında yer alır.
Last updated