Ders 13 / 18
NAT ve PAT
Adres dönüştürme türleri, çevrim tablosunun beş bileşenli anahtarı, kapasite hesabı ve uçtan uca bağlantının bozulması.
İçindekiler
Örnek ağdaki tüm cihazlar artık adres sahibidir. Ancak bu adreslerin tümü
192.168.10.0/24 bloğundandır ve o blok genel İnternet’te yönlendirilmez: kaynak adresi
192.168.10.196 olan bir paket sağlayıcının yönlendiricisine ulaşsa bile, dönüş paketinin
geri getirilebileceği bir yol yoktur.
Kurumun elinde tek bir genel adres vardır: 203.0.113.10. Bu dersin sorusu, 182 iç
adresin tek bir genel adres üzerinden dışarı nasıl çıkabildiğidir.
Üç Dönüştürme Türü
Adres dönüştürme (network address translation, NAT), bir paketin başlığındaki adresleri geçiş sırasında değiştirmektir. Üç biçimi ayrılır.
| Tür | Eşleme | Kaç genel adres | Dışarıdan bağlantı |
|---|---|---|---|
| Statik NAT | Bire bir, sabit | İç düğüm sayısı kadar | Kurulabilir |
| Dinamik NAT | Bire bir, havuzdan | Eşzamanlı düğüm sayısı kadar | Kurulamaz |
| Bağlantı noktalı dönüştürme (PAT) | Çoktan bire | Tek adres yeter | Yalnız tanımlıysa |
Statik NAT, bir iç adresi bir genel adrese kalıcı olarak bağlar. Dışarıdan erişilmesi gereken bir sunucu için kullanılır.
Dinamik NAT, bir genel adres havuzundan geçici eşleme kurar. Havuz tükendiğinde yeni düğümler dışarı çıkamaz. Kurumun tek genel adresi olduğundan bu tür örnek ağa uygun değildir.
Bağlantı noktalı dönüştürme (port address translation, PAT), adresle birlikte kaynak bağlantı noktası numarasını da değiştirerek çok sayıda iç düğümü tek bir genel adrese sığdırır. Örnek ağın kullandığı yöntem budur. Yaygın adlandırmada “NAT” denildiğinde çoğunlukla bu tür kastedilir.
Çevrim Tablosu
Dönüştürmeyi yapan cihaz, hangi dönüş paketinin hangi iç düğüme ait olduğunu bilmek zorundadır. Bunun için bir çevrim tablosu tutar. Tablonun anahtarı beş bileşenlidir: kaynak adresi, kaynak bağlantı noktası, hedef adresi, hedef bağlantı noktası ve protokol.
DIS_ADRES = "203.0.113.10" class Pat: """Bağlantı noktası çevirisi yapan bir çevrim tablosu.""" def __init__(self, dis_adres: str, ilk_bnk: int = 61000) -> None: self.dis_adres = dis_adres self.sonraki = ilk_bnk self.ileri: dict[tuple, tuple] = {} # iç anahtar -> dış anahtar self.geri: dict[tuple, tuple] = {} # dış anahtar -> iç anahtar def disari(self, ic_ip: str, ic_bnk: int, hedef_ip: str, hedef_bnk: int) -> tuple[str, int]: anahtar = (ic_ip, ic_bnk, hedef_ip, hedef_bnk) if anahtar not in self.ileri: self.sonraki += 1 dis = (self.dis_adres, self.sonraki) self.ileri[anahtar] = dis self.geri[(dis[0], dis[1], hedef_ip, hedef_bnk)] = (ic_ip, ic_bnk) return self.ileri[anahtar] def iceri(self, dis_ip: str, dis_bnk: int, kaynak_ip: str, kaynak_bnk: int) -> tuple[str, int] | None: return self.geri.get((dis_ip, dis_bnk, kaynak_ip, kaynak_bnk)) pat = Pat(DIS_ADRES) akislar = [ ("192.168.10.196", 49152, "198.51.100.20", 443), ("192.168.10.197", 49152, "198.51.100.20", 443), ("192.168.10.196", 49153, "198.51.100.20", 443), ("192.168.10.60", 51000, "198.51.100.20", 80), ] print(f"{'iç kaynak':22s} {'dış kaynak':22s} {'hedef'}") for ic_ip, ic_bnk, h_ip, h_bnk in akislar: d_ip, d_bnk = pat.disari(ic_ip, ic_bnk, h_ip, h_bnk) print(f"{ic_ip + ':' + str(ic_bnk):22s} {d_ip + ':' + str(d_bnk):22s} " f"{h_ip + ':' + str(h_bnk)}") print() print("dönüş paketi 203.0.113.10:61001 <- 198.51.100.20:443 ->", pat.iceri("203.0.113.10", 61001, "198.51.100.20", 443)) print("dönüş paketi 203.0.113.10:61003 <- 198.51.100.20:443 ->", pat.iceri("203.0.113.10", 61003, "198.51.100.20", 443)) print("istenmemiş paket 203.0.113.10:61999 <- 198.51.100.20:443 ->", pat.iceri("203.0.113.10", 61999, "198.51.100.20", 443))
Çıktı:
iç kaynak dış kaynak hedef
192.168.10.196:49152 203.0.113.10:61001 198.51.100.20:443
192.168.10.197:49152 203.0.113.10:61002 198.51.100.20:443
192.168.10.196:49153 203.0.113.10:61003 198.51.100.20:443
192.168.10.60:51000 203.0.113.10:61004 198.51.100.20:80
dönüş paketi 203.0.113.10:61001 <- 198.51.100.20:443 -> ('192.168.10.196', 49152)
dönüş paketi 203.0.113.10:61003 <- 198.51.100.20:443 -> ('192.168.10.196', 49153)
istenmemiş paket 203.0.113.10:61999 <- 198.51.100.20:443 -> None
İkinci satır, dönüştürmenin neden gerekli olduğunu gösterir: iki farklı iç düğüm aynı kaynak bağlantı noktası numarasını (49152) kullanmıştır. Numaralar değiştirilmeseydi dönüş paketleri ayırt edilemezdi.
Son satır, dönüştürmenin en belirgin yan etkisidir: tabloda karşılığı olmayan bir paket düşürülür. Dışarıdan gelen, içeriden başlatılmamış hiçbir bağlantı içeri geçemez.
Değişen Alanlar
Bir paket dönüştürülürken yalnızca adres alanları değişmez. IP başlığındaki kaynak adresi ve taşıma başlığındaki kaynak bağlantı noktası değiştiğine göre, bunları kapsayan sağlamalar da yeniden hesaplanmalıdır.
| Alan | Giden pakette | Dönen pakette |
|---|---|---|
| IP kaynak adresi | İç adres → genel adres | Değişmez |
| IP hedef adresi | Değişmez | Genel adres → iç adres |
| Taşıma kaynak bağlantı noktası | İç numara → çevrilmiş numara | Değişmez |
| Taşıma hedef bağlantı noktası | Değişmez | Çevrilmiş numara → iç numara |
| IP başlık sağlaması | Yeniden hesaplanır | Yeniden hesaplanır |
| Taşıma sağlaması | Yeniden hesaplanır | Yeniden hesaplanır |
Taşıma sağlamasının da değişmesinin nedeni, TCP ve UDP sağlamalarının IP adreslerini içeren bir sözde başlık üzerinden hesaplanmasıdır. Bu ayrıntı, adres dönüştürmenin katman ihlali olduğunu somutlaştırır: ağ katmanında çalışan bir cihaz, taşıma katmanı başlığını değiştirmek zorundadır.
Aynı nedenle, taşıma başlığını okuyamayan bir dönüştürücü çalışamaz. Uçtan uca şifrelenmiş bir taşıma katmanı, dönüştürmeyi olanaksız kılar.
Kapasite Sınırı
Tek bir genel adres üzerinden yapılabilecek eşzamanlı çevrim sayısı, kullanılabilir bağlantı noktası numarasıyla sınırlıdır.
kullanilabilir = 65535 - 1024 + 1 print("kullanılabilir bağlantı noktası:", kullanilabilir) for n in (182, 1000, 4000): print(f"{n:5d} istemci -> istemci başına eşzamanlı akış: {kullanilabilir // n}")
kullanılabilir bağlantı noktası: 64512 182 istemci -> istemci başına eşzamanlı akış: 354 1000 istemci -> istemci başına eşzamanlı akış: 64 4000 istemci -> istemci başına eşzamanlı akış: 16
Örnek ağın 182 düğümü için istemci başına 354 eşzamanlı akış düşer; bu bol bir paydır. Ancak sayı düğüm sayısıyla ters orantılıdır ve bin düğümde 64’e iner. Sayfa başına onlarca bağlantı açan uygulamalar bu sınırı zorlar.
Hesap kötümserdir: çevrim anahtarı hedefi de içerdiğinden, farklı hedeflere giden akışlar aynı çevrilmiş numarayı paylaşabilir. Yine de sınırın varlığı gerçektir ve büyük ağlarda birden çok genel adres kullanılmasının nedeni budur.
İkinci bir sınır bellektedir: her akış için bir tablo girdisi tutulur. Girdiler süreli tutulur ve zaman aşımına uğrar — bu, dönüştürmenin en görünür yan etkilerinden birini doğurur.
Uçtan Uca Bağlantının Bozulması
TCP/IP Modeli dersinde tanıtılan uçtan uca ilkesi, ağın içine durum konmamasını söyler. Adres dönüştürme bu ilkeyi doğrudan ihlal eder: çevrim tablosu, ağın ortasında tutulan bir durumdur. Sonuçları sıralanabilir.
Dışarıdan bağlantı kurulamaz. İçeriden başlatılmamış bir akışın tabloda karşılığı
yoktur. İçerideki bir cihazın dışarıdan erişilebilir olması için elle bir kural yazılması
gerekir — bağlantı noktası yönlendirme (port forwarding). Örnek ağdaki iç sunucu
192.168.10.226 dışarıya açılacaksa, 203.0.113.10:443 adresine gelen trafiğin ona
iletileceği bir kural tanımlanır.
Boşta kalan akışlar kopar. Tablo girdileri zaman aşımıyla silindiğinde, uzun süre veri akmayan bir bağlantının dönüş yolu kaybolur. İki uç bağlantının açık olduğunu sanır, ancak paketler geçmez. Uygulamalar bunu düzenli canlı tutma paketleriyle önler; TCP dersinde bu düzenek ayrıntılandırılacaktır.
Eşler doğrudan buluşamaz. İki uç da dönüştürmenin arkasındaysa, hiçbiri diğerine bağlanamaz. Çözüm, her iki ucun da dışarıdaki ortak bir sunucuya bağlanıp kendi dış adres ve bağlantı noktasını öğrenmesi, sonra eşzamanlı olarak birbirine paket göndermesidir. Bu yöntem ancak dönüştürücünün eşleme davranışı öngörülebilirse çalışır; çalışmadığında trafik bir aktarma sunucusu üzerinden taşınır ve gecikme artar.
İç istemci kendi dış adresine ulaşamayabilir. İçeriden 203.0.113.10:443 adresine
bağlanmaya çalışan bir cihazın paketi, dönüştürücüye kendi iç arayüzünden gelir ve geri
dönmesi gerekir. Bu davranış firkete (hairpinning) olarak adlandırılır ve her
gerçekleştirimde desteklenmez. Belirtisi tipiktir: bir hizmet dışarıdan çalışır, aynı ağın
içinden çalışmaz.
Dönüştürme Bir Güvenlik Düzeneği Değildir
Dışarıdan bağlantı kurulamaması güvenlik gibi görünür, ancak dönüştürme bir güvenlik düzeneği olarak tasarlanmamıştır ve öyle sayılmamalıdır.
Erişim engeli bir yan etkidir, bir politika değildir. İçeriden başlatılan her akış dışarıya açılır; kötü amaçlı bir yazılım içeriden bağlantı kurarak engeli aşar. Ayrıca dönüştürme, geçen trafiğin içeriğine bakmaz; izin verilen bir akış içinde ne taşındığını denetlemez.
Erişim politikası, açıkça yazılmış filtreleme kurallarıyla kurulur. Adres dönüştürme adres kıtlığını çözer; erişim denetimi ayrı bir işin adıdır.
Sağlayıcı Düzeyi Dönüştürme
Adres kıtlığı sağlayıcı düzeyinde de yaşandığında, dönüştürme bir kat daha uygulanır:
abonelere genel adres yerine 100.64.0.0/10 bloğundan adres verilir ve çıkış sağlayıcının
genel adresleri üzerinden yapılır. Buna sağlayıcı düzeyi adres dönüştürme (carrier-grade
NAT) denir.
İki kat dönüştürmenin altında bağlantı noktası yönlendirme abone tarafından tanımlanamaz, eşler arası buluşma daha sık başarısız olur ve bir dış adresi çok sayıda abone paylaştığı için adres tabanlı tanı anlamını yitirir.
IPv6, bu katmanların hiçbirine gerek bırakmaz: her uca genel adres verilebildiğinde çevrim tablosu da gereksizleşir. Önceki derste anlatılan geçiş yöntemlerinin gerekçelerinden biri budur.
Özet
- Özel kullanım adresleri genel İnternet’te yönlendirilmez; dışarı çıkış adres dönüştürmeyle sağlanır.
- Statik dönüştürme bire bir ve kalıcı, dinamik dönüştürme havuzdan geçici, bağlantı noktalı dönüştürme çoktan biredir.
- Çevrim tablosunun anahtarı beş bileşenlidir; farklı iç düğümler aynı kaynak bağlantı noktasını kullansa bile dönüş paketleri ayırt edilir.
- Adres ve bağlantı noktası değiştiği için hem IP hem taşıma sağlaması yeniden hesaplanır; bu, dönüştürmenin katman ihlali olduğunun kanıtıdır.
- Tek genel adreste 64 512 bağlantı noktası vardır; 182 düğüm için düğüm başına 354, bin düğüm için 64 eşzamanlı akış düşer.
- Dönüştürme uçtan uca bağlantıyı bozar: dışarıdan bağlantı kurulamaz, boşta akışlar kopar, eşler doğrudan buluşamaz. Bir güvenlik düzeneği değildir.
Sonraki Adım
Bu konu boyunca “bağlantı noktası” terimi tanımlanmadan kullanıldı: çevrim tablosunun anahtarında, kiralama protokolünün 67 ve 68 numaralarında, hedef sunucunun 443’ünde. Bu numaraların ne olduğu ve bir işletim sisteminin gelen bir segmenti hangi uygulamaya vereceğine nasıl karar verdiği taşıma katmanının konusudur. Sonraki ders bağlantı noktalarını, soket kavramını ve bir bağlantıyı benzersiz kılan dörtlüyü ele alacak.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.