Takip et

Sunucular Arası Trafiği Korumak İçin Iptables Güvenlik Duvarı Kurulumu

Sunucular Arası Trafiği Korumak İçin Iptables Güvenlik Duvarı Kurulumu Modern altyapılarda, sunucular arası iletişim hayati öneme sahipti

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.10
  • SERVER_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:

  1. 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.
  2. Loglama Kuralları: Şüpheli trafik akışlarının önüne LOG kuralları ekleyerek, paketin nereye takıldığını veya hangi kural tarafından engellendiğini görebilirsiniz.
  3. Geçici olarak Kural Kaldırma: Sorunlu olabileceğinden şüphelendiğiniz kuralları tek tek kaldırarak veya zincir politikalarını geçici olarak ACCEPT yaparak sorunun kaynağını daraltabilirsiniz.
  4. Ağ İzleme Araçları: tcpdump veya wireshark gibi 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.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık