Ana içeriğe geç

Bölüm 25: Adres Çözümleme: ARP

8 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak kitabının bir bölümü: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine inip karşı taraftan geri dönen uzun bir teknik yolculuk.

Kısım 4: Makineden Yerel Ağa (Bölüm 18-29)

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. DNS Kayıtları
  6. Önbellek, Tazelik ve Güven
  7. Port Numarası ve Soket
  8. Bağlantısız Taşıma: UDP
  9. Üç Adımlı El Sıkışma
  10. Simetrik Şifreleme
  11. Açık Anahtarlı Kriptografi
  12. TLS El Sıkışması
  13. Sertifika Zinciri
  14. HTTP Mesajının Anatomisi
  15. Durum, Çerez ve Oturum
  16. HTTP/2'den HTTP/3'e
  17. İçerik Dağıtım Ağları
  18. Diğer Uygulama Protokolleri
  19. Katmanlı Mimari
  20. Hizmet ve Protokol
  21. Encapsulation ve Başlıklar
  22. Paket Yakalama ve Çözümleme
  23. Ağ Interface Kartı
  24. Fiziksel Adresleme
  25. Hata Sezme ve CRC
  26. Adres Çözümleme: ARP
  27. Ortam Erişimi: CSMA/CD
  28. Switch'ler
  29. Ağ Topolojileri
  30. Sanal Yerel Ağlar
  31. Kablosuz Erişim: 802.11
  32. Radyo Kanalı ve Kapasite
  33. Kablosuz Ağ Güvenliği
  34. Hücresel Ağlar
  35. Spektrum ve Kuşaklar
  36. Hareketlilik ve Aktarma
  37. Adres Kiralama: DHCP
  38. Adresin Anatomisi
  39. Adres Tükenmesi ve IPv6
  40. Router Mimarisi
  41. Kuyruk Yönetimi
  42. Cihaz Yapılandırma
  43. Routing Protokolleri
  44. Kontrol Düzlemi ve SDN
  45. Ağ İzleme ve Yönetimi
  46. Alanlar Arası Routing
  47. Adres Çevirisi
  48. Ara Kutular
  49. Tünelleme ve IPsec
  50. Firewall'lar
  51. Ağ Saldırıları
  52. Operatör ve Metro Ağları
  53. Bitten Sinyale
  54. Sembol Hızı ve Kanal Kapasitesi
  55. Multiplexing Teknikleri
  56. İletim Ortamları
  57. Bakır Kablo Sonlandırma
  58. Fiber Sonlandırma
  59. Fiber Optik İletim
  60. Bakır Erişim Ağı: DSL
  61. DSL'de Hız ve Mesafe
  62. Pasif Optik Ağlar
  63. Kablo Erişim Ağları
  64. Kablo Modem ve CMTS
  65. Denizaltı Kabloları
  66. Veri Merkezi Ağları
  67. Encapsulation Çözme
  68. Güvenilir Aktarım
  69. Tıkanıklık Denetimi
  70. Trafik Çözümleme
  71. Gecikme Bütçesi
  72. Soket Programlama
  73. Eşten Eşe ve Protokol Tasarımı
  74. Uyarlanır Video Akışı
  75. Gerçek Zamanlı Ses ve Görüntü
  76. Kablosuz Sensör Ağlarının Mimarisi
  77. Sensör Ağlarında Ortam Erişimi
  78. Sensör Ağlarında Yönlendirme ve IP
  79. Zaman Eşitleme ve Konum Bulma
  80. Sensör Ağı Uygulamaları
  81. Mobil Kablosuz Sensör Ağları
  82. Son Söz

Frame’in sonuna dört baytlık FCS’yi koyduk; başındaki iki adres alanı da tanımlıydı. Elinde ise yalnızca bir IP adresi var ve aradaki eşlemeyi kimse önceden yapmadı.

Geriye tek bir iş kalıyor: sormak. Ağda sormak ise harfi harfine bağırmak demek. Peki bağırınca kim cevap veriyor?

Soru sorulmadan önce bir karar veriliyor

Makinen frame’i yazmadan önce sessiz bir hesap yapıyor. Hedef IP adresini ve kendi adresini alt ağ maskesinden geçiriyor. Maske, adresin hangi kısmının ağı, hangi kısmının makineyi gösterdiğini söyleyen bir sayı; ayrıntısını 37. bölümde açacağız. İki sonuç aynıysa hedef aynı ağda oturuyor; farklıysa hedef uzakta kalıyor.

