magmalinux-nat

5  NAT

NAT (Network Address Translation), paketlerin yönlendirilmesinden önce (PREROUTING) paketteki hedef adresinin değiştirilmesini veya paketlerin yönlendirilmesinden sonra (POSTROUTING) paketteki kaynak adreslerinin değiştirilmesini sağlar.

Yukarıdaki açıklamayı biraz daha dikkatli incelersek iki tür NAT olduğunu görürüz:

Birincisi; paketlerin kaynak adresini değiştirdiğimiz Source NAT (SNAT) tır. Kaynak adresi değiştirme işlemi her zaman yönlendirme işleminden sonra yapılır (POSTROUTING). SNAT’ın en çok kullanıldığı işlem Masquerading işlemidir. Masquerading’e bu bölümün ilerleyen kısımlarında değineceğiz.

İkincisi ise hedef adresini değiştirdiğimiz Destination NAT (DNAT) tır. Hedef adresi değiştirme işlemi her zaman yönlendirme işleminden önce (PREROUTING) yapılmalıdır ki, paketler yönlendirilirken, belirlediğimiz hedefe gidebilsin.

DNAT ve SNAT yapmak için, paket filtreleme bölümünde düzenlediğimiz filter tablosu yerine bu kez nat tablosunu kullanacağız (Dikkat edin SNAT ve DNAT işlemlerimiz birer filtreleme değil, dönüşüm işlemidir. Bu yüzden bu tip işlemler filter tablosu yerine nat tablosunda yapılır). Iptables uygulamasına hangi tabloyu kullanması gerektiğini söylemek için -t parametresini kullanabiliriz (Örneğin -t nat ya da -t filter). Dikkat ettiğiniz üzere, bir önceki paket filtreleme bölümünde yaptığımız değişiklikler filter tablosunda olduğu halde, bunu -t parametresi ile belirtmedik. Çünkü iptables uygulaması hiç bir tablo belirtilmediği taktirde varsayılan olarak filter tablosunu kullanır.

Nat tablosu filter tablosundaki INPUT, OUTPUT ve FORWARD gibi zincirlerin yerine; PREROUTING, POSTROUTING ve OUTPUT zincirlerine sahiptir.

Bilgisayarımıza bir paketin bilgisayarımıza gelişinden itibaren çıkışına kadar geçen yolculuğuna bir bakalım:

  1. Dışarıdan gelen paket, ilk olarak PREROUTING zincirine gelir. Burada nat tablosuna bakılarak, eğer varsa hedef adresi değiştirme işlemleri yapılır.
  2. Paket PREROUTING işleminden sonra, paketin hedef adresine bakılarak nereye yönlendirileceğine karar verilir.
  3. Eğer hedef adresi yerel bir bilgisayarı gösteriyorsa, paket INPUT zincirine, uzaktaki bir bilgisayarı gösteriyorsa FORWARD zincirine gönderilir ve filter tablosuna bakılıp, filtreleme işlemleri gerçekleştirilir.
  4. Bilgisayarımızdan dışarıya çıkacak olan paketler OUTPUT zincirine gönderilir ve sırayla nat ve filter tablosuna bakılır (Eğer paket bilgisayarımıza dışarıdan gelmiş ve dışarıya gönderilecek ise OUTPUT zinciri yerine FORWARD zincirine gönderilir ve filter tablosuna bakılır).
  5. Paket OUTPUT ya da FORWARD zincirinden geçtikten sonra (tabi eğer filtrelenmemişse) POSTROUTING zincirine gelir. Burada nat tablosuna bakılır. Eğer varsa kaynak adresi değiştirme işlemleri yapılıp, paket bilgisayarımızdan ayrılır.


Paketin geçtiği zincir ve tabloları bir grafikle gösterelim:

          ____________                            ___________                           ___________
         | PREROUTING |                          |  FORWARD  |                         |POSTROUTING|
  Ağ --> |    nat     | ---> [ Yönlendirme ] --> |  filter   | --> [ Yönlendirme ] --> |    nat    | --> Ağ
         |____________|      [  (Routing)  ]     |___________|     [  (Routing)  ]     |___________|
                                    |                                      ^
                                    v                                      |
                              _____________                            _________
                             |    INPUT    |                          | OUTPUT  |
                             |    filter   |                          | filter  |
                             |_____________|                          |_________|
                                    |                       ________       ^
                                    |                      | OUTPUT |      |
                                     ---> [  Yerel   ] --> |  nat   |------
                                          [ İşlemler ]     |________|

5.1  Kaynak Adresini Değiştirme (Source NAT)

