Bölüm 25: Adres Çözümleme: ARP
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
- Giriş
- Adres Çubuğundan İsteğe
- Paket Anahtarlamalı Yol
- İsimden Adrese
- DNS Kayıtları
- Önbellek, Tazelik ve Güven
- Port Numarası ve Soket
- Bağlantısız Taşıma: UDP
- Üç Adımlı El Sıkışma
- Simetrik Şifreleme
- Açık Anahtarlı Kriptografi
- TLS El Sıkışması
- Sertifika Zinciri
- HTTP Mesajının Anatomisi
- Durum, Çerez ve Oturum
- HTTP/2'den HTTP/3'e
- İçerik Dağıtım Ağları
- Diğer Uygulama Protokolleri
- Katmanlı Mimari
- Hizmet ve Protokol
- Encapsulation ve Başlıklar
- Paket Yakalama ve Çözümleme
- Ağ Interface Kartı
- Fiziksel Adresleme
- Hata Sezme ve CRC
- Adres Çözümleme: ARP
- Ortam Erişimi: CSMA/CD
- Switch'ler
- Ağ Topolojileri
- Sanal Yerel Ağlar
- Kablosuz Erişim: 802.11
- Radyo Kanalı ve Kapasite
- Kablosuz Ağ Güvenliği
- Hücresel Ağlar
- Spektrum ve Kuşaklar
- Hareketlilik ve Aktarma
- Adres Kiralama: DHCP
- Adresin Anatomisi
- Adres Tükenmesi ve IPv6
- Router Mimarisi
- Kuyruk Yönetimi
- Cihaz Yapılandırma
- Routing Protokolleri
- Kontrol Düzlemi ve SDN
- Ağ İzleme ve Yönetimi
- Alanlar Arası Routing
- Adres Çevirisi
- Ara Kutular
- Tünelleme ve IPsec
- Firewall'lar
- Ağ Saldırıları
- Operatör ve Metro Ağları
- Bitten Sinyale
- Sembol Hızı ve Kanal Kapasitesi
- Multiplexing Teknikleri
- İletim Ortamları
- Bakır Kablo Sonlandırma
- Fiber Sonlandırma
- Fiber Optik İletim
- Bakır Erişim Ağı: DSL
- DSL'de Hız ve Mesafe
- Pasif Optik Ağlar
- Kablo Erişim Ağları
- Kablo Modem ve CMTS
- Denizaltı Kabloları
- Veri Merkezi Ağları
- Encapsulation Çözme
- Güvenilir Aktarım
- Tıkanıklık Denetimi
- Trafik Çözümleme
- Gecikme Bütçesi
- Soket Programlama
- Eşten Eşe ve Protokol Tasarımı
- Uyarlanır Video Akışı
- Gerçek Zamanlı Ses ve Görüntü
- Kablosuz Sensör Ağlarının Mimarisi
- Sensör Ağlarında Ortam Erişimi
- Sensör Ağlarında Yönlendirme ve IP
- Zaman Eşitleme ve Konum Bulma
- Sensör Ağı Uygulamaları
- Mobil Kablosuz Sensör Ağları
- 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:
- 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.
- 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.
- 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.
- İ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 baytAlanları 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-2AEthernet’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 dinamikListedeki 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