Somut bir örnek üstünde yürüyelim. Adresin 192.0.2.10 ve maskesi 255.255.255.0 olsun. Hedef 192.0.2.40 ise maskeden geçen iki sonuç da aynı çıkıyor; komşusun. Hedef 198.51.100.5 olsaydı sonuçlar ayrışacak ve soru o makine için hiç sorulmayacaktı.

Uzak hedefte ARP hedefin kendisi için sorulmuyor, default gateway (varsayılan geçit) için soruluyor; yani makinenin, kendi ağında olmayan her şeyi teslim ettiği çıkış kapısı için. Frame’in hedef MAC adresi router’ın interface’i oluyor. Paketin içindeki hedef IP adresi ise olduğu gibi kalıyor. İki adres, iki ayrı katmanın işi; birbirlerinin yerine geçemezler.

Karar verildikten sonra ilk bakılan yer makinenin kendi ARP tablosu. Tablonun her satırı bir IP adresini bir MAC adresine eşliyor. Yeni açılmış bir makinede bu tablo boştur. Dolduran şey kullanımın kendisi: makine kiminle konuştuysa onun satırı orada durur. Kimse elle yapılandırmıyor.

Mahalle bakkalını düşün. Müşterisinin adını bilir ama kimin hangi kapıda oturduğunu ancak bir kez sorup deftere yazarak öğrenir. Defter ARP tablosuna, ad IP adresine, kapı numarası MAC adresine karşılık geliyor. Sınırları da aynı: bakkalın defteri sokağın dışına çıkmaz, ARP de kendi alt ağının dışını çözemez.

Yetkili sunucuya kadar giden ad çözme zincirini izlemiştin; burada aynı iş bir kat aşağıda, adresten karta doğru yapılıyor. Ağa yeni katılan bir makine bunu ilk saniyede yaşıyor: DNS sorgusunu taşıyacak frame için router’ın MAC adresi gerekiyor. İstek, sen farkına varmadan bir soruya bağlı bekliyor.

Neden broadcast’le soruluyor?

Tabloda kayıt yoksa makine soruyu ağa broadcast ediyor. Frame’in hedef MAC alanına FF-FF-FF-FF-FF-FF yazılıyor. Sebep sade: sorunun kime gideceği bilinmiyor.

Broadcast’i yerel ağdaki bütün düğümler alıyor. Standart, hedefi tümü bir olan her frame’i her istasyonun alıp işlemesini şart koşuyor. Hedef olmayan cihazlar, örneğin router, mesajı dikkate almadan atıyor. Ama atmadan önce almış ve işlemiş oluyorlar.

Ölçek tam burada gizleniyor. Belgeleme için ayrılmış 192.0.2.0/24 bloğunu örnek alalım; içinde 254 kullanılabilir adres var. Tek bir ARP isteği, soranın dışındaki 253 komşunun kartını uyandırıyor. Ağ kartının gelen frame’i halka tampona alıp kernel’a taşımasının bir bedeli vardı. O bedel burada 253 kez ödeniyor.

Cevap veren tek bir makine oluyor: istekteki IP adresinin sahibi. Cevap da broadcast’le dönmüyor, tek bir frame’le geliyor. Asimetri kasıtlı; cevabı yalnızca soranın duyması yeter.

Öğrenme çift yönlü işliyor. Cevabı alan makine eşlemeyi belleğine yazıyor ve bir daha sormuyor. Cevabı veren de soranın adresini kendi tablosuna ekliyor, çünkü ARP paketi soranın kendi IP ve MAC adresini de taşıyor. Soru sorarken kendini de tanıtıyorsun.

Sorunun kaç kapıya çarptığını ve cevabın kaç kapıdan döndüğünü görelim:

ARP: soru herkese, cevap tek kişiye
A · senin makinen192.0.2.10paylaşılan segment · 192.0.2.0/24 · broadcast domainB192.0.2.20C192.0.2.30router192.0.2.1D192.0.2.40192.0.2.40 kimde? · hedef FF-FF-FF-FF-FF-FFaldı, işledi, attıaldı, işledi, attıaldı, işledi, attıbenim adresim, cevap hazırla192.0.2.40 bende: 00-1B-44-11-3A-B7 · yalnızca A'yaA'nın tablosu: 192.0.2.40 → 00-1B-44-11-3A-B7D'nin tablosu: 192.0.2.10 → 3C-52-82-90-0F-21bir soru, iki tablo satırı · sonraki frame'ler sormadan gidiyor
Tablo boş, soru herkese gidiyor. A hedef MAC alanına FF-FF-FF-FF-FF-FF yazıyor, çünkü sorunun kime gideceğini bilmiyor. Frame segmentteki her karta ulaşıyor: B, C, router ve D aynı frame'i aynı anda alıyor.
  1. Tablo boş, soru herkese gidiyor. A hedef MAC alanına FF-FF-FF-FF-FF-FF yazıyor, çünkü sorunun kime gideceğini bilmiyor. Frame segmentteki her karta ulaşıyor: B, C, router ve D aynı frame'i aynı anda alıyor.
  2. Herkes alıyor, üçü atıyor. Dört kart da frame'i halka tampona alıp kernel'a taşıyor; bedel ödendikten sonra üçü sorudaki adresin kendisine ait olmadığını görüp paketi atıyor. Yalnızca 192.0.2.40'ın sahibi cevap hazırlıyor.
  3. Cevap tek bir frame'le dönüyor. D cevabı broadcast'le değil, doğrudan A'nın MAC adresine gönderiyor. Asimetri kasıtlı: cevabı yalnızca soranın duyması yeter; öteki kartlar bu frame'i hedef adreste eleyip hiç işlemiyor.
  4. İki taraf da deftere yazıyor. A cevaptaki eşlemeyi tablosuna yazıyor ve bir daha sormuyor. D de soranın adresini yazıyor, çünkü istek A'nın kendi IP ve MAC adresini taşıyordu. Bir soru, iki satır; gerçek bir /24 blokta aynı soru 253 kartı uyandırıyor.

Birbirinin broadcast frame’lerini alan düğümlerin tamamına broadcast domain (yayın alanı) deniyor. Broadcast yerine multicast kullanmak daha iyi bir fikirdi; ilk biti bir olan adresler multicast’ti ve IPv6’nın adres çözümlemesi, Neighbor Discovery, oraya yaslanıyor. Bu bağırışın nereye kadar gittiğini açık bırakıyorum; sınırını bir sonraki durakta çizeceğiz.

Bir yana: RARP ters yönü çözüyordu, MAC adresinden IP adresini öğreniyordu. Bu işi bugün 36. bölümde göreceğin DHCP yapıyor.

Paketin içinde ne var?

ARP’ın tanımı 1982 tarihli RFC 826. Yaptığı işin adı adres çözümleme: elindeki IP adresine karşılık gelen MAC adresini bulmak. Belgedeki paket biçimi dokuz alandan oluşuyor: donanım türü, protokol türü, iki adres uzunluğu, işlem kodu ve dört adres alanı.

Uzunluk alanları ilk bakışta fazlalık gibi duruyor. Fazlalık sayılmazlar. MAC adresi 6 bayt, IPv4 adresi 4 bayt ve ARP bu iki uzunluğu ayrı alanlarda ilan ediyor. Yani ARP IPv4’e gömülü bir protokol değil; hangi adres ailesini çözdüğünü paketin kendisi söylüyor.

ar$hrd  2 bayt  donanım türü
ar$pro  2 bayt  protokol türü
ar$hln  1 bayt  donanım adres uzunluğu   -> 6
ar$pln  1 bayt  protokol adres uzunluğu  -> 4
ar$op   2 bayt  işlem kodu               -> istek 1, cevap 2
ar$sha  6 bayt  gönderenin MAC adresi
ar$spa  4 bayt  gönderenin IP adresi
ar$tha  6 bayt  hedefin MAC adresi
ar$tpa  4 bayt  hedefin IP adresi
--------------------------------------------
                toplam 28 bayt

