Sunucular Arası Trafiği Korumak İçin Iptables Güvenlik Duvarı Kurulumu
Modern altyapılarda, sunucular arası iletişim hayati öneme sahiptir. Mikro hizmet mimarileri, veritabanı sunucuları, uygulama katmanları ve önbellek sistemleri gibi bileşenler sürekli olarak birbirleriyle etkileşim halindedir. Bu etkileşimin güvenliğini sağlamak, genel sistem güvenliğinin temel bir parçasıdır. Her ne kadar ağ düzeyinde güvenlik önlemleri alınsa da, her bir sunucuda bir güvenlik duvarı (firewall) bulundurmak, derinlemesine savunma (defense-in-depth) stratejisinin kritik bir bileşenidir. Bu rehberde, Linux sistemlerinin yerleşik güvenlik duvarı aracı olan Iptables’ı kullanarak sunucularınız arasındaki trafiği nasıl koruyacağınızı adım adım öğreneceksiniz.
Iptables, Linux çekirdeğinin Netfilter çerçevesi için bir kullanıcı alanı programıdır. Paket filtreleme, ağ adresi çevirisi (NAT) ve paket manipülasyonu gibi işlevleri yerine getirmemizi sağlar. Doğru yapılandırıldığında, Iptables sunucularınızı yetkisiz erişime karşı koruyabilir, istenmeyen trafiği engelleyebilir ve sadece izin verilen iletişim kanallarının açık kalmasını sağlayabilir.
Iptables Temelleri: Netfilter Çerçevesi ve Çalışma Prensibi
Iptables’ı etkin bir şekilde kullanabilmek için temel kavramlarını anlamak önemlidir. Iptables, Linux çekirdeğindeki Netfilter adlı bir ağ paket filtreleme çerçevesiyle etkileşime girer. Netfilter, ağ trafiğini belirli noktalarda yakalayarak, Iptables tarafından tanımlanan kurallara göre işlem yapılmasına olanak tanır.
Iptables’ta üç temel yapı bulunur:
- Tablolar (Tables): Farklı işlevlere sahip kural setlerini barındırır. En sık kullanılan tablolar şunlardır:
filter: Paket filtreleme için kullanılır (izin verme, engelleme). Bu rehberde ağırlıklı olarak bu tabloya odaklanacağız.nat: Ağ Adresi Çevirisi (NAT) için kullanılır (örneğin, port yönlendirme).mangle: Paket başlıklarını değiştirmek için kullanılır.
- Zincirler (Chains): Tablolar içinde yer alan ve paketlerin belirli bir noktada geçtiği kural listeleridir. Her zincir, bir dizi kural içerir ve paketler bu kurallarla sırayla eşleştirilir. En önemli zincirler şunlardır:
INPUT: Sunucuya gelen ve sunucunun kendisi için hedeflenen paketler.OUTPUT: Sunucudan çıkan ve başka bir hedefe gönderilen paketler.FORWARD: Sunucu üzerinden geçen (yönlendirilen) paketler (örneğin, sunucu bir router gibi davranıyorsa).
- Kurallar (Rules): Bir zincir içindeki her kural, belirli eşleşme kriterleri (kaynak IP, hedef IP, port, protokol vb.) ve bir hedef (target) içerir. Bir paket bir kural ile eşleştiğinde, hedef tarafından belirtilen eylem gerçekleştirilir. Yaygın hedefler:
ACCEPT: Paketin geçişine izin verir.DROP: Paketi sessizce düşürür, göndericiye herhangi bir yanıt göndermez.REJECT: Paketi düşürür ve göndericiye bir hata mesajı (örneğin, ICMP port unreachable) gönderir.LOG: Paketin bilgilerini sistem günlüğüne kaydeder, ancak paketin geçişini etkilemez (genellikle diğer hedeflerle birlikte kullanılır).
Güvenlik Politikaları ve Zincirler
Iptables yapılandırmasının temelini, her zincir için belirlenen varsayılan politikalar (default policies) oluşturur. Bu politikalar, hiçbir kural tarafından eşleştirilmeyen paketlere ne yapılacağını belirler. Güvenlik açısından en iyi uygulama, “varsayılan olarak reddet” (deny by default) yaklaşımını benimsemektir. Bu, tüm trafiği varsayılan olarak engellemek ve yalnızca açıkça izin verilen trafiğe geçiş izni vermektir.
Varsayılan politikaları ayarlamak için aşağıdaki komutları kullanırız:
INPUT zincirindeki tüm trafiği varsayılan olarak engelle
sudo iptables -P INPUT DROP
FORWARD zincirindeki tüm trafiği varsayılan olarak engelle (sunucu router değilse)
sudo iptables -P FORWARD DROP
OUTPUT zincirindeki tüm trafiği varsayılan olarak engelle (dikkatli olun, sunucu dışarıya da bağlanamaz)
sudo iptables -P OUTPUT DROP
OUTPUT zinciri için DROP politikası başlangıçta sorunlara yol açabilir, çünkü sunucunuzun DNS sorguları yapması, paket güncellemesi indirmesi gibi temel işlemler için dışarıya bağlantı kurması gerekebilir. Genellikle INPUT ve FORWARD için DROP politikası uygulanırken, OUTPUT için daha esnek bir yaklaşım benimsenir ya da çok katı bir güvenlik politikası gerekiyorsa, OUTPUT için de DROP uygulanır ve gerekli tüm çıkış bağlantıları için kurallar açıkça tanımlanır.
Sunucular Arası Trafiği Korumak İçin Iptables Kurulumu
Şimdi sunucularınız arasındaki trafiği korumak için pratik Iptables kurulum adımlarına geçelim. Bu örnekte, bir web sunucusu (SERVER_WEB) ve bir veritabanı sunucusu (SERVER_DB) olduğunu ve bu iki sunucunun iç ağda belirli IP adreslerine sahip olduğunu varsayacağız. Örneğin:
SERVER_WEB: 192.168.1.10SERVER_DB: 192.168.1.20- Yönetici İş İstasyonu IP: 10.0.0.50 (SSH erişimi için)
- İç ağ aralığı: 192.168.1.0/24
Başlangıç Ayarları ve Varsayılan Politikalar
Herhangi bir kural eklemeden önce, mevcut Iptables kurallarını temizlemek ve varsayılan politikaları ayarlamak iyi bir uygulamadır. Bu, yanlışlıkla kendinizi sunucudan kilitlemenizi önlemek için dikkatli yapılmalıdır.
Mevcut tüm kuralları temizle
sudo iptables -F # filter tablosu için tüm zincirleri temizle
sudo iptables -X # Kullanıcı tanımlı zincirleri sil
sudo iptables -Z # Zincir sayaçlarını sıfırla
NAT tablosu için de aynı işlemi yapabilirsiniz (eğer kullanılıyorsa)
sudo iptables -t nat -F
sudo iptables -t nat -X
Varsayılan politikaları DROP olarak ayarla (güvenli bir başlangıç için)
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT DROP # DİKKAT: Bu, sunucunuzun dışarıya da bağlanmasını engeller!
Kendi kendini kilitlememek için önce SSH bağlantısını açık tutun (geçici veya belirli bir IP'den)
Bu kuralı ekledikten sonra diğer DROP politikalarını uygulayın.
Bu örnekte, admin_ip'den SSH erişimine izin veriyoruz.
sudo iptables -A INPUT -p tcp --dport 22 -s 10.0.0.50 -j ACCEPT
Loopback trafiğine izin ver (sunucunun kendi kendine konuşması için kritik)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
Zaten kurulmuş ve ilgili bağlantılara izin ver
Bu kural, mevcut oturumların (SSH, HTTP vb.) devam etmesini sağlar.
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Yukarıdaki adımları her sunucu için uygulayın. OUTPUT zincirini DROP olarak ayarladıysanız, sunucunun dışarıya yapması gereken tüm bağlantıları (DNS, NTP, paket depoları vb.) açıkça tanımlamanız gerekecektir.
İç Ağ Trafiği İçin Kurallar (Örnek: SERVER_WEB üzerinde)
Şimdi SERVER_WEB (192.168.1.10) üzerinde, SERVER_DB (192.168.1.20) ile iletişim kurmasını sağlayacak kuralları tanımlayalım. SERVER_WEB, SERVER_DB‘ye MySQL portu (3306) üzerinden bağlanmalıdır.
SERVER_WEB (192.168.1.10) için kurallar:
Web sunucusu olduğu için dışarıdan HTTP/HTTPS trafiğine izin ver
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
SERVER_WEB'in SERVER_DB'ye (192.168.1.20) MySQL (3306) üzerinden bağlanmasına izin ver
Bu, OUTPUT zincirinde tanımlanmalıdır, çünkü SERVER_WEB bağlantı başlatır.
sudo iptables -A OUTPUT -d 192.168.1.20 -p tcp --dport 3306 -j ACCEPT
SERVER_DB'den gelen MySQL yanıtlarına izin vermek ESTABLISHED kuralı ile zaten sağlanır.
Ancak SERVER_DB'nin INPUT zincirinde de bu trafiğe izin vermesi gerekir.
Kendi iç ağındaki diğer sunuculara belirli portlardan erişim (örneğin, başka bir uygulama sunucusu)
sudo iptables -A OUTPUT -d 192.168.1.30 -p tcp --dport 8080 -j ACCEPT
Eğer OUTPUT'u DROP yaptıysanız, DNS sorguları için izin vermeniz gerekir
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # UDP DNS
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT # TCP DNS (nadiren de olsa kullanılır)
Gerekirse NTP (zaman senkronizasyonu) için izin ver
sudo iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
İç Ağ Trafiği İçin Kurallar (Örnek: SERVER_DB üzerinde)
Şimdi SERVER_DB (192.168.1.20) üzerinde, sadece SERVER_WEB (192.168.1.10) ve yönetici iş istasyonu (10.0.0.50) tarafından erişilmesine izin verecek kuralları tanımlayalım.
SERVER_DB (192.168.1.20) için kurallar:
SERVER_WEB'den (192.168.1.10) gelen MySQL (3306) bağlantılarına izin ver
sudo iptables -A INPUT -s 192.168.1.10 -p tcp --dport 3306 -j ACCEPT
Yönetici iş istasyonundan (10.0.0.50) gelen SSH (22) bağlantılarına izin ver
Bu kuralı başlangıç ayarlarına eklemiş olmalısınız, burada tekrar etmekte fayda var.
sudo iptables -A INPUT -s 10.0.0.50 -p tcp --dport 22 -j ACCEPT
Kendi iç ağındaki diğer sunuculardan gelen özel trafiğe izin ver (örneğin, bir yedekleme sunucusu)
sudo iptables -A INPUT -s 192.168.1.40 -p tcp --dport 873 -j ACCEPT # rsync portu
Dış Ağdan Gelen Trafiği Yönetme
Eğer sunucularınız dış ağa doğrudan bağlıysa veya dış dünyadan erişilebilir olması gereken hizmetler sunuyorsa, INPUT zincirinde bu trafiğe izin vermeniz gerekir. Ancak, sunucular arası trafik için genellikle iç ağ IP’leri kullanılır ve dışarıdan gelen gereksiz tüm bağlantılar engellenmelidir.
Örnek (SERVER_WEB üzerinde, dışarıdan HTTP/HTTPS trafiğine izin vermek için):
Daha önce eklemiş olmalısınız:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Dışarıdan gelen herhangi bir SSH bağlantısını engelle (sadece belirli admin IP'lerinden izin ver)
Bu kural, varsayılan DROP politikası ve belirli admin IP'sinden gelen SSH kuralı ile zaten sağlanır.
Ancak açıkça engellemek isterseniz:
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
Loglama ve İzleme
Güvenlik duvarı kurallarınızın doğru çalışıp çalışmadığını ve yetkisiz erişim denemelerini izlemek için loglama kritik öneme sahiptir. LOG hedefi, eşleşen paketlerin bilgilerini sistem günlüğüne (genellikle /var/log/syslog veya /var/log/kern.log) kaydeder.
Engellenen paketleri loglamak için DROP kuralından hemen önce bir LOG kuralı ekleyebilirsiniz:
INPUT zincirinde engellenen paketleri logla (log prefix ile)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPTABLES_INPUT_DROP: " --log-level 7
sudo iptables -A INPUT -j DROP # Bu, varsayılan DROP politikasına ek bir DROP kuralıdır,
# ancak belirli bir zincir sonuna eklenerek loglamayı garanti eder.
-m limit --limit 5/min seçeneği, çok sayıda log kaydının oluşmasını önlemek için dakikada maksimum 5 log girişi sınırlar.
Kalıcı Hale Getirme
Iptables kuralları varsayılan olarak geçicidir ve sunucu yeniden başlatıldığında kaybolur. Kuralları kalıcı hale getirmenin birkaç yolu vardır:
Debian/Ubuntu Tabanlı Sistemlerde (iptables-persistent)
Kurulum
sudo apt update
sudo apt install iptables-persistent
Mevcut kuralları kaydet
sudo netfilter-persistent save
Kuralları yüklemek için (yeniden başlatmada otomatik yapılır)
sudo netfilter-persistent reload
Kurallar /etc/iptables/rules.v4 ve /etc/iptables/rules.v6 dosyalarına kaydedilir.
RHEL/CentOS Tabanlı Sistemlerde (iptables-services)
Kurulum
sudo yum install iptables-services
Iptables servisini etkinleştir
sudo systemctl enable iptables
Mevcut kuralları kaydet
sudo iptables-save > /etc/sysconfig/iptables
Kuralları yeniden yüklemek için
sudo systemctl restart iptables
Manuel Kaydetme/Yükleme (Tüm Linux Dağıtımları)
Kuralları bir dosyaya kaydedip, sunucu başlatıldığında bu dosyayı bir başlangıç betiği (örneğin, /etc/rc.local veya systemd service) ile yükleyebilirsiniz.
Kuralları kaydet
sudo iptables-save > /etc/iptables/rules.v4
Kuralları yükle
sudo iptables-restore < /etc/iptables/rules.v4
Sonuç
Iptables ile sunucular arası trafiği korumak, ağ güvenliğiniz için proaktif ve güçlü bir adımdır. Bu rehberde öğrendiğiniz temelleri ve pratik örnekleri uygulayarak, sunucularınızın yalnızca gerekli ve güvenilir iletişim kanallarını kullanmasını sağlayabilirsiniz. Unutmayın ki güvenlik duvarı kuralları "bir kere ayarla ve unut" yaklaşımıyla değil, sürekli gözden geçirilerek ve ihtiyaçlara göre güncellenerek en etkili şekilde çalışır. Sistemlerinizdeki değişiklikleri takip edin, yeni hizmetler eklendiğinde veya mevcut hizmetlerin portları değiştiğinde güvenlik duvarı kurallarınızı güncellemeyi ihmal etmeyin.
Sıkça Sorulan Sorular (SSS)
Iptables ve UFW/firewalld arasındaki fark nedir?
Iptables, Linux çekirdeğinin Netfilter çerçevesiyle doğrudan etkileşime giren düşük seviyeli bir araçtır. UFW (Uncomplicated Firewall) ve firewalld ise Iptables'ın üzerinde çalışan, kullanımı daha kolay arayüzlerdir. UFW genellikle Debian/Ubuntu tabanlı sistemlerde, firewalld ise RHEL/CentOS tabanlı sistemlerde kullanılır. Bu araçlar, karmaşık Iptables komutlarını daha basit komutlara veya bölgelere dönüştürerek yönetimi kolaylaştırır. Temelde hepsi Iptables'ı kullanır, ancak farklı yönetim seviyeleri sunarlar. Daha ince ayar ve tam kontrol için Iptables'ı doğrudan kullanmak tercih edilebilir.
Kurallarım çalışmıyor, nasıl hata ayıklayabilirim?
Hata ayıklama için birkaç yöntem vardır:
iptables -L -n -v: Mevcut kuralları, paket ve bayt sayılarıyla birlikte listeler. Hangi kuralların paketlerle eşleştiğini görmenizi sağlar.- Loglama Kuralları: Şüpheli trafik akışlarının önüne
LOGkuralları ekleyerek, paketin nereye takıldığını veya hangi kural tarafından engellendiğini görebilirsiniz. - Geçici olarak Kural Kaldırma: Sorunlu olabileceğinden şüphelendiğiniz kuralları tek tek kaldırarak veya zincir politikalarını geçici olarak
ACCEPTyaparak sorunun kaynağını daraltabilirsiniz. - Ağ İzleme Araçları:
tcpdumpveyawiresharkgibi araçlarla ağ arayüzündeki trafiği dinleyerek, paketlerin Iptables'a ulaşmadan önce veya sonra nasıl davrandığını gözlemleyebilirsiniz.
Tüm Iptables kurallarını nasıl temizlerim?
Tüm kuralları temizlemek ve varsayılan politikaları ACCEPT olarak sıfırlamak için şu komutları kullanabilirsiniz:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
sudo iptables -X
sudo iptables -Z
Bu komutlar, güvenlik duvarını tamamen açar. Bu işlemi sadece hata ayıklama sırasında veya acil durumlarda yapmalı ve ardından güvenli kurallarınızı tekrar yüklemelisiniz.
Iptables'ı kapatabilir miyim?
Iptables, Linux çekirdeğinin bir parçası olduğu için tamamen "kapatılamaz". Ancak, tüm zincirlerin varsayılan politikalarını ACCEPT olarak ayarlayarak ve tüm kuralları temizleyerek güvenlik duvarı işlevselliğini etkili bir şekilde devre dışı bırakabilirsiniz. Bu, sunucunuzu tüm ağ trafiğine açık hale getireceği için kesinlikle önerilmez.
Sunucular arası HTTPS trafiğini nasıl korurum?
Sunucular arası HTTPS (port 443) trafiğini korumak için, tıpkı diğer portlarda olduğu gibi, kaynak ve hedef IP adreslerini belirterek INPUT ve OUTPUT zincirlerinde kurallar tanımlamanız gerekir. Örneğin, bir ön uç web sunucunuzun bir arka uç API sunucusuna HTTPS üzerinden bağlanmasına izin vermek için:
Ön uç web sunucusu (192.168.1.10) üzerinde:
sudo iptables -A OUTPUT -d 192.168.1.30 -p tcp --dport 443 -j ACCEPT
Arka uç API sunucusu (192.168.1.30) üzerinde:
sudo iptables -A INPUT -s 192.168.1.10 -p tcp --dport 443 -j ACCEPT
Bu kurallar, trafiği şifrelemenin ötesinde, hangi sunucuların hangi sunucularla HTTPS üzerinden konuşabileceğini kısıtlar ve böylece güvenlik katmanını artırır.
