İç ağınızdaki sunuculara veya hizmetlere dış dünyadan erişim sağlamak, birçok ağ yöneticisinin karşılaştığı temel bir ihtiyaçtır. Peki, bir Linux sunucuyu ağ geçidi olarak kullanarak, Iptables ile bu port yönlendirme işlemini güvenli ve etkin bir şekilde nasıl gerçekleştirebilirsiniz? Bu makale, Iptables’ın gücünü kullanarak ağ geçidiniz üzerinden portları nasıl yönlendireceğinizi adım adım açıklıyor, böylece iç ağınızdaki hizmetlerinizi dışarıya açarken ağ güvenliğinizi de koruyabileceksiniz.
Port Yönlendirme Neden Önemli ve Ne İşe Yarar?
Günümüz ağ yapılarında, evlerimizden kurumsal ofislere kadar her yerde bir ağ geçidi (router veya modem) bulunur. Bu ağ geçitlerinin temel görevlerinden biri, iç ağımızdaki cihazların internete çıkmasını sağlamak ve dışarıdan gelen istenmeyen bağlantıları engellemektir. Ancak bazen, iç ağımızda çalışan bir web sunucusu, oyun sunucusu, IP kamera veya uzaktan erişim hizmeti gibi belirli bir uygulamaya internet üzerinden erişmemiz gerekebilir. İşte tam bu noktada “port yönlendirme” (port forwarding) devreye girer.
Port yönlendirme, basitçe ifade etmek gerekirse, ağ geçidinize gelen belirli bir dış bağlantı talebini, iç ağınızdaki belirli bir cihaza ve o cihazın belirli bir portuna yönlendirme işlemidir. Bunu, büyük bir binanın resepsiyonisti gibi düşünebilirsiniz: dışarıdan gelen bir ziyaretçi (bağlantı talebi) belirli bir ofise (iç ağdaki cihazın IP adresi) ve o ofisteki belirli bir kişiye (port numarası) ulaşmak ister. Resepsiyonist (ağ geçidi), ziyaretçiyi doğru adrese yönlendirir. Bu yönlendirme işlemi genellikle Ağ Adresi Çevirisi (NAT – Network Address Translation) mekanizmasının bir parçası olarak gerçekleşir. İç ağdaki cihazların özel (private) IP adresleri varken, dış dünyada tek bir genel (public) IP adresi üzerinden iletişim kurmaları sağlanır. Port yönlendirme, bu genel IP adresine gelen bir isteği, özel IP adresine sahip bir cihaza iletmek için NAT kurallarını kullanır.
Bir Linux sunucusunu ağ geçidi olarak kullanmak, bu süreçte bize inanılmaz bir esneklik ve kontrol sağlar. Donanım tabanlı router’ların aksine, Iptables gibi güçlü bir güvenlik duvarı aracıyla, yönlendirme kurallarını çok daha detaylı bir şekilde tanımlayabilir, güvenlik politikalarını ince ayarlarla uygulayabilir ve ağ trafiğini çok daha şeffaf bir şekilde yönetebiliriz. Örneğin, sadece belirli kaynak IP adreslerinden gelen bağlantılara izin verebilir, belirli zaman aralıklarında yönlendirmeyi aktif hale getirebilir veya farklı dış portları iç ağdaki farklı portlara yönlendirebiliriz. Bu kontrol seviyesi, özellikle güvenlik odaklı veya karmaşık ağ yapısına sahip ortamlar için vazgeçilmezdir. Bir Linux ağ geçidi ile, hem ağ trafiğiniz üzerinde tam yetki sahibi olur hem de Iptables’ın sağladığı gelişmiş filtreleme yetenekleri sayesinde ağ güvenliğinizi en üst düzeye çıkarabilirsiniz. Bu sayede, iç ağınızdaki sunucuların veya hizmetlerin dışarıdan erişilebilir olmasını sağlarken, aynı zamanda istenmeyen erişimleri de etkin bir şekilde engelleyebilirsiniz. Bu durum, hem bireysel kullanıcılar için ev ağlarında bir medya sunucusuna erişim gibi basit senaryolarda, hem de kurumsal ortamlarda kritik sunuculara güvenli uzaktan erişim sağlanması gibi karmaşık senaryolarda büyük bir avantaj sunar.
Iptables Temelleri ve Linux Ağ Geçidi Mimarisi
Iptables, Linux çekirdeğinin netfilter çerçevesi için bir kullanıcı alanı programıdır. Temel olarak, ağ paketlerini incelemek, değiştirmek ve yönlendirmek için kurallar tanımlamamızı sağlayan güçlü bir güvenlik duvarı aracıdır. Bir Linux sunucuyu ağ geçidi olarak yapılandırdığımızda, Iptables bu ağ geçidinin beyni haline gelir ve ağ trafiğinin nasıl akacağını belirler. Port yönlendirme işleminin başarılı olması için Iptables’ın nasıl çalıştığını ve bir Linux ağ geçidinin temel mimarisini anlamak kritik öneme sahiptir.
Iptables, paketleri işlemek için farklı “tablolar” ve bu tabloların içinde “zincirler” kullanır. Port yönlendirme için en çok ilgileneceğimiz tablo nat (Network Address Translation) tablosudur. Bu tablo, paketlerin kaynak veya hedef IP adreslerini/portlarını değiştirmek için kullanılır. nat tablosu içinde, port yönlendirme için genellikle iki ana zincir kullanılır:
- PREROUTING: Paketler ağ arayüzüne ilk ulaştığında ve yönlendirme kararı verilmeden önce bu zincir işlenir. Dışarıdan gelen bir bağlantıyı iç ağdaki bir sunucuya yönlendirmek için Hedef NAT (DNAT – Destination NAT) kuralları burada tanımlanır.
- POSTROUTING: Paketler yönlendirme kararı verildikten sonra ve ağ arayüzünden çıkmadan hemen önce bu zincir işlenir. İç ağdan internete çıkan paketlerin kaynak IP adresini değiştirmek (MASQUERADE veya SNAT – Source NAT) için kullanılır. Bu sayede iç ağdaki birçok cihaz, tek bir dış IP adresi üzerinden internete çıkabilir.
Bir Linux ağ geçidi mimarisi genellikle iki veya daha fazla ağ arayüzüne sahip bir sunucudan oluşur. Bir arayüz (örneğin, eth0 veya enp0s3) genellikle dış ağa (WAN – Wide Area Network), yani internete bağlıdır ve genel bir IP adresine sahiptir. Diğer arayüz (örneğin, eth1 veya enp0s8) ise iç ağa (LAN – Local Area Network) bağlıdır ve özel bir IP adresine sahiptir. Bu yapılandırmada, iç ağdaki cihazlar Linux ağ geçidini varsayılan ağ geçidi olarak kullanır ve tüm internet trafiği bu sunucu üzerinden geçer.
Port yönlendirme işleminin çalışabilmesi için Linux çekirdeğinde “IP Yönlendirme” (IP Forwarding) özelliğinin etkinleştirilmesi şarttır. Bu özellik, çekirdeğin bir ağ arayüzünden gelen paketleri başka bir ağ arayüzüne iletmesine izin verir. Bu, genellikle /proc/sys/net/ipv4/ip_forward dosyasının içeriğini 1 yaparak veya sysctl -w net.ipv4.ip_forward=1 komutuyla gerçekleştirilir. Kalıcı hale getirmek için ise /etc/sysctl.conf dosyasına net.ipv4.ip_forward=1 satırı eklenir.
Ağ geçidi olarak görev yapacak Linux sunucusunun IP yapılandırması da doğru bir şekilde ayarlanmalıdır. Dış arayüzün genellikle DHCP ile otomatik IP alması veya statik bir genel IP’ye sahip olması beklenirken, iç arayüzün statik bir özel IP adresine sahip olması ve iç ağdaki cihazlar için bir ağ geçidi görevi görmesi gerekir. Bu temel yapılandırmalar tamamlandıktan sonra, Iptables kuralları ile port yönlendirme ve diğer güvenlik politikaları uygulanmaya başlanabilir. Bu sayede, Linux sunucunuz sadece bir ağ geçidi olmakla kalmaz, aynı zamanda güçlü ve özelleştirilebilir bir güvenlik duvarı ve NAT cihazı olarak da hizmet verir. Bu esneklik, ağ yöneticilerine, ağ trafiği üzerinde tam kontrol sağlayarak, hem güvenliği artırma hem de hizmet erişilebilirliğini optimize etme imkanı sunar.
Adım Adım Iptables ile Basit Port Yönlendirme (DNAT) Nasıl Yapılır?
Şimdi, temel kavramları anladığımıza göre, gerçek bir senaryo üzerinden Iptables ile basit bir port yönlendirme kuralı nasıl oluşturulur ona bakalım. Diyelim ki iç ağınızda, 192.168.1.100 IP adresine sahip bir web sunucunuz var ve bu sunucu 80 numaralı port üzerinden hizmet veriyor. Amacımız, dış dünyadan gelen bağlantıların (örneğin, internetten web sitenize erişmeye çalışan kullanıcılar) Linux ağ geçidinizin genel IP adresine (203.0.113.5 olduğunu varsayalım) 80 numaralı port üzerinden geldiğinde, bu bağlantıları iç ağdaki web sunucunuza yönlendirmek. Bu işlem, Hedef NAT (DNAT) olarak bilinir.
Önkoşullar:
- Linux ağ geçidinizde IP yönlendirme etkinleştirilmiş olmalı. Bunu kontrol etmek için aşağıdaki komutu kullanabilirsiniz:
cat /proc/sys/net/ipv4/ip_forwardEğer çıktı
0ise, etkinleştirmek için:echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -pKalıcı hale getirmek için
/etc/sysctl.confdosyasınanet.ipv4.ip_forward=1satırını eklemeyi unutmayın. - Linux ağ geçidinizin dış ağa (WAN) bakan arayüzünün adını biliyor olmalısınız (örneğin,
eth0). - İç ağa (LAN) bakan arayüzünün adını biliyor olmalısınız (örneğin,
eth1). - İç ağdaki web sunucusunun IP adresi ve portunu biliyor olmalısınız (
192.168.1.100:80).
Adım 1: DNAT Kuralını Ekleme
Dışarıdan gelen HTTP (80 numaralı port) trafiğini iç ağdaki web sunucumuza yönlendirmek için nat tablosunun PREROUTING zincirine bir kural ekleyeceğiz. Bu kural, paketin hedef IP adresini ve portunu değiştirecektir:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
Bu komutu inceleyelim:
sudo iptables: Iptables komutunu yönetici ayrıcalıklarıyla çalıştırır.-t nat:nattablosunu kullanacağımızı belirtir.-A PREROUTING: KuralıPREROUTINGzincirine ekler (Append).-i eth0: Kuralın sadeceeth0(dış arayüz) üzerinden gelen paketler için geçerli olacağını belirtir. Bu, iç ağdan gelen trafiğin yanlışlıkla yönlendirilmesini engeller.-p tcp: Kuralın sadece TCP protokolü için geçerli olduğunu belirtir.--dport 80: Hedef portun 80 olduğunu belirtir (dışarıdan gelen bağlantının portu).-j DNAT: Hedef NAT (Destination NAT) işlemi yapılacağını belirtir.--to-destination 192.168.1.100:80: Paketin yeni hedef IP adresi ve portunun192.168.1.100ve80olduğunu belirtir.
Adım 2: Geri Dönüş Trafiği İçin MASQUERADE Kuralı (Eğer Yoksa)
İç ağdaki web sunucusu, dışarıdaki istemciye cevap gönderdiğinde, bu cevabın da ağ geçidi üzerinden geçmesi ve dış IP adresiyle gönderilmesi gerekir. Eğer iç ağdaki sunucunuzun varsayılan ağ geçidi (default gateway) Linux sunucunuz ise, genellikle ek bir SNAT veya MASQUERADE kuralına ihtiyaç duyulmaz çünkü paketler zaten doğru şekilde yönlendirilecektir. Ancak, genel bir uygulama olarak, iç ağdan dışarı çıkan tüm trafiğin kaynak IP adresini ağ geçidinin dış IP’si olarak maskelemek iyi bir pratiktir:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Bu kural, eth0 (dış arayüz) üzerinden çıkan tüm paketlerin kaynak IP adresini ağ geçidinin eth0 arayüzünün IP adresiyle değiştirir. Bu, web sunucusunun yanıtlarının dışarıdaki istemciye ağ geçidi üzerinden doğru bir şekilde ulaşmasını sağlar.
Adım 3: İzin Veren Güvenlik Duvarı Kuralı
nat tablosu paketlerin adreslerini değiştirse de, filter tablosu paketlerin geçip geçemeyeceğine karar verir. Dışarıdan gelen trafiğin iç ağdaki sunucuya ulaşabilmesi için FORWARD zincirinde bu trafiğe izin veren bir kurala ihtiyacımız var:
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
Bu kural, eth0‘dan eth1‘e doğru, TCP protokolü ve 80 numaralı port üzerinden, hedefi 192.168.1.100 olan paketlere izin verir. Ayrıca, halihazırda kurulmuş veya ilgili bağlantılara izin veren genel bir kuralınız olması da önemlidir:
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
Bu kural, mevcut bağlantılarla ilgili veya onlardan türeyen (örneğin, FTP veri bağlantıları) paketlere izin verir, bu da birçok hizmetin düzgün çalışması için gereklidir.
Adım 4: Kuralları Kaydetme
Iptables kuralları varsayılan olarak geçicidir ve sunucu yeniden başlatıldığında kaybolur. Kuralları kalıcı hale getirmek için, işletim sisteminize bağlı olarak farklı yöntemler kullanabilirsiniz. Debian/Ubuntu tabanlı sistemlerde netfilter-persistent paketi önerilir:
sudo apt-get install netfilter-persistent
sudo netfilter-persistent save
CentOS/RHEL tabanlı sistemlerde iptables-services paketi veya firewalld kullanılabilir:
sudo yum install iptables-services
sudo systemctl enable iptables
sudo systemctl start iptables
sudo iptables-save > /etc/sysconfig/iptables
Bu adımları tamamladıktan sonra, ağ geçidinizin genel IP adresine 80 numaralı port üzerinden erişmeye çalışan herkes, otomatik olarak iç ağdaki web sunucunuza yönlendirilecektir. Bu basit ama güçlü yönlendirme, birçok temel hizmetin dışarıdan erişilebilir olmasını sağlamanın ilk adımıdır.
Farklı Portlara Yönlendirme ve Birden Fazla Hizmet (DNAT) Nasıl Yönetilir?
Bir önceki bölümde tek bir hizmet için basit bir port yönlendirme kuralı oluşturmayı öğrendik. Ancak gerçek dünya senaryolarında, genellikle birden fazla iç ağ hizmetini dış dünyaya açmamız veya dışarıdan gelen bağlantıları farklı port numaraları üzerinden iç ağdaki farklı portlara yönlendirmemiz gerekebilir. Örneğin, dışarıdan 8080 portuna gelen bir bağlantıyı iç ağdaki bir sunucunun 80 portuna, dışarıdan 2222 portuna gelen bir SSH bağlantısını ise başka bir sunucunun standart 22 portuna yönlendirmek isteyebiliriz. Bu, Iptables’ın esnekliği sayesinde kolayca yönetilebilir.
Senaryo 1: Dış Portu İç Porttan Farklı Yönlendirme
Diyelim ki, ağ geçidinizin genel IP adresine (203.0.113.5) 8080 numaralı port üzerinden gelen web trafiğini, iç ağdaki 192.168.1.100 IP adresine sahip web sunucunuzun standart 80 numaralı portuna yönlendirmek istiyorsunuz. Bu, dışarıdan erişen kullanıcıların web sitenize http://203.0.113.5:8080 adresinden ulaşmasını sağlarken, iç sunucunuzun hala 80 portunda çalışmasına olanak tanır. Kural aşağıdaki gibi olacaktır:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80
Burada anahtar nokta, --dport ile dışarıdan beklenen portu (8080) belirtirken, --to-destination ile iç ağdaki sunucunun IP adresi ve gerçek portunu (192.168.1.100:80) tanımlamaktır. Bu sayede, dışarıdan gelen bağlantı, ağ geçidinde port numarası değiştirilerek iç ağdaki hedefe iletilir. Benzer şekilde, eğer 192.168.1.101 IP adresine sahip başka bir sunucunuzda çalışan SSH hizmetine (port 22) dışarıdan 2222 portu üzerinden erişmek istiyorsanız, kural şöyle olur:
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.101:22
Bu yöntem, aynı dış IP adresini kullanarak birden fazla iç ağ hizmetine farklı dış portlar üzerinden erişim sağlamanıza olanak tanır. Bu, özellikle sınırlı sayıda genel IP adresiniz olduğunda veya güvenlik amacıyla standart port numaralarını gizlemek istediğinizde oldukça kullanışlıdır.
Senaryo 2: Birden Fazla İç Sunucuya Yönlendirme
Aynı anda birden fazla iç ağ sunucusuna yönlendirme yapmak için, her bir hizmet için ayrı bir DNAT kuralı oluşturmanız yeterlidir. Örneğin, bir web sunucusu (192.168.1.100:80) ve bir FTP sunucusu (192.168.1.102:21) için yönlendirme yapmak isteyelim:
# Web Sunucusu için yönlendirme (Dış 80 -> İç 192.168.1.100:80)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
# FTP Sunucusu için yönlendirme (Dış 21 -> İç 192.168.1.102:21)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j DNAT --to-destination 192.168.1.102:21
Her bir kural, belirli bir dış portu belirli bir iç IP adresi ve portuna yönlendirir. Bu kuralların yanı sıra, her bir yönlendirme için FORWARD zincirinde izin veren kuralların da olması gerektiğini unutmayın:
# Web trafiği için FORWARD kuralı
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
# FTP trafiği için FORWARD kuralı
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 21 -d 192.168.1.102 -j ACCEPT
# Mevcut ve ilgili bağlantılara izin veren genel kural (eğer yoksa)
sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
Bu yapılandırma, ağ geçidinizin tek bir dış IP adresi üzerinden birden fazla iç hizmeti güvenli bir şekilde dış dünyaya açmasını sağlar. Her bir kuralı dikkatlice tanımlayarak ve FORWARD zincirinde uygun izinleri vererek, ağınızın kontrolünü elinizde tutabilirsiniz. Unutulmamalıdır ki, her yeni port yönlendirme kuralı eklediğinizde, güvenlik duvarı kurallarınızı da gözden geçirmeli ve yalnızca gerekli olan trafiğe izin verdiğinizden emin olmalısınız. Kuralları uygulamadan önce mevcut Iptables kurallarınızı yedeklemek ve test ortamında denemek iyi bir uygulamadır. Bu esneklik, Iptables’ı özellikle dinamik ve büyüyen ağ ortamlarında vazgeçilmez bir araç haline getirir.
Gelişmiş Senaryolar ve Güvenlik İpuçları
Basit port yönlendirme kurallarını oluşturmayı öğrendik, ancak Iptables’ın gerçek gücü, gelişmiş senaryolarda ve güvenlik odaklı uygulamalarda ortaya çıkar. Ağınızı daha güvenli ve yönetilebilir hale getirmek için kullanabileceğiniz bazı ileri düzey teknikler ve ipuçları bulunmaktadır.
1. Kaynak IP Kısıtlamaları ile Güvenliği Artırma:
Bir hizmeti dışarıya açarken, bu hizmete herkesin erişmesini istemeyebilirsiniz. Örneğin, sadece belirli bir ofis IP adresinden veya güvendiğiniz bir VPN sunucusundan gelen SSH bağlantılarına izin vermek isteyebilirsiniz. Bunu -s (source) parametresi ile yapabilirsiniz:
# Sadece 85.12.34.0/24 IP aralığından gelen SSH bağlantılarını 192.168.1.101 sunucusuna yönlendir
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -s 85.12.34.0/24 --dport 2222 -j DNAT --to-destination 192.168.1.101:22
# FORWARD zincirinde de aynı kısıtlamayı uygulamak önemlidir
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp -s 85.12.34.0/24 --dport 22 -d 192.168.1.101 -j ACCEPT
Bu sayede, sadece yetkili kaynaklardan gelen bağlantıların iç ağdaki hizmetinize ulaşmasını sağlayarak saldırı yüzeyinizi önemli ölçüde daraltmış olursunuz.
2. Belirli Bir Arayüze Bağlama:
Çoklu WAN bağlantısı olan bir ağ geçidiniz varsa, port yönlendirme kurallarınızı belirli bir dış arayüze bağlamak isteyebilirsiniz. Bu, -i (in-interface) parametresi ile kolayca yapılır:
# Sadece eth0 arayüzünden gelen trafiği yönlendir
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
Bu, kurallarınızın sadece belirli bir internet bağlantısı üzerinden geçerli olmasını sağlar, bu da karmaşık ağ ortamlarında yönlendirme politikalarını daha net hale getirir.
3. Günlük Kaydı (Logging) ile Trafik İzleme:
Port yönlendirme kurallarınızın nasıl çalıştığını veya istenmeyen bağlantı girişimlerini izlemek için günlük kaydı (logging) özelliğini kullanabilirsiniz. LOG hedefi, eşleşen paketlerin çekirdek günlüğüne (syslog) kaydedilmesini sağlar:
# Yönlendirilen HTTP trafiğini logla
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j LOG --log-prefix "HTTP_FORWARD: " --log-level info
# Daha sonra paketi kabul et
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 80 -d 192.168.1.100 -j ACCEPT
Günlüklerinizde HTTP_FORWARD: önekiyle bu trafiği kolayca filtreleyebilir ve izleyebilirsiniz. Bu, hata ayıklama ve güvenlik denetimleri için paha biçilmezdir.
4. Zaman Tabanlı Kurallar:
Iptables, -m time modülü ile kuralları belirli zaman dilimlerinde aktif hale getirmenize olanak tanır. Örneğin, bir hizmete sadece mesai saatleri içinde erişilmesini isteyebilirsiniz:
# Hafta içi 09:00-17:00 arası SSH erişimine izin ver
sudo iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 22 -d 192.168.1.101 -m time --timestart 09:00 --timestop 17:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
Bu, özellikle belirli hizmetlerin sadece belirlenmiş zamanlarda kullanılabilir olmasını istediğinizde güvenlik ve yönetim kolaylığı sağlar.
5. Port Yönlendirme Kurallarını Doğru Sıralama:
Iptables kuralları yukarıdan aşağıya doğru işlenir. Bu nedenle, daha spesifik kuralların genel kurallardan önce gelmesi önemlidir. Örneğin, belirli bir IP’den gelen trafiğe izin veren bir kuralınız varsa, bunu tüm trafiği engelleyen bir kuraldan önce koymalısınız. Aksi takdirde, genel kural spesifik kuralı geçersiz kılabilir.
6. Güvenlik Duvarı Politikaları:
FORWARD zincirinin varsayılan politikasını DROP olarak ayarlamak, güvenliği önemli ölçüde artırır. Bu, açıkça izin verilmeyen tüm trafiğin engelleneceği anlamına gelir:
sudo iptables -P FORWARD DROP
Bu politikayı uyguladıktan sonra, iç ağa yönlendirmek istediğiniz her trafik türü için açıkça ACCEPT kuralları eklemeniz gerekecektir. Bu “varsayılan olarak reddet” (deny-by-default) yaklaşımı, ağ güvenliğinin temel prensiplerindendir.
Bu gelişmiş teknikler, Iptables ile port yönlendirme yaparken sadece hizmet erişilebilirliğini sağlamakla kalmaz, aynı zamanda ağ güvenliğinizi de güçlendirmenize olanak tanır. Her zaman olduğu gibi, yeni kuralları uygulamadan önce dikkatli olun, mevcut kurallarınızı yedekleyin ve değişikliklerinizi bir test ortamında doğrulamayı düşünün.
Port Yönlendirme Kurallarını Kalıcı Hale Getirme
Iptables ile oluşturduğunuz tüm kurallar, varsayılan olarak geçicidir. Bu, sunucunuz yeniden başlatıldığında tüm kuralların kaybolacağı anlamına gelir. Bu durumu önlemek ve port yönlendirme ayarlarınızın her zaman aktif kalmasını sağlamak için kuralları kalıcı hale getirmeniz gerekir. Linux dağıtımınıza bağlı olarak bu işlemi yapmanın birkaç farklı yolu vardır.
1. Debian/Ubuntu Tabanlı Sistemlerde (netfilter-persistent):
Modern Debian ve Ubuntu sürümlerinde, Iptables kurallarını kalıcı hale getirmenin önerilen yolu netfilter-persistent servisidir. Bu servis, Iptables kurallarını bir dosyaya kaydeder ve sistem başlangıcında otomatik olarak geri yükler.
Öncelikle, netfilter-persistent paketini yüklemeniz gerekir:
sudo apt update
sudo apt install netfilter-persistent
Kurulum sırasında, mevcut Iptables kurallarınızı kaydetmek isteyip istemediğiniz sorulacaktır. Evet yanıtı vererek mevcut kurallarınızı kaydedebilirsiniz. Daha sonra, yeni bir kural eklediğinizde veya mevcut bir kuralı değiştirdiğinizde, değişiklikleri kalıcı hale getirmek için aşağıdaki komutu çalıştırmanız yeterlidir:
sudo netfilter-persistent save
Bu komut, Iptables kurallarını /etc/iptables/rules.v4 (IPv4 için) ve /etc/iptables/rules.v6 (IPv6 için) dosyalarına kaydeder. Sistem yeniden başlatıldığında, netfilter-persistent servisi bu dosyaları okuyarak kuralları otomatik olarak geri yükler.
2. CentOS/RHEL Tabanlı Sistemlerde (iptables-services veya firewalld):
CentOS ve RHEL gibi Red Hat tabanlı dağıtımlarda, geleneksel olarak iptables-services paketi veya daha modern firewalld hizmeti kullanılır.
a) iptables-services Kullanarak:
Eğer firewalld yerine geleneksel Iptables’ı kullanmayı tercih ediyorsanız, iptables-services paketini yükleyebilir ve etkinleştirebilirsiniz:
sudo yum install iptables-services
sudo systemctl enable iptables
sudo systemctl start iptables
Kuralları kaydetmek için aşağıdaki komutu kullanın:
sudo iptables-save > /etc/sysconfig/iptables
Bu komut, mevcut Iptables kurallarınızı /etc/sysconfig/iptables dosyasına kaydeder. Sistem yeniden başlatıldığında, iptables servisi bu dosyayı otomatik olarak yükleyecektir.
b) firewalld Kullanarak:
firewalld, CentOS/RHEL’in varsayılan güvenlik duvarı yönetimi aracıdır ve Iptables’ın üzerinde bir soyutlama katmanı sağlar. Eğer firewalld kullanıyorsanız, port yönlendirme kurallarını firewall-cmd komutuyla yönetmelisiniz. Bu, Iptables komutlarını doğrudan kullanmaktan farklı bir yaklaşımdır, ancak sonuç aynıdır.
Örnek olarak, dış 8080 portunu iç 192.168.1.100:80’e yönlendirmek için:
# Belirli bir bölgeye (zone) port yönlendirme ekle (örneğin, public)
sudo firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 --permanent
# Değişiklikleri etkinleştir
sudo firewall-cmd --reload
--permanent bayrağı, kuralın kalıcı olmasını sağlar ve firewall-cmd --reload komutu, kuralları yeniden yükleyerek hemen aktif hale getirir. firewalld, arka planda Iptables kurallarını otomatik olarak oluşturur ve yönetir.
3. Manuel Betik Oluşturma (Tüm Dağıtımlar İçin):
Yukarıdaki yöntemler dağıtıma özel olabilirken, tüm Linux dağıtımlarında çalışacak genel bir yöntem, Iptables kurallarını bir betik dosyasına yazmak ve bu betiği sistem başlangıcında çalıştırmaktır.
Önce, mevcut kurallarınızı bir dosyaya kaydedin:
sudo iptables-save > /etc/iptables/rules.v4
Ardından, bu kuralları sistem başlangıcında yükleyecek bir betik oluşturun (örneğin, /etc/rc.local veya systemd servisi kullanarak):
#!/bin/bash
/sbin/iptables-restore < /etc/iptables/rules.v4
exit 0
Bu betiği çalıştırılabilir hale getirin ve sistem başlangıcında çalışacak şekilde yapılandırın. Ancak, bu yöntem modern Linux dağıtımlarında genellikle netfilter-persistent veya firewalld gibi daha entegre çözümlerin yerine tercih edilmez.
Hangi yöntemi kullanırsanız kullanın, Iptables kurallarınızı kalıcı hale getirmek, ağ geçidinizin istikrarlı ve güvenli bir şekilde çalışmasını sağlamanın temelidir. Herhangi bir kural değişikliğinden sonra da bu kaydetme adımlarını tekrarlamayı unutmamalısınız.
Sonuç ve Sıkça Sorulan Sorular
Bu makale boyunca, bir Linux sunucuyu Iptables ile güçlü bir ağ geçidine dönüştürerek port yönlendirme işlemini nasıl gerçekleştirebileceğinizi adım adım inceledik. Temel kavramlardan başlayarak, basit DNAT kuralları oluşturmaktan, birden fazla hizmeti yönetmeye ve gelişmiş güvenlik senaryolarını uygulamaya kadar geniş bir yelpazeyi kapsadık. Iptables'ın esnekliği sayesinde, ağ trafiğiniz üzerinde tam kontrol sahibi olabilir, iç ağınızdaki hizmetleri güvenli bir şekilde dış dünyaya açabilir ve ağınızın genel güvenliğini artırabilirsiniz. Unutmayın ki, her ağ yapısı farklıdır ve Iptables kurallarınızı kendi özel ihtiyaçlarınıza göre uyarlamanız gerekecektir. Güvenlik ve işlevsellik arasında doğru dengeyi bulmak için kurallarınızı dikkatlice test etmeyi ve düzenli olarak gözden geçirmeyi ihmal etmeyin.
Iptables, başlangıçta karmaşık görünebilir, ancak temel prensipleri ve komut yapısını anladığınızda, ağ yönetiminde size inanılmaz bir güç ve esneklik sunar. Bu bilgilerle, artık kendi Linux ağ geçidinizi yapılandırabilir ve ağınızın potansiyelini tam olarak kullanabilirsiniz.
Sıkça Sorulan Sorular (SSS)
- Port yönlendirme güvenli midir?
- Port yönlendirme, doğru yapılandırıldığında güvenli olabilir. Ancak, bir hizmeti dış dünyaya açtığınızda, o hizmet potansiyel saldırılara maruz kalır. Güvenliği artırmak için sadece gerekli portları yönlendirin, kaynak IP kısıtlamaları kullanın, yönlendirilen hizmetlerin güncel ve güvenli olduğundan emin olun ve
FORWARDzincirinde sıkı güvenlik kuralları uygulayın. Varsayılan politikayıDROPolarak ayarlamak iyi bir başlangıçtır. - NAT nedir ve port yönlendirme ile ilişkisi nedir?
- NAT (Network Address Translation - Ağ Adresi Çevirisi), özel IP adreslerine sahip cihazların tek bir genel IP adresi üzerinden internete çıkmasını sağlayan bir mekanizmadır. Port yönlendirme (Destination NAT - DNAT), NAT'ın bir türüdür. Dışarıdan gelen bir bağlantının hedef IP adresini ve/veya portunu iç ağdaki bir cihaza ve portuna çevirerek, özel IP adresine sahip cihazlara dışarıdan erişim sağlar.
- Iptables kuralları neden sunucu yeniden başlatıldığında kayboluyor?
- Iptables kuralları, çekirdeğin belleğinde tutulur ve bu nedenle geçicidir. Sunucu yeniden başlatıldığında bellek temizlenir ve kurallar kaybolur. Kuralları kalıcı hale getirmek için,
netfilter-persistent(Debian/Ubuntu),iptables-services(CentOS/RHEL) gibi araçlar veya manuel olarak kuralları bir dosyaya kaydedip sistem başlangıcında geri yükleyen betikler kullanmalısınız. - Port yönlendirme için hangi portları kullanmalıyım?
- Bu, yönlendirdiğiniz hizmete bağlıdır. HTTP için 80 (veya 8080 gibi alternatifler), HTTPS için 443, SSH için 22 (veya 2222 gibi alternatifler), FTP için 20/21 gibi standart portlar bulunur. Güvenlik nedeniyle, bazen standart portlar yerine daha yüksek, az bilinen portları dışarıya açmak tercih edilebilir. Ancak bu "güvenlik yoluyla belirsizlik" (security by obscurity) tam bir güvenlik sağlamaz; güçlü kimlik doğrulama ve güncel yazılım daha önemlidir.
- Birden fazla iç sunucuya aynı dış portu yönlendirebilir miyim?
- Hayır, aynı dış IP adresine gelen aynı dış portu aynı anda birden fazla iç sunucuya doğrudan yönlendiremezsiniz. Bir port yönlendirme kuralı, belirli bir dış portu yalnızca tek bir iç IP adresi ve portuna eşleyebilir. Eğer aynı dış IP üzerinden birden fazla iç sunucuya erişim sağlamak istiyorsanız, her sunucu için farklı bir dış port kullanmanız gerekir (örneğin, sunucu A için dış port 8080, sunucu B için dış port 8081).