Alanları gerçek değerlerle doldurunca resim netleşiyor. Belgeleme için ayrılmış adresleri kullanayım. Örnek kart adresleri de uydurma sayılmaz; RFC 7042 belgeleme için 00-00-5E-00-53-00 ile 00-00-5E-00-53-FF arasını ayırmış. Soran makine 192.0.2.10, kartının adresi 00-00-5E-00-53-2A, aradığı adres ise 192.0.2.40 olsun. İstekte kendi adres ikilisini gönderen alanlarına yazıyor ve aradığı adresi hedef IP alanına koyuyor. Hedefin MAC adres alanını ise boş bırakıyor. Zaten bilseydi sormazdı.

Cevap da aynı dokuz alanı taşıyor, yalnızca roller yer değiştiriyor. Adresin sahibi kendi kartının adresini gönderen alanına yazıyor ve frame’i doğrudan soranın kartına yolluyor.

istek  (op 1)  gönderen  192.0.2.10 / 00-00-5E-00-53-2A
               hedef     192.0.2.40 / boş
               frame   hedef MAC  FF-FF-FF-FF-FF-FF

cevap  (op 2)  gönderen  192.0.2.40 / 00-00-5E-00-53-3C
               hedef     192.0.2.10 / 00-00-5E-00-53-2A
               frame   hedef MAC  00-00-5E-00-53-2A

Ethernet’in veri alanı en az 46 bayt olduğu için araya 18 bayt dolgu giriyor. Bir ARP isteği tel üstünde bu yüzden 64 baytlık asgari frame olarak gidiyor. Sorduğun soru, kablodaki en küçük frame.

Frame’in tür alanı 0x0806. Alıcı bu değere bakıp yükü ARP modülüne veriyor. Encapsulation merdiveninde bu tür alanını zaten görmüş ve değerini not etmiştin. ARP paketi bir data link layer frame’inin içinde taşınıyor ama network layer adreslerini içeriyor; iki katmanın tam sınırına oturuyor.

Gelen paketi alan makine sırayla üç şey soruyor: bu donanım türünü tanıyor muyum, bu protokolü konuşuyor muyum, hedef protokol adresi ben miyim. İşlem koduna en sonda bakılıyor. Üstelik gönderenin adres çifti tabloda zaten varsa, kod okunmadan önce güncelleniyor. Yani kimse sormadan gelen bir cevap da tabloyu tazeliyor.

Tablo ne kadar hatırlıyor?

Kayıtların bir ömrü var ama ne kadar olduğu sistemden sisteme çok değişiyor. Eski BSD sistemleri eşlemeyi 20 dakika hatırlıyordu, Cisco router’lar varsayılan olarak 4 saat hatırlıyor. Linux ve bugünkü Windows ise kaydı yalnızca yarım dakika kadar “erişilebilir” sayıyor; sonra onu bayat işaretleyip ilk kullanımda sessizce yeniden doğruluyor. Aynı protokolde ömür yüzlerce kat fark ediyor. Bu bir ihlal sayılmıyor, çünkü RFC 826 tablo yaşlandırmayı ve zaman aşımını zorunlu kılmıyor.

ARP tablosu bu yüzden alt ağdaki her makineyi içermez. Kimisi tabloya hiç girmemiştir, kimisinin süresi dolmuştur. Ağdan kopan bir makinenin kaydı da süresi dolunca kendiliğinden siliniyor. Eşlemeyi elle sabitlemek de mümkün; arp -s bir satırı statik yapıyor.

Şimdi adresini yeni alan bir makineye bak. RFC 5227, bir adresi kullanmadan önce 3 yoklama paketi göndermeyi kurala bağlıyor. Yoklamada gönderen IP alanı sıfır bırakılıyor; amaç, henüz sahiplenilmemiş bir adresle komşuların önbelleğini kirletmemek. Çakışma çıkmazsa makine 2 ilan paketi yolluyor. İlan, gönderen ve hedef IP alanı aynı olan bir ARP isteği. Bedava ARP (gratuitous ARP) dediğimiz şey bu. Adresini savunan makine iki savunma arasında en az 10 saniye bekliyor; iki çakışan makinenin ağı doldurmasını engelleyen sınır bu.

