Ev veya ofis ağında internete çıkış noktası olarak Linux kullananlar için NAT ve maskeleme konusu kaçınılmaz bir ihtiyaç haline gelir. UFW’nin sezgisel arayüzünün arkasında aslında iptables yatıyor ve bu sayede NAT gibi gelişmiş ağ özelliklerini de kullanabiliyoruz. Ancak UFW’nin varsayılan yapılandırması NAT için hazır değil, birkaç kritik adımı elle yapmak gerekiyor. Bu yazıda sıfırdan başlayarak UFW ile çalışan bir NAT ve masquerade yapılandırması kuracağız.
NAT ve Masquerade Nedir, Ne Zaman Lazım Olur?
NAT (Network Address Translation), bir ağdaki özel IP adreslerine sahip cihazların tek bir genel IP üzerinden internete çıkmasını sağlar. Ev ağınızdaki modem zaten bunu yapıyor ama kendi Linux kutunuzu router olarak kullanmak istediğinizde işin içine girmeniz gerekiyor.
Masquerade ise dinamik IP’ler için optimize edilmiş özel bir NAT türüdür. Statik NAT’tan farkı şu: Dış arayüzünüzün IP adresi değiştiğinde (örneğin DHCP ile aldığınızda) masquerade bunu otomatik olarak yakalar ve paketleri doğru IP ile etiketler. Sabit IP varsa SNAT da kullanılabilir ama masquerade her iki durumda da çalıştığından pratikte onu tercih ediyoruz.
Gerçek dünya senaryoları:
- Ofiste tek internet hattı var, birden fazla subnet’i internete çıkarmak istiyorsunuz
- Raspberry Pi veya eski bir laptop’ı Wi-Fi access point olarak kullanıyorsunuz
- VPN sunucusu kurduğunuzda VPN istemcilerini internete çıkarmak istiyorsunuz
- Sanal makinelerin host üzerinden internete çıkması gerekiyor
- İki ağ arasında yönlendirme yapılacak (inter-VLAN routing)
Ön Koşullar ve Ortam Tanımı
Bu yazı boyunca şu senaryoyu temel alacağız: Linux sunucumuzun iki ağ arayüzü var.
- eth0: İnternet bağlantısı olan dış arayüz (örneğin 192.168.1.100 veya dinamik IP)
- eth1: İç ağ arayüzü (örneğin 10.0.0.1/24)
İç ağdaki cihazlar 10.0.0.0/24 bloğundan IP alıyor ve internete çıkmak için bu Linux kutusunu gateway olarak kullanıyor.
Önce mevcut durumu kontrol edelim:
# Ağ arayüzlerini listele
ip addr show
# Mevcut UFW durumunu kontrol et
sudo ufw status verbose
# IP forwarding durumunu kontrol et
cat /proc/sys/net/ipv4/ip_forward
Eğer ip_forward değeri 0 ise NAT çalışmaz. Bunu kalıcı olarak açmamız gerekiyor.
Adım 1: IP Forwarding Etkinleştirme
UFW’yi yapılandırmadan önce çekirdek seviyesinde IP yönlendirmeyi aktif etmemiz şart. Bu olmadan hiçbir NAT kuralı işe yaramaz.
# Kalıcı olarak ip_forward etkinleştir
sudo nano /etc/sysctl.conf
Aşağıdaki satırı bulun ve yorum işaretini kaldırın, yoksa ekleyin:
# IPv4 forwarding
net.ipv4.ip_forward=1
# IPv6 kullanıyorsanız bunu da ekleyin
net.ipv6.conf.all.forwarding=1
Değişikliği hemen uygulayın:
sudo sysctl -p
# Doğrulamak için
sysctl net.ipv4.ip_forward
# Çıktı: net.ipv4.ip_forward = 1
Alternatif olarak UFW’nin kendi forwarding ayarı da var. /etc/default/ufw dosyasını açın:
sudo nano /etc/default/ufw
DEFAULT_FORWARD_POLICY satırını bulun ve DROP‘tan ACCEPT‘e çevirin:
DEFAULT_FORWARD_POLICY="ACCEPT"
Bu iki ayar birbirini tamamlar. sysctl çekirdek seviyesinde izin verirken UFW politikası firewall seviyesinde izin verir.
Adım 2: before.rules Dosyasına NAT Kuralları Eklemek
İşte UFW’de NAT yapılandırmasının can alıcı noktası burası. UFW normal kurallardan önce /etc/ufw/before.rules dosyasını işler ve biz NAT kurallarımızı bu dosyanın en başına eklememiz gerekiyor. Dikkat: Dosyanın başına, yani *filter satırından önce.
sudo nano /etc/ufw/before.rules
Dosyanın en başına şu bloğu ekleyin:
# NAT tablosu kuralları - bu satirlar *filter'dan ONCE gelmeli
*nat
:POSTROUTING ACCEPT [0:0]
# eth0 uzerinden disariya cikan trafigi maskele
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
# Taahhut et
COMMIT
# Buradan sonra mevcut *filter blogu devam eder
# Don't delete these required lines, otherwise there will be errors
*filter
...
Eğer birden fazla iç subnet’i maskelemeniz gerekiyorsa:
*nat
:POSTROUTING ACCEPT [0:0]
# Birden fazla subnet icin masquerade
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
-A POSTROUTING -s 172.16.0.0/16 -o eth0 -j MASQUERADE
-A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
COMMIT
Önemli not: eth0 yerine kendi dış arayüzünüzün adını kullanın. Modern sistemlerde enp3s0, ens33, wlan0 gibi isimler görebilirsiniz. ip addr show çıktısına bakarak doğrulayın.
Adım 3: FORWARD Zincirine İzin Kuralları
NAT tek başına yetmez, paketlerin yönlendirilmesine de izin vermemiz lazım. before.rules dosyasındaki *filter bloğuna şu kuralları ekleyin:
sudo nano /etc/ufw/before.rules
*filter ve COMMIT arasına şu satırları ekleyin:
# Kurulmus baglantilarin forward edilmesine izin ver
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# ic agdan dis aga giden trafiğe izin ver
-A ufw-before-forward -i eth1 -o eth0 -j ACCEPT
# Dis agdan ic aga giden trafiği engelle (opsiyonel, gelen baglantilara izin vermek istemiyorsak)
-A ufw-before-forward -i eth0 -o eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Bu kuralların mantığı şu: İç ağdan (eth1) gelen ve dışa (eth0) giden her şeye izin ver, ama dışarıdan içeri yeni bağlantı açılmasına izin verme, sadece içeriden başlatılmış oturumların cevaplarını geçir.
Adım 4: UFW’yi Yeniden Başlatma ve Doğrulama
Değişiklikleri uygulamak için UFW’yi yeniden yükleyin:
# UFW'yi yeniden baslat
sudo ufw disable
sudo ufw enable
# Ya da sadece reload et
sudo ufw reload
# Durumu kontrol et
sudo ufw status verbose
NAT kurallarının aktif olup olmadığını iptables üzerinden doğrulayın:
# NAT tablosunu kontrol et
sudo iptables -t nat -L -n -v
# POSTROUTING zincirini goruntule
sudo iptables -t nat -L POSTROUTING -n -v
# FORWARD zincirini kontrol et
sudo iptables -L FORWARD -n -v
Masquerade kuralı düzgün yüklendiyse şuna benzer bir çıktı görürsünüz:
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.0.0.0/24 0.0.0.0/0
Gerçek Dünya Senaryosu: VPN İstemcileri için NAT
OpenVPN veya WireGuard kurduğunuzda VPN istemcilerinin internete çıkabilmesi için masquerade şart. WireGuard örneği üzerinden gidelim. WireGuard varsayılan olarak wg0 arayüzünü oluşturur ve istemcilere genellikle 10.8.0.0/24 bloğundan IP verir.
sudo nano /etc/ufw/before.rules
NAT bloğuna ekleyin:
*nat
:POSTROUTING ACCEPT [0:0]
# WireGuard istemcileri icin masquerade
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
COMMIT
WireGuard arayüzüne gelen bağlantılar için UFW kuralı da ekleyin:
# WireGuard portu icin izin (varsayilan 51820/udp)
sudo ufw allow 51820/udp
# wg0 uzerinden forward'a izin
sudo ufw allow in on wg0
sudo ufw allow out on wg0
WireGuard’ın kendi yapılandırma dosyasında (/etc/wireguard/wg0.conf) da benzer ayarlar görebilirsiniz ama UFW kullanıyorsanız PostUp/PreDown bloklarındaki iptables komutlarını kaldırıp UFW’ye bırakmak daha temiz bir yönetim sağlar.
Gerçek Dünya Senaryosu: Sanal Makineler için NAT
KVM veya VirtualBox kullanıyorsanız ve sanal makinelerinizin host üzerinden internete çıkmasını istiyorsanız aynı mantık geçerli. KVM varsayılan olarak virbr0 köprü arayüzü oluşturur ve sanal makinelere 192.168.122.0/24 bloğundan IP verir.
sudo nano /etc/ufw/before.rules
*nat
:POSTROUTING ACCEPT [0:0]
# KVM sanal makineleri icin masquerade
-A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE
COMMIT
FORWARD zincirine de izin verin:
# virbr0 trafiğine forward izni
sudo ufw allow in on virbr0
sudo ufw allow out on virbr0
sudo ufw allow in on virbr0 to any
Eğer libvirt’in kendi iptables yönetimini devre dışı bıraktıysanız (bazı yöneticiler bunu tercih eder) tüm kuralları UFW üzerinden yönetmek daha tutarlı olur.
Port Yönlendirme (DNAT) ile NAT’ı Genişletmek
Masquerade’in yanı sıra dışarıdan içeriye port yönlendirme de sık ihtiyaç duyulan bir senaryo. Diyelim ki iç ağdaki 10.0.0.50 adresindeki web sunucusuna dışarıdan erişim açmak istiyorsunuz.
sudo nano /etc/ufw/before.rules
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# Dis agdan gelen 80 portunu ic sunucuya yonlendir
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.50:80
# Dis agdan gelen 443 portunu ic sunucuya yonlendir
-A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.0.50:443
# SSH icin farkli port mapping (dis port 2222 -> ic port 22)
-A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 10.0.0.60:22
# ic agdan disariya masquerade
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT
Port yönlendirmenin çalışması için yönlendirilen bağlantı noktalarına UFW kuralı da gerekiyor:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp
FORWARD zincirine de izin verin (before.rules içindeki filter bloğuna):
-A ufw-before-forward -i eth0 -o eth1 -p tcp --dport 80 -j ACCEPT
-A ufw-before-forward -i eth0 -o eth1 -p tcp --dport 443 -j ACCEPT
-A ufw-before-forward -i eth0 -o eth1 -p tcp --dport 22 -j ACCEPT
Sorun Giderme
UFW ile NAT yaparken karşılaşılan yaygın sorunlar ve çözümleri:
NAT çalışmıyor, iç ağdan internet yok:
# ip_forward aktif mi?
cat /proc/sys/net/ipv4/ip_forward
# 0 ise:
echo 1 > /proc/sys/net/ipv4/ip_forward
# POSTROUTING kuralı var mi?
sudo iptables -t nat -L POSTROUTING -n -v
# FORWARD politikasi nedir?
sudo iptables -L FORWARD -n -v
# DROP ise sorun burada
before.rules değişiklikleri uygulanmıyor:
# UFW tamamen disable/enable yapın
sudo ufw disable && sudo ufw enable
# Syntax hatası var mi diye kontrol et
sudo iptables-restore --test < /etc/ufw/before.rules
Arayüz isimleri değişiyor:
Bazı sistemlerde ağ arayüzü adları önyükleme sonrası değişebilir. Daha güvenilir bir yöntem olarak arayüz adı yerine IP aralığını kullanabilirsiniz:
# Arayüz adı yerine source IP kullan (daha taşınabilir)
-A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE
Mevcut bağlantıları izleme:
# Aktif NAT bağlantılarını goruntule
sudo conntrack -L 2>/dev/null | grep ESTABLISHED | head -20
# Paket sayaclarini izle
sudo watch -n 2 'iptables -t nat -L -n -v'
UFW Profil Bazlı Yönetim
Büyük ortamlarda farklı arayüzler için farklı NAT politikaları olabilir. UFW’nin before.rules dosyasını yönetmek yerine /etc/ufw/before6.rules (IPv6 için) ve özel script’ler kullanabilirsiniz. Ancak en pratik yöntem tüm NAT kurallarını before.rules başında toplamak ve yorum satırlarıyla iyi belgelemek:
sudo nano /etc/ufw/before.rules
########################################
# NAT KURALLARI - Degistirmeden once yedek alin
# Son degisiklik: 2024-01 - Admin: [email protected]
########################################
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
# --- MASQUERADE ---
# LAN segmenti (ofis ic ag)
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
# VPN istemcileri
-A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
# --- PORT YONLENDIRME ---
# Web sunucusu
-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.50:80
COMMIT
########################################
IPv6 NAT Hakkında Not
IPv6 için NAT genellikle önerilmez çünkü IPv6’nın tasarım amacı her cihazın benzersiz global adrese sahip olmasıdır. Ancak operatörünüz IPv6 prefix delegation yapıyorsa ve siz bunu iç ağa dağıtmak istiyorsanız /etc/ufw/before6.rules dosyasına benzer kurallar ekleyebilirsiniz. IPv6 masquerade için ip6tables‘da MASQUERADE hedefi kullanılır ama pratik gerekliliği nadirdir.
Yapılandırmayı Kalıcı Hale Getirme ve Yedekleme
UFW zaten ufw enable sonrası reboot’larda otomatik yüklenir. Ancak özelleştirilmiş before.rules değişikliklerinizi yedeklemeyi unutmayın:
# Yedek al
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.backup.$(date +%Y%m%d)
sudo cp /etc/default/ufw /etc/default/ufw.backup.$(date +%Y%m%d)
# Git ile versiyon takibi (opsiyonel ama tavsiye edilir)
cd /etc/ufw
sudo git init
sudo git add .
sudo git commit -m "NAT ve masquerade yapilandirmasi eklendi"
Reboot sonrası her şeyin çalıştığını doğrulamak için basit bir test:
# Yeniden baslatma sonrasi kontrol
sudo reboot
# Gelince
sudo iptables -t nat -L -n -v | grep MASQUERADE
# Kural gorunuyorsa her sey yolunda
Sonuç
UFW ile NAT ve masquerade yapılandırması ilk bakışta karmaşık görünse de adımlar oldukça sistematik: önce sysctl ile IP forwarding’i aç, DEFAULT_FORWARD_POLICY‘yi ACCEPT yap, before.rules‘a NAT bloğunu ekle, filter zincirine forward kurallarını yaz ve UFW’yi yeniden yükle. Bu beş adım sizi çalışan bir NAT’a götürür.
En çok dikkat edilmesi gereken nokta before.rules dosyasındaki sıralama. nat bloğu kesinlikle filter bloğundan önce gelmeli ve her blok COMMIT ile kapanmalı. Bu hatayı yapanların büyük çoğunluğu saatlerce neden çalışmadığını anlamaya çalışıyor.
Farklı senaryolar için (VPN, sanal makineler, port yönlendirme) temel mantık aynı kalıyor, sadece hangi subnet’i hangi arayüzde maskelediğiniz değişiyor. Ortamınız büyüdükçe ve kurallar çoğaldıkça before.rules dosyasını iyi yorum satırlarıyla belgelemek ve versiyon kontrolü altına almak gereksiz sürprizleri önlüyor.