IPv4 adreslerinin tükenmesine başlamadan önce, NAT'ı yaygın olarak kullanmadık. İnternete bağlı her bilgisayarın kendine özgü küresel bir adresi olacaktı. NAT ilk tanıtıldığında, ISS müşterilerine müşteriye 1 müşteriye 1 gerçek adres vermesi için kullandığı / sahibi olduğu cihaz başına 1 gerçek adres vermekten geçmek olmuştur. Bu, IPv6'ya geçmemiz gereken bir süre (yıl) boyunca sorunu çözdü. IPv6'ya geçmek yerine (çoğunlukla) herkes herkesin değişmesini bekledi ve böylece (çoğunlukla) hiç kimse IPv6'yı kullanamadı. Şimdi yine aynı problemi yaşıyoruz, ancak bu sefer, ikinci bir NAT katmanı (CGN) kuruluyor, böylece ISS'ler birden fazla müşteri arasında 1 gerçek adres paylaşabiliyor.
IP adresinin tükenmesi, eğer son kullanıcının üzerinde kontrol sahibi olmadığı durumlar da dahil olmak üzere, NAT korkunç değilse, önemli bir şey değildir (Taşıyıcı Sınıf NAT veya CGN).
Ancak NAT'ın özellikle son kullanıcının üzerinde kontrol sahibi olmadığı durumlarda korkunç olduğunu savunuyorum . Ve (işi ağ mühendisliği / yönetimi olan ancak yazılım mühendisliği derecesine sahip bir kişi olarak) IPv6 yerine NAT'ı dağıtarak, ağ yöneticilerinin adres tükenmesini çözmenin ağırlığını alanlarından ve son kullanıcılara kaydırdıklarını iddia ediyorum. ve uygulama geliştiricileri.
Öyleyse (bana göre) NAT neden kaçınılması gereken korkunç, kötü bir şey?
Bakalım neyin kırıldığını açıklamakta adalet yapıp yapamayacağımı bakalım (ve daha iyi hale gelmemize neden olan hangi sorunları daha iyi olabileceğini bile bilmiyoruz):
- Ağ katmanı bağımsızlığı
- Eşler arası bağlantılar
- Tutarlı adlandırma ve kaynakların konumu
- En iyi trafik yönlendirmesi, gerçek adreslerini bilen ana bilgisayarlar
- Kötü niyetli trafik kaynağını takip etmek
- Verileri ayıran ve ayrı bağlantılar halinde kontrol eden ağ protokolleri
Bakalım bu öğelerin her birini açıklayabilir miyim?
Ağ katmanı bağımsızlığı
ISS'lerin sadece katman 3 paketlerinin etrafından geçmesi ve bunun üzerindeki katmanlarda ne olduğu umrunda olmaması gerekiyor. İster TCP, UDP, ister daha iyi / daha egzotik bir şey geçiriyor olsanız da (SCTP belki? Veya TCP / UDP'den daha iyi olan, ancak NAT desteği olmadığı için belirsiz olan başka bir protokol) bakım; hepsi sadece onlara veri gibi görünmesi gerekiyordu.
Fakat öyle değil - NAT'ın "ikinci dalgasını", "Taşıyıcı Sınıf" NAT'ı uygularken değil. O zaman mutlaka kullanmak istediğiniz katman 4 protokollerine bakmak ve bunları desteklemek zorundalar. Şu anda, bu pratik olarak yalnızca TCP ve UDP kullanabileceğiniz anlamına gelir. Diğer protokoller ya sadece engellenecek / düşecekti (deneyimlerime göre vakaların büyük çoğunluğu) ya da sadece bu protokolü kullanan NAT ("bunu yapan bir uygulama gördüm") son ana bilgisayarına "iletilecek". Bu protokolü kullanan son ana bilgisayara iletmek bile gerçek bir düzeltme değildir - iki ana bilgisayar kullandığı anda kopar.
TCP ve UDP için şu anda henüz denenmemiş ve kullanılmayan bazı değiştirme protokolleri olduğunu düşünüyorum. Beni yanlış anlama, TCP ve UDP etkileyici bir şekilde iyi tasarlandı ve bugün ikisinin de interneti kullanma şeklimize nasıl ölçeklenebilecekleri şaşırtıcı. Ama neyi kaçırdığımızı kim bilebilir? SCTP hakkında okudum ve kulağa hoş geliyor, ancak NAT nedeniyle pratik olmadığı için hiç kullanmadı.
Eşler Arası bağlantılar
Bu büyük bir tane. Aslında bence en büyüğü. İki uç kullanıcınız varsa, ikisi de kendi NAT'larının ardında, hangisinin önce bağlanmaya çalışıldığına bakılmaksızın, diğer kullanıcının NAT'ları paketlerini bırakacak ve bağlantı başarılı olmayacaktır.
Bu, oyunları, sesli / görüntülü sohbeti (Skype gibi), kendi sunucularınızı barındırmayı vb. Etkiler.
Geçici çözümler var. Sorun, bu geçici çözümlerin geliştirici zamanına, son kullanıcı zamanına ve uygunsuzluğuna ya da hizmet altyapısı maliyetlerine mal olması. Ve kusursuz değiller ve bazen de kırılmazlar. (Diğer kullanıcıların, Skype'ın uğradığı kesintiler hakkındaki yorumlarını görün.)
Geçici bir çözüm, NAT aygıtını belirli bir gelen bağlantı noktasını NAT aygıtının arkasındaki belirli bir bilgisayara iletecek şekilde programladığınız bağlantı noktası iletmedir. Orada bulunan tüm farklı NAT aygıtları için bunun nasıl yapılacağına adanmış bütün web siteleri var. Bkz https://portforward.com/ . Bu genellikle son kullanıcı zamanı ve hayal kırıklığı maliyeti.
Diğer bir geçici çözüm, uygulamalara delik açma gibi şeyler için destek eklemek ve iki NATed istemcisi tanıtmak için NAT'un arkasında olmayan sunucu altyapısını sağlamaktır. Bu genellikle geliştirme zamanına mal olur ve geliştiricileri daha önce gerekmeyecek şekilde sunucu altyapısını potansiyel olarak koruyacak bir konuma koyar.
(Sorunun ağırlığını ağ yöneticilerinden son kullanıcılara ve uygulama geliştiricilere kaydırmak yerine IPv6 yerine NAT dağıtımı hakkında ne dediğimi hatırlıyor musunuz?)
Ağ kaynaklarının tutarlı adlandırma / konumu
Bir NAT'ın içinde ve sonra dışarıda farklı bir adres alanı kullanıldığından, bir NAT içindeki bir cihazın sunduğu herhangi bir hizmetin kendisine ulaşmak için birden fazla adresi vardır ve kullanılacak doğru müşteri istemcisinin nereden eriştiğine bağlıdır. . (Bu, bağlantı noktası iletme çalışmasını aldıktan sonra bile hala bir problemdir.)
Bir NAT içinde bir web sunucunuz varsa, 192.168.0.23 bağlantı noktası 80 numaralı bağlantı noktasında ve NAT aygıtınızın (yönlendirici / ağ geçidi) 35.72.216.228 numaralı dış adrese sahip olduğunu ve TCP bağlantı noktası 80 için bağlantı noktası iletme ayarını kurduğunuzu, şimdi web sunucusuna 192.168.0.23 portu 80 VEYA 35.72.216.228 port 80'i kullanarak erişilebilir. Kullanmanız gereken, NAT'ın içinde veya dışında olmanıza bağlıdır. NAT dışındaysanız ve 192.168.0.23 adresini kullanırsanız, beklediğiniz yere varamazsınız. Eğer NAT içerde ve dış adresini 35.72.216.228 kullanırsanız, belki istediğiniz noktaya gelmek için, NAT uygulama firkete destekleyen gelişmiş bir biriyse, ancak daha sonra isteğinizi sunan web sunucusu isteği NAT cihazınızdan geldiğini görecektir. Bu, NAT'ın arkasındaki ağda daha kısa bir yol olsa bile, tüm trafiğin NAT aygıtından geçmesi gerektiği ve web sunucusundaki günlüklerin NAT aygıtının kaynağı olarak listelendiği için çok daha az kullanışlı olacağı anlamına gelir. bağlantı. NAT uygulamanız saç tokasını desteklemiyorsa, gitmeyi beklediğiniz yere gidemezsiniz.
Ve DNS kullandığınız anda bu sorun daha da kötüleşiyor. Birdenbire, NAT'ın arkasında barındırılan bir şey için her şeyin düzgün çalışmasını istiyorsanız, bir NAT'ın içinde barındırılan hizmetin adresi konusunda, kimin sorduğuna bağlı olarak farklı cevaplar vermek isteyeceksiniz (AKA split horizon DNS, IIRC). Yuck.
Ve hepsi liman yönlendirme ve NAT ile saç tokası DNS'i ayırma konusunda bilgili birisine sahip olduğunuz varsayılıyor. Peki ya son kullanıcılar? Bir tüketici yönlendirici ve bir IP güvenlik kamerası satın aldıklarında ve "sadece çalışmasını" istediklerinde, tüm bunları kurma şansları nedir?
Ve bu beni yönlendirir:
En iyi trafik yönlendirmesi, gerçek adreslerini bilen ana bilgisayarlar
Görüldüğü gibi, gelişmiş firkete bile NAT trafiği her zaman en uygun yoldan akmaz. Bilgili bir yöneticinin bir sunucu kurduğu ve NAT'ı firkete olduğu durumda bile. (Verilen, bölünmüş ufuk DNS'si, bir ağ yöneticisinin elinde dahili trafiğin en uygun şekilde yönlendirilmesine yol açabilir.)
Bir uygulama geliştiricisi Dropbox gibi bir program oluşturup ağ ekipmanını yapılandırma konusunda uzman olmayan son kullanıcılara dağıtırsa ne olur? Özellikle, paylaşım dosyama 4GB'lık bir dosya koyduğumda ve bir sonraki bilgisayara erişmeyi denediğimde ne olur? Makineler arasında doğrudan aktarılıyor mu, yoksa yavaş bir WAN bağlantısı üzerinden bir bulut sunucusuna yüklenmesini beklemeli miyim ve sonra aynı yavaş WAN bağlantısı üzerinden indirmesi için ikinci kez beklemeli miyim?
Saf bir uygulama için, arabulucu olarak NAT'ın arkasında olmayan Dropbox'ın sunucu altyapısı kullanılarak yüklenecek ve daha sonra indirilecektir. Ancak iki makine yalnızca aynı ağda olduklarının farkına varırsa, dosyayı doğrudan çok daha hızlı bir şekilde aktarabilirlerdi. Dolayısıyla, daha az saf olmayan ilk uygulama denememiz için, işletim sistemine makinenin sahip olduğu IP (v4) adresinin ne olduğunu sorabilir ve ardından aynı Dropbox hesabında kayıtlı diğer makinelere karşı bunu kontrol edebiliriz. Bizimle aynı aralıktaysa, dosyayı doğrudan aktarın. Bu birçok durumda işe yarayabilir. Ancak o zaman bile bir sorun var: NAT yalnızca çalışıyor çünkü adresleri yeniden kullanabiliriz. Peki ya 192.168.0.23 adresi ve 192.168.0. Aynı Dropbox hesabına kayıtlı 42 adres aslında farklı ağlarda (ev ağınız ve iş ağınız gibi)? Şimdi arabuluculuk yapmak için Dropbox sunucu altyapısını kullanmakta başarısız olmalısınız. (Sonunda, Dropbox her Dropbox istemcisinin yerel ağda diğer müşterileri bulma umuduyla yayınlamasını sağlayarak sorunu çözmeye çalıştı. Ancak bu yayınlar NAT'ın arkasında olabilecek yönlendiricileri geçmiyor, bu tam bir çözüm olmadığı anlamına geliyor. ,özellikle CGN durumunda .)
Statik IP'ler
Ek olarak, birçok tüketici bağlantısının her zaman bağlantılarda olmadığı durumlarda (çevirmeli bağlantı gibi) ilk sıkıntı (ve NAT dalgası) gerçekleştiğinden, ISS'ler adreslerini yalnızca gerçekten bağlı olduğunuzda genel / harici IP adresleri tahsis ederek daha iyi kullanabilirler. Bu, bağlantı kurduğunuzda, her zaman aynı adresi almak yerine kullanılabilecek adresleri aldığınız anlamına geliyordu. Bu, kendi sunucunuzu çalıştırmayı daha da zorlaştırır ve sabit adreslerde olmak yerine, etrafta dolaşan eşlerle başa çıkmaları gerektiğinden, eşler arası uygulamaları daha da zorlaştırır.
Kötü niyetli trafik kaynağının şaşırtılması
NAT, giden bağlantıları NAT aygıtından geliyormuş gibi yeniden yazdığından, tüm davranışlar iyi ya da kötü, harici bir IP adresine alınır. Her giden bağlantıyı varsayılan olarak kaydeden hiçbir NAT aygıtı görmedim. Bu, varsayılan olarak, geçmiş kötü amaçlı trafiğin kaynağının yalnızca geçtiği NAT cihazına izlenebileceği anlamına gelir. Daha fazla işletme veya taşıyıcı sınıfı ekipman her giden bağlantıyı günlüğe kaydedecek şekilde yapılandırılabilirken, bunu yapan herhangi bir tüketici yönlendiricisi görmedim. ISS'lerin CGN'ler aracılığıyla yapılan tüm TCP ve UDP bağlantılarının bir kaydını tutup sürdürmeyeceklerini (ve ne kadar süreyle) görmenin ilginç olacağını düşünüyorum. Kötüye kullanım şikayetleriyle ve DMCA şikayetleriyle ilgilenmek için bu tür kayıtlara ihtiyaç duyulacaktır.
Bazı insanlar NAT'ın güvenliği arttırdığını düşünüyor. Eğer öyleyse, bunu gizlilik yoluyla yapar. NAT'ın zorunlu kıldığı varsayılan gelen trafik düşüşü, durum bilgisi olan bir güvenlik duvarına sahip olmakla aynıdır. Anladığım kadarıyla NAT için gereken bağlantı izlemeyi yapabilen herhangi bir donanımın durum bilgisi olan bir güvenlik duvarı çalıştırabilmesi gerekir, bu yüzden NAT gerçekten hiçbir noktayı hak etmiyor.
İkinci bir bağlantı kullanan protokoller
FTP ve SIP (VoIP) gibi protokoller kontrol ve gerçek veri içeriği için ayrı bağlantılar kullanma eğilimindedir. Bunu yapan her protokol, içinden geçtiği her NAT cihazında bir ALG (uygulama katmanı ağ geçidi) adı verilen yardımcı bir yazılıma sahip olmalı ya da bir tür aracı ya da delik açma ile bu konuda çalışmalıdır. Tecrübelerime göre, ALG'ler nadiren güncellenir ve SIP ile ilgili olarak ele aldığım en azından birkaç sorunun nedeni olmuştur. Birisinin VoIP'nin kendileri için işe yaramadığını bildiğini duyduğumda, ses yalnızca bir şekilde çalıştığı için, anında bir yerde, ne yapılacağını çözemediği UDP paketlerini bırakan bir NAT ağ geçidi olduğundan şüpheleniyorum.
Özet olarak, NAT kırılma eğilimindedir:
- TCP veya UDP'ye alternatif protokoller
- eşler arası sistemler
- NAT'ın arkasında barındırılan bir şeye erişme
- SIP ve FTP gibi şeyler. Bu konuda çalışmak için ALG'ler bugün, özellikle de SIP'de rastgele ve garip sorunlara neden oluyor.
Çekirdek, ağ yığınının aldığı katmanlı yaklaşım göreceli olarak basit ve zariftir. Bunu ağ oluşturma konusunda yeni birine açıklamaya çalışın ve kaçınılmaz olarak ev ağlarının muhtemelen anlamaya çalışmak için iyi ve basit bir ağ olduğunu varsayalım. Bu ipucunu birkaç durumda, dış ve iç adresler arasındaki karışıklıktan dolayı rotalamanın nasıl çalıştığı hakkında oldukça ilginç (aşırı derecede karmaşık) fikirlerin olduğunu gördüm.
NAT olmadan, VoIP'nin her yerde ve PSTN ile entegre olacağından ve bir cep telefonundan veya bilgisayardan arama yapmanın ücretsiz olacağından (zaten ödediğiniz internet hariç) olduğunu düşünüyorum. Sonuçta, neden siz ve ben sadece 64K VoIP akışını açıp PSTN kadar iyi çalıştığı zaman telefon için ödeme yapalım? Görünüşe göre bugün VoIP dağıtımıyla ilgili 1 numaralı konu NAT aygıtlarından geçiyor.
NAT'ın bağladığı bağlantıyı sona erdirecek olursak, genellikle pek çok şeyin ne kadar basit olabileceğini anlamadığımızdan şüpheleniyorum. İnsanlar hala e-posta (veya Dropbox) dosyalarına e-posta gönderiyorlar, çünkü iki istemci NAT'ın arkasında olduğunda bir arabulucuya ihtiyaç duymanın temel sorunu.