Source NAT (kısaca SNAT), yönlendirme işleminden sonra paketteki, paketi gönderen (kaynak) bilgisinin değiştirilmesi işlemidir. Bu sayede bir çok bilgisayar, bir ağ geçidinin arkasında durarak, bu ağ geçidi vasıtasıyla internete çıkabilir. Paketlerin yönlendirilmesi esnasında, iç ağdaki bir bilgisayarın gönderdiği bir paketteki gönderen bilgisi, ağ geçidinin bilgisi ile değiştirilip, bir çok bilgisayarın tek bir yerden internete çıkması sağlanabilir.

SNAT işlemi, nat tablosunda, paketin dışarıya gönderilmesinin son aşamasında, yani POSTROUTING zincirinde yapılır. Iptables’a -o parametresi ile çıkış ethernet arayüzü de belirtilebilir. SNAT işlemi sırasında -i parametresi ile giriş ethernet arayüzü belirtmek anlamsızdır.

Örneğin eth0’dan gönderilen paketlerin gönderen kısmını --to-source parametresinde belirttiğimiz IP yapmak için:

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.1.2

komutunu kullanabiliriz. Ayrıca -j parametresine hedef olarak SNAT verdiğimize dikkat edin.

 

–to-source parametresinde IP adresi yerine IP aralığı ya da port aralığı da belirtebiliriz. Örneğin:

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT \
      --to-source 192.168.1.2-192.168.1.4

kuralı eth0’dan giden paketlerin gönderici kısmını 192.168.1.2, 192.168.1.3 ya da 192.168.1.4 IP adreslerinin biriyle değiştirir.

--to-source parametresine IP adresi ile birlikte bir port numarası (veya bir port aralığı) da belirtebilirsiniz. Örneğin:

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT \
      --to-source 192.168.1.2:1-1023

5.1.1  Masquerading

Masquerading, SNAT’ın özelleşmiş bir halidir. Eğer giden paketlerde kaynak IP adresi olarak belirttiğiniz adres, dinamik, kısa zaman aralıklarında değişiyorsa, her seferinde IP adresini belirtmek yorucu olacaktır. Masquerading yaptığınızda; giden paketlerin kaynak adresine, otomatik olarak -o parametresi ile belirtilen arayüzün IP adresi yazılır. Masquerading kuralı tanımlarken açıkça kaynak IP adresi belirtmezsiniz. Örneğin:

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

5.2  Hedef Adresini Değiştirme (Destination NAT)

DNAT, gelen paketlerin hedef adresini değiştirme işlemidir. Paket bilgisayara ulaşır ulaşmaz, PREROUTING zincirinde yapılması gerekir.

DNAT kuralı tanımlanırken Iptables uygulamasına -i parametresi ile giriş ethernet arayüzü belirtilebilir. Örneğin eth0 arayüzüne gelen paketlerin hedef adreslerini değiştirelim:

# iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.1.2

-j parametresi ile belirttiğimiz hedefin DNAT ve zincirimizin PREROUTING olduğuna dikkat edin.

Yukarıdaki kuralda, IP adresi yerine, SNAT kısmında anlatıldığı gibi, bir IP aralığı veya bir port aralığı da belirtebilirdik. Örneğin:

# iptables -t nat -A PREROUTING -i eth0 -j DNAT \
   --to-destination 192.168.1.2-192.168.1.4

kuralı eth0’dan gelen paketlerdeki hedef adresini; 192.168.1.2, 192.168.1.3 ya da 192.168.1.4 adreslerinden biri ile değiştirir (Birden fazla IP adresinden herhangi birini seçme işlemi gerçekleştirilirken daha önceden en az kullanılmış IP adres seçilir. Bu sayede bir nevi yük dengeleme sağlanmış olur).

Şimdi de bir port belirtelim:

# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \
      -j DNAT --to-destination 192.168.1.5:80

kuralı, eth0’a gelen hedef portu 80 olan paketlerin hedef IP adresini 192.168.1.5, hedef portunu 80 olarak değiştirir. Bu kural sayesinde, örneğin alt ağınızdaki bir bilgisayarı HTTP sunucusu olarak belirleyebilirsiniz (Tabi ki alt ağınızdaki HTTP sunucusunun gelen isteklere cevap gönderebilmesi için SNAT’da yapılandırmış olmalısınız).

5.2.1  Redirection

Redirection, DNAT’ın özelleşmiş hali olup, bir porta gelen paketleri başka bir porta yönlendirmeye yarar. Yani paketteki hedef port bilgisini değiştirir.

Örnek bir redirection şu şekilde olabilir:

# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \
      -j REDIRECT --to-port 3128

Bu kural 80 numaralı porta gelen bütün paketleri, 3128 portuna yönlendirir (Squid’in varsayılan portu). Bu sayede, 80 numaralı portunuza gelen paketleri HTTP vekil sunucunuza yönlendirebilirsiniz.