2 puan yazan GN⁺ 2023-09-11 | 1 yorum | WhatsApp'ta paylaş
  • Linux’un, İnternet Kontrol Mesajı Protokolü’nü (ICMP) kullanan ping komutu için Ağ Adresi Çevirisi’ni (NAT) nasıl gerçekleştirdiğini açıklayan bir yazı
  • Yazar, ICMP paketleri için NAT’ın nasıl çalıştığını anlamak amacıyla Linux ağ kodunu inceliyor; ICMP paketlerinde port alanı yok
  • Yazar, tek bir Linux makinede birden fazla cihazı simüle etmek için ağ ad alanlarını kullanan bir deney düzeneği kuruyor ve NAT sürecini test etmek için ping komutunu kullanıyor
  • Deney; bir köprüye bağlı iki istemci oluşturmayı, NAT kutusu ile sunucunun bağlanmasını ve yönlendirme ile NAT yapılandırmasını içeriyor
  • Yazar, istemci ve sunucu ağ ad alanlarında ICMP paketlerini yakalıyor ve paket verilerini analiz ediyor
  • Yazar, her istemcinin farklı bir "id" alanına sahip olduğunu ve NAT kutusunun bu sayede her istemciye iletilecek yanıt paketlerini ayırt edebildiğini keşfediyor
  • Yazar, ID’nin nasıl seçildiğini anlamak için Linux kaynak kodunu ve ICMP protokolünü tanımlayan RFC 792’yi inceliyor
  • Yazar, ping komutunun tanımlayıcıyı rastgele seçtiğini; farklı ana makinelerdeki iki ping süreci aynı ID’yi seçerse Linux çekirdeğinin rastgele boş bir port seçtiğini ve bu portun ICMP paketinin ID’si olarak kullanıldığını keşfediyor
  • Yazar, çekirdek fonksiyonlarını izlemek ve netfilter koduna dair anlayışını doğrulamak için bpftrace adlı aracı kullanıyor
  • Yazının vardığı sonuç şu: Linux, her istemci için bir bağlantı oluşturarak ping için NAT uygular; giden paketlerde kaynak IP adresini ve/veya ICMP id alanını yeniden yazar, ardından yanıt paketlerinde bu değişiklikleri tersine çevirir
  • Yazı, temel teknik bilgiye sahip giriş seviyesindeki yazılım mühendislerinin de anlayabilmesi için sürece dair ayrıntılı adım adım açıklamalar sunuyor

1 yorum

 
GN⁺ 2023-09-11
Hacker News yorumu
  • Linux ağ adresi çevirisinin (NAT) ping isteklerini nasıl işlediğine dair bir yazı
  • Sunucu, sabit bir adrese sabit ICMP echo request paketleri gönderiyor ve bunların geri dönmesi beklenmiyor
  • İstemci bağlanmaya çalıştığında, sunucuya ICMP time exceeded paketi gönderiyor; bu paket, sunucunun gönderdiği "orijinal" sabit paketi de içeriyor
  • İstemci, internetteki bir hop gibi davranarak sunucuya orijinal paketin iletilemediğini bildiriyor
  • NAT cihazı, istemcinin tam IP başlığını içeren ICMP time exceeded paketini NAT arkasındaki sunucuya iletiyor; böylece sunucu istemcinin IP adresini öğrenebiliyor
  • Yerel ağdan internetteki bir cihaza ping gönderildiğinde, NAT yapan yönlendirici ping'in kaynak adresini genel IP adresiyle yeniden yazar ve ICMP paketinin ID alanını benzersiz bir değerle değiştirir
  • Yönlendirici, yanıtı yerel ağdaki doğru cihaza ulaştırmak için bu benzersiz ID değerini kullanır
  • Gönderi, paketlerle oynama, ağ adresi çevirisi ve paket filtreleme için kullanılan Netfilter adlı araca dair kaynaklar da sunuyor
  • Yazı, kaynak koduna kadar tüm soyutlama katmanlarını derinlemesine inceleyen analizi nedeniyle övgü alıyor
  • ICMP'de port olmadığından, NAT'in ICMP echo reply paketlerini doğru porta geri gönderme sorununu ele alması gerekmiyor
  • ICMP echo request içinde bir ID bulunur ve bu fiilen kaynak port numarasıyla aynı işlevi görür
  • ICMP echo için NAT işlemi, UDP'de kaynak portunun yeniden eşlenmesine benzer şekilde, ID'nin her iki yönde de yeniden eşlenmesini gerektirir
  • Bazı kullanıcılar, zaman içindeki değişiklikler nedeniyle blog yazısında belirli kod satırlarına bağlantı verilmesinden şikayet ediyor
  • Bazı kullanıcılar NAT'i kötü bir soyutlama olarak eleştiriyor ve IPv4'ün sonlandırılması çağrısında bulunuyor
  • Merkezi bir sunucu olmadan, UDP üzerinden ping kullanarak eşler arası ağ iletişimi için kısa mesajlar göndermenin mümkün olup olmayacağına dair spekülasyonlar var
  • Yazı, ICMP paketlerinde bir ID alanı bulunduğunu ve Netfilter'ın ICMP paketlerini "özel durum" olarak ele aldığını açıklayarak özetleniyor