Aynı kural kötüye de kullanılıyor. Sahte bir cevap komşunun satırını sessizce değiştiriyor ve trafik saldırganın kartına akıyor; adı ARP zehirlemesi. Resolver’ın önbelleğine sahte kayıt yerleştiren ve orayı yaşam süresi boyunca elinde tutan bir saldırı vardı. Buradaki numara aynı fikrin bir kat aşağıdaki hâli. Ortaya çıkan sonuç, adını 10. bölümde koyduğumuz MITM saldırısı; bu kez yerel ağın içinde. Switch üstündeki dinamik ARP denetimi (Dynamic ARP Inspection), MAC adresi ile IP eşleşmelerini bilinen kayıtlarla karşılaştırıp bunu kesiyor.

Başkasının adresine cevap vermek her zaman saldırı sayılmıyor. Router aynı şeyi bilerek ve açıkça yapabiliyor: kendi ağında olmayan bir adres için sorulan ARP isteğine kendi MAC adresiyle cevap veriyor, yani “onu bana ver, ben iletirim” demiş oluyor. Adı proxy ARP. Soran makine hedefi komşusu sanıyor, frame’i router’a yazıyor ve paketi farkında olmadan geçitten geçiriyor.

Fikir, maskesi yanlış ayarlanmış ya da alt ağ kavramını hiç tanımayan eski makineleri kurtarmak için doğdu. Bugün açık bırakılması tavsiye edilmiyor ve sebebi öğretici: proxy ARP ile zehirleme aynı hamleyi yapıyor. Biri meşru, öteki saldırı, ama kabloda ikisi de “benim değil ama bana yolla” diyen bir cevap. Açık bırakılan bir proxy, gerçek bir zehirlemeyi de göze normal gösteriyor.

Bunların hepsini kendi makinende görebilirsin. Windows’ta tablo arp -a ile geliyor, Linux’ta ip neigh ile, Cisco router’da karşılığı show arp oluyor. Çıktının biçimi de öğretici. Her satırda bir IP adresi, karşısında bir MAC adresi ve kaydın türü duruyor.

Interface: 192.0.2.10 --- 0x5
  Internet Adresi       Fiziksel Adres        Tür
  192.0.2.1             00-00-5e-00-53-01     dinamik
  192.0.2.40            00-00-5e-00-53-3c     dinamik

Listedeki ilk satır neredeyse her makinede aynı işi görüyor: geçidin kaydı. Dinamik kayıtlar zamanla silinir, statik olanlar sen silene kadar durur. En hızlı deney de burada: bir satırı arp -d ile düşür, sonra o adrese tek bir paket yolla. Tablo kendini yeniden dolduruyor ve aradaki soruyu kimse sana sormuyor.

21. bölümde gösterim filtresiyle trafiği ayıklamayı öğrenmiştin; arp.opcode == 1 istekleri, arp.opcode == 2 cevapları getiriyor. Aynı adresi iki farklı kartın sahiplendiği anı ise arp.duplicate-address-detected yakalıyor.

Peki kimse cevap vermezse? Gönderen isteği tekrarlıyor, sonunda paketleri düşürüyor. Sessizlik görünür bir hataya dönüşüyor: soruyu soran bir router’sa kaynağa ICMP Hedef Bilgisayara Ulaşılamıyor (Destination Host Unreachable) mesajı gönderiyor, senin makinense aynı hatayı sana kendisi veriyor.

Özet

  • ARP tek bir soruyu çözüyor: elindeki IP adresinin hangi MAC adresine ait olduğunu bulur ve bunu yalnızca kendi alt ağının içinde yapabilir.
  • Soru broadcast’le gidiyor, cevap unicast dönüyor: isteği bütün komşular alıp işler, cevabı ise yalnızca adresin sahibi verir.
  • Öğrenilen eşleme saklanıyor: tablo kullanıldıkça dolar, kayıtların ömrü dolunca silinir; bu süreyi RFC 826 zorunlu kılmaz, sistemler yüzlerce kat farklı süreler seçer.
  • Proxy ARP zehirlemenin meşru ikizidir: ikisi de başkasının adresine cevap verir; bu yüzden açık bırakılan bir proxy gerçek bir saldırıyı da göze normal gösterir.
  • Gelen her mesaj göndereni tazeliyor: bedava ARP de bu kurala yaslanır, ARP zehirlemesi de.

Soruyu sordun, cevabı aldın, eşlemeyi tabloya yazdın. İsteğin hâlâ sırada bekliyor. Bağırdın ve herkes duydu; peki “herkes” kim?

26. bölüme devam et: Ortam Erişimi: CSMA/CD