Merhaba arkadaşlar, bugün sizlere sunucu güvenliğinin olmazsa olmazı iptables ile nasıl temel ve etkili güvenlik duvarı kuralları oluşturacağımızı anlatacağım. Özellikle yeni kurduğunuz bir sunucuda ilk yapmanız gereken işlemlerden biridir. Doğru kurallarla hem gereksiz trafiği engeller, hem de sunucunuzu dış tehditlere karşı önemli ölçüde korursunuz. Benim de tüm sunucularımda uyguladığım bir yöntemi adım adım paylaşacağım.
iptables Nedir ve Neden Önemli?
İptables, Linux sistemlerde ağ trafiğini filtrelemek, yönlendirmek ve değiştirmek için kullanılan güçlü bir kullanıcı uzayı uygulamasıdır. Paket filtreleme tablolarını yönetir. Basitçe, sunucunuza kimlerin bağlanabileceğini, hangi portların açık olacağını ve hangi trafiğe izin verileceğini siz belirlersiniz. Varsayılan kurallar genellikle çok gevşektir, bu yüzden onları sıkılaştırmak sistem yöneticisinin ilk görevidir.
Temel Politikaları ve Zincirleri Belirleme
İşe, varsayılan politikaları (policy) güvenli hale getirerek başlıyoruz. Bu, kural eşleşmeyen paketlere ne olacağını belirler. Genel prensibimiz: "İzin verilmeyen her şey yasaktır" olmalı. Önce mevcut kuralları temizleyip temel bir başlangıç yapalım.
Şimdi INPUT (gelen), FORWARD (yönlendirilen) ve OUTPUT (giden) zincirleri için varsayılan politikaları DROP (at) yapalım. Ancak OUTPUT zincirini DROP yapmak, sunucunuzun dış dünyayla iletişimini keser, bu yüzden onu ACCEPT (kabul et) bırakıp sadece INPUT'u sıkılaştıracağız.
Loopback ve Yerel Trafiğe İzin Verme
İlk kuralımız, sunucunun kendi iç iletişimi (localhost/127.0.0.1) için kullandığı loopback arayüzündeki tüm trafiğe izin vermek olacak. Bu, birçok yerel servis için kritiktir.
ESTABLISHED ve RELATED Bağlantıları Koruma
Bu çok önemli bir kural. Sunucunuzdan başlattığınız bir bağlantının (örneğin apt update) cevap paketlerinin geri gelmesine izin verir. Ayrıca, pasif FTP veya bazı VPN protokolleri gibi, mevcut bir bağlantıyla ilgili (RELATED) yeni bağlantıları da kabul eder. Bunu eklemezseniz sunucunuz dış dünyayla sağlıklı iletişim kuramaz.
SSH Portunu Güvenli Açma
Sunucunuza uzaktan bağlanmak için SSH portunu (varsayılan 22) açmalıyız. Ancak bunu tüm dünyaya açmak risklidir. Mümkünse sadece kendi IP adresinizden veya güvendiğiniz bir ağdan erişime izin verin. Örnekte standart olarak herkese açıyorum, ama siz -s 95.70.155.55 gibi bir kaynak IP belirleyerek kısıtlayabilirsiniz.
Web Trafiği (HTTP/HTTPS) için Kurallar
Eğer sunucunuzda web servisi (Nginx/Apache) çalıştırıyorsanız, 80 ve 443 portlarını açmanız gerekir.
Ping (ICMP) İsteğine İzin Verme
Ağ sorunlarını gidermek için ping atabilmek faydalıdır. ICMP protokolüne izin verelim.
Kuralları Kalıcı Yapma
Yazdığımız kurallar şu an sadece bellekte (RAM) aktif. Sunucu yeniden başlatıldığında hepsi silinecektir. Onları kalıcı hale getirmeliyiz. Dağıtımınıza göre aşağıdaki paketlerden birini kurup kaydedebilirsiniz.
Debian/Ubuntu için:
Kurulum sırasında mevcut kuralları kaydetmek isteyip istemediğiniz sorulur. `Evet` deyin.
RedHat/CentOS/Fedora için:
Kalıcı kurallar genellikle /etc/iptables/rules.v4 (veya /etc/sysconfig/iptables) dosyasına yazılır.
Mevcut Kuralları Görüntüleme ve Test
Kurallarınızı listelemek ve numaralarıyla görmek için aşağıdaki komutları kullanın. Kural numaraları, sonradan bir kuralı silmek (sudo iptables -D INPUT 3 gibi) veya araya eklemek için önemlidir.
Son olarak, kendi IP'nizden telnet sunucu_ip 22 veya curl -I http://sunucu_ip gibi komutlarla servislerinizin erişilebilir olduğunu test edin.
Umarım bu temel rehber, sunucu güvenliğinizi sağlam temeller üzerine kurmanıza yardımcı olur. Kurallar ihtiyacınıza göre şekillendirilebilir (ör. MySQL portu 3306 için ek kural). Ben genelde yukarıdaki yapıyı temel alıp, gerektikçe özelleştiriyorum.
Peki siz sunucularınızda güvenlik duvarı kurallarınızı nasıl yönetiyorsunuz? UFW, firewalld gibi araçları mı tercih ediyorsunuz yoksa direkt iptables ile mi çalışıyorsunuz? Deneyimlerinizi ve eklemek istediklerinizi aşağıya yazabilirsiniz. Sorularınız için çekinmeyin, elimden geldiğince yardımcı olmaya çalışırım.
İptables, Linux sistemlerde ağ trafiğini filtrelemek, yönlendirmek ve değiştirmek için kullanılan güçlü bir kullanıcı uzayı uygulamasıdır. Paket filtreleme tablolarını yönetir. Basitçe, sunucunuza kimlerin bağlanabileceğini, hangi portların açık olacağını ve hangi trafiğe izin verileceğini siz belirlersiniz. Varsayılan kurallar genellikle çok gevşektir, bu yüzden onları sıkılaştırmak sistem yöneticisinin ilk görevidir.
İşe, varsayılan politikaları (policy) güvenli hale getirerek başlıyoruz. Bu, kural eşleşmeyen paketlere ne olacağını belirler. Genel prensibimiz: "İzin verilmeyen her şey yasaktır" olmalı. Önce mevcut kuralları temizleyip temel bir başlangıç yapalım.
Bash:
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
Şimdi INPUT (gelen), FORWARD (yönlendirilen) ve OUTPUT (giden) zincirleri için varsayılan politikaları DROP (at) yapalım. Ancak OUTPUT zincirini DROP yapmak, sunucunuzun dış dünyayla iletişimini keser, bu yüzden onu ACCEPT (kabul et) bırakıp sadece INPUT'u sıkılaştıracağız.
Bash:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
İlk kuralımız, sunucunun kendi iç iletişimi (localhost/127.0.0.1) için kullandığı loopback arayüzündeki tüm trafiğe izin vermek olacak. Bu, birçok yerel servis için kritiktir.
Bash:
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
Bu çok önemli bir kural. Sunucunuzdan başlattığınız bir bağlantının (örneğin apt update) cevap paketlerinin geri gelmesine izin verir. Ayrıca, pasif FTP veya bazı VPN protokolleri gibi, mevcut bir bağlantıyla ilgili (RELATED) yeni bağlantıları da kabul eder. Bunu eklemezseniz sunucunuz dış dünyayla sağlıklı iletişim kuramaz.
Bash:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Sunucunuza uzaktan bağlanmak için SSH portunu (varsayılan 22) açmalıyız. Ancak bunu tüm dünyaya açmak risklidir. Mümkünse sadece kendi IP adresinizden veya güvendiğiniz bir ağdan erişime izin verin. Örnekte standart olarak herkese açıyorum, ama siz -s 95.70.155.55 gibi bir kaynak IP belirleyerek kısıtlayabilirsiniz.
Bash:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Eğer sunucunuzda web servisi (Nginx/Apache) çalıştırıyorsanız, 80 ve 443 portlarını açmanız gerekir.
Bash:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Ağ sorunlarını gidermek için ping atabilmek faydalıdır. ICMP protokolüne izin verelim.
Bash:
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Yazdığımız kurallar şu an sadece bellekte (RAM) aktif. Sunucu yeniden başlatıldığında hepsi silinecektir. Onları kalıcı hale getirmeliyiz. Dağıtımınıza göre aşağıdaki paketlerden birini kurup kaydedebilirsiniz.
Debian/Ubuntu için:
Bash:
sudo apt-get install iptables-persistent
RedHat/CentOS/Fedora için:
Bash:
sudo yum install iptables-services
sudo systemctl enable iptables
sudo service iptables save
Kalıcı kurallar genellikle /etc/iptables/rules.v4 (veya /etc/sysconfig/iptables) dosyasına yazılır.
Kurallarınızı listelemek ve numaralarıyla görmek için aşağıdaki komutları kullanın. Kural numaraları, sonradan bir kuralı silmek (sudo iptables -D INPUT 3 gibi) veya araya eklemek için önemlidir.
Bash:
sudo iptables -L -v --line-numbers
sudo iptables -L -n
Son olarak, kendi IP'nizden telnet sunucu_ip 22 veya curl -I http://sunucu_ip gibi komutlarla servislerinizin erişilebilir olduğunu test edin.
Umarım bu temel rehber, sunucu güvenliğinizi sağlam temeller üzerine kurmanıza yardımcı olur. Kurallar ihtiyacınıza göre şekillendirilebilir (ör. MySQL portu 3306 için ek kural). Ben genelde yukarıdaki yapıyı temel alıp, gerektikçe özelleştiriyorum.
Peki siz sunucularınızda güvenlik duvarı kurallarınızı nasıl yönetiyorsunuz? UFW, firewalld gibi araçları mı tercih ediyorsunuz yoksa direkt iptables ile mi çalışıyorsunuz? Deneyimlerinizi ve eklemek istediklerinizi aşağıya yazabilirsiniz. Sorularınız için çekinmeyin, elimden geldiğince yardımcı olmaya çalışırım.