NAT — Network Address Translation nedir ve nasıl çalışır?

Bu flood’da Network Address Translation’ın hangi amaçlarla kullanıldığını ve nasıl çalıştığını anlatacağım.

Bir cihazın internet üzerinde diğer cihazlarla iletişim kurabilmesi için public IP adresine sahip olması gereklidir fakat bildiğiniz üzere IPv4'te adresler (yaklaşık 3.3 milyar) sınırlı sayıdadır. IP adresleri kıt bir kaynak olduğu için, ev ve iş yerlerimizden internete bağlanmamızı sağlayan internet hizmet sağlayıcılar (Superonline, TTNET, vb) abonelerine tek bir public IP sağlarlar. NAT (Network Address Translation), aynı ağ içerisinde bulunan birden fazla cihazın aynı public IP’yi kullanarak internete erişebilmesini sağlayan yöntemdir.

NAT sayesinde evimizde bulunan ve internete bağlanan bütün cihazlar için ayrı birer public IP adresine ihtiyacımız kalmaz. Evdeki cihazlar (cep telefonu, bilgisayar, televizyon, vb) modem içinde dahili bulunan Wireless Router tarafından oluşturulan özel bir ağa dahil olarak ağdan birer private IP (genellikle 192.168.1.x veya 192.168.0.x) alırlar. Modem içerisinde dahili bulunan Wireless Router’ın bir bacağı servis sağlayıcının internet ağına diğer bacağı da ev içerisinde kurulan özel ağa bağlıdır ve bu iki ağ arasında paketlerin geçisini sağlar.

Aşağıdaki görselde tipik bir ev ağı için yukarıda anlatılanlar görselleştirilmiştir.

Anlaşılacağı üzere NAT, IP’den IP’ye dönüşüm yapmaktadır dolayısıyla public IP sayısı yeterli olsa bile NAT, servislerin sunulduğu sunucuları dış dünyadan soyutlamak amacı ile de kullanılabilir. Örneğin web sunucu olarak internete açmak istediğimiz bir sunucuyu elimizdeki public IP’lerden biri (örn: 47.102.40.22) üzerinden açmak yerine ona bir yerel ağ IP adresi (örn: 10.24.2.20) vererek NAT üzerinden public IP’yi yerel IP’ye yönlendirebiliriz. Böylece yerel ağdaki değişikliklerden NAT dönüşümü yapıldığı sürece dış dünyanın haberdar olması gerekmez.

Birden fazla cihazın aynı public IP’yi kullanarak internete bağlandığı durumda aslında NAT’ın bir çeşidi olan PAT (Port Address Translation) kullanılmaktadır. Şimdi NAT’ın genişletilmiş bir versiyonu olan PAT’ın nasıl çalıştığını detaylı bir şekilde inceleyelim.

Dış IP’si 78.169.44.144 olan ev yerel ağında bulunan 192.168.1.37 IP’sine sahip cep telefonumuzdan www․milliyet․com․tr adresine erişmeye çalışırken IP paketlerinin geçtiği ağ elemanlarını ve paketlerde meydana gelen değişiklikleri inceleyelim.

IP paketinin üzerinde source (kaynak) ve destination (hedef) IP adresleri, TCP header’ında ise kaynak ve hedef port numaraları bulunur. Source port, işletim sistemi tarafından verilen yüksek port numarası, hedef port ise HTTP — 80'dir. Aşağıda örneki IP paketi gösterilmiştir.

IP paketinin source adresinin yerel ağdan çıkarken dış IP ile değiştirilmesi gereklidir çünkü www․milliyet․com․tr sunucuları gelen isteği cevaplamak için bu IP’yi kullanacaklardır. Burada yerel IP kalırsa paketin geldiği ağ çözülemeyecek ve pakete cevap verilemeyecektir.

Yerel ağda bulunan NAT cihazı, paketteki source IP’yi dış IP ile değiştirerek, orjinal source IP ve target IP’yi kendi tuttuğu NAT Translation Table'a kaydeder, böylece pakete sunucudan cevap geldiğinde paketi yerel ağdaki cihazların hangisine yönlendireceğine karar verebilir.

Bu yöntem yerel ağda aynı cihaz üzerinde koşan iki farklı proses aynı sunucuyla iletişim kurduğunda tahmin edilebileceği gibi etkisiz kalacaktır çünkü NAT, Translation Table'da source ve destination IP'leri aynı olan iki kayıt bularak cevap paketini hangi prosese yönlendireceğini bilemeyecektir. Bu sebeple NAT, Translation Table'a orjinal source IP, target IP bilgilerine ek olarak (TCP ve UDP ise) source port bilgisi de eklemektedir. Cevap paketinde source port bilgisi target port olarak yer alacağından paket NAT tarafından kolaylıkla yerel ağda ve ilgili uygulamaya yönlendirilebilecektir.

Aşağıda IP paketinin source IP’sinin yerel ağdan çıkarken NAT’ın public IP’si ile değiştirilmesi görselleştirilmiştir.

Aşağıdaki görselde ise cevap paketinin destination IP’sinin NAT tarafından yerel ağda bulunan cihazın IP’si ile değiştirilmesi resmedilmiştir.

NAT fonksiyonu, sonraki flood’larda ele alacağımız Router veya Firewall cihazları ile sağlanabilir. Linux çekirdeğinde bulunan netfilter modülü ile yine ilerleyen flood'larda yer vereceğimiz iptables interface'i üzerinden yazılım tabanlı bir NAT kurmak da mümkündür.

NAT sunduğu esneklikler sayesinde yaygın olarak pek çok çözümde kullanılmaktadır. Örneğin, popüler konteyner çözümü Docker, koşturulduğu sunucu üzerinde yaratılan konteynerlerle yerel bir ağ oluşturup host ile iletişiminde NAT'tan faydalanmakta böylece izolasyon sağlamaktadır.

Son olarak, anlatılan konseptleri bir uygulama alanında görmek için yerel ağda (NAT arkasında) bulunan bir sunucudan internete açık bir servis sunmanın anlatıldığı https://www.gokhansengun.com/kendi-bilgisayarindan-web-sayfasi-sunmak/ makalesine göz atılabilir.