Bu makalemizde Linux işletim sistemleri ile entegre gelen iki güvenlik eklentisi olan “Linux Firewall (Iptables)” yazılımını inceleyeceğiz.
Linux Firewall (Iptables) Nedir ?
Iptables netfilter takımı ve birçok destekleyici tarafından geliştirilen güvelik duvarı yazılımıdır. Linux çekirdeğiyle konuşarak paket süzme kurallarını belirler. Iptables, Linux işletim sisteminin varsayılan güvenlik duvarıdır. Bu güvenlik duvarı servislerin çalıştığı portlardan geçen trafiği engelleyebilir, başka bir porta yönlendirme yapabilir.
1. Sunucumuzda kurulu değilse Firewall (iptables) yazılımını kuruyoruz. Red Hat ve türevi işletim sistemlerinde “iptables” varsayılan olarak kurulu halde geliyor.
-- IPv4 için iptables kurulumu aşağıdaki gibi yapılabilir. # yum install iptables -- IPv6 için iptables kurulumu aşağıdaki gibi yapılabilir. # yum install iptables-ipv6
2. Sunucumuzda firewall servisimizi kapalıysa başlatıyoruz ve sunucumuz açıldığında otomatik başlaması için gerekli ayarları yapıyoruz.
-- Firewall servisimizi başlatmak için # service iptables start -- Firewall servisimizin sunucumuz açıldığında otomatik başlaması için # chkconfig --level 345 iptables on -- Firewall servisimizi durdurmak için # service iptables stop -- Firewall servisimizi sunucumuz açıldığında başlamaması için # chkconfig iptables off
3. Sunucumuzda firewall servisinin mevcut durumunu sorgulamak için aşağıdaki komutu kullanabiliriz.
# service iptables status Table: filter Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host Chain OUTPUT (policy ACCEPT) num target prot opt source destination
4. Sunucumuzda grafik arayüzden firewall yönetim paneline erişmek için “System Administration>Firewall” yolunu izlemeliyiz.
5. Sunucumuzda izinleri verebilmek ve gerekli yapılandırmamızı yapabilmek için “iptables” komutunu kullanıyoruz. Bununla ilgili bilgileri inceleyelim.
-- Iptables Hedefleri ACCEPT Paketlerin geçisine izin verilir. DROP Paketlerin geçişine izin verilmez. REJECT Paketlerin erişimi reddedilir ve gönderen bilgilendirilir. RETURN Zincirin sonuna gönderilir. QUEUE Paketler kullanıcı alanına gönderilir. -- Iptables Parametreleri -A ZİNCİR Zincire kural ekler. -E ZİNCİR Zinciri yeniden adlandırır. -D ZİNCİR Zincirden bir kural siler. -D ZİNCİR Zincirden belirtilen numaradaki kurali siler. -L ZİNCİR Belirtilen zincirdeki kurallari gösterir. -E ZİNCİR Zinciri yeniden adlandirir. -l ZİNCİR Zincirde belirtilen numaralı alana kuralı ekler. -R ZİNCİR Zincirde kuralın yerine başkasını koyar. -R ZİNCİR Zincirde belirtilen numaralı alana bir başkasını koyar. -N ZİNCİR Yeni bir zincir oluşturur. -X ZİNCİR Kullanıcının eklediği bir zinciri siler. -F ZİNCİR Zincirdeki kuralların tümünü siler. -P ZİNCİR Zincire genel politika ekler. -- Zincirler ( INPUT,OUTPUT,FORWARD ve POSTROUTING PREROUTING ) büyük harflerle yazılır.
6. Yukarıdaki “iptables” komut ve parametrelerini örneklerle açıklayalım.
-A –append : Belirli bir zincirin sonuna bir kural eklemek için; # iptables -A INPUT CHAIN_NAME # iptables -A OUTPUT CHAIN_NAME -D –delete : Zinciri silmek için kullanılan komut; Silme işlemi için ya zincir numarası belirtilir ya da kuralın kendisi. # iptables -D INPUT 1 # iptables -D INPUT --dport 80 -j DROP -R –replace : Mevcut zinciri değiştirmek için; # iptables -R INPUT 1 -s 192.168.0.1 -j DROP -I — insert : Genel zincir içinde belirlenmiş bir alana bir zincir daha eklemek için; # iptables -I INPUT 1 --dport 80 -j ACCEPT -L –list : Kuralları listeler; -- Zincirdeki tüm kuralları listelemek için # iptables -L -- Sadece INPUT kurallarını listelemek için # iptables -L INPUT -F –flush : Zincirdeki tüm kuralları siler; -- INPUT zincirindeki tüm kuralları silmek için # iptables -F INPUT -- Tüm kuralları silmek için # iptables -F -N –new-chain : Yeni bir zincir oluşturur # iptables -N CHAIN_NAME -X –delete-chain : Bir zinciri siler. -- Belli bir zinciri silmek için # iptables -X CHAIN_NAME -- Tüm zincirleri silmek için # iptables -X -P –policy : Kernelin bir zincirdeki kurala karşılık hangi hareket tarzını göstermesi gerektiğini söyler ACCEPT, REJECT, DROP ... # iptables -P INPUT DROP -- ! karakteri ile belirli bir kural içerinde ayrıcalık oluşturabilir; Örneğin tüm gelen tcp bağlantılarını engellemek ama 192.168.2.130 numaralı IP’ye ayrıcalık tanımak istiyoruz # iptables -A INPUT -p tcp --source ! 192.168.2.130 -j DROP -p –protocol : Kuralda kullanılacak protokol tipini belirtir: tcp, udp, icmp, all Örneğin tüm icmp trafiğini engellemek için. # iptables -A INPUT -p icmp -j DROP -s –source : Kaynak adresini belirtmek için kullanılır. Örneğin 192.168.2.130 numaralı ipden gelen tüm tcp trafiğini kabul etmek için. iptables -A INPUT -p tcp -s 192.168.2.130 -j ACCEPT -d –destination : Varış adresini belirler. Örneğin 192.168.2.130 numaralı ipye tcp trafiği için port yönlendirmesi yapılacaksa # iptables -A FORWARD -p tcp -d 192.168.2.130 -j ACCEPT -i –in-interface : Belirli bir ağ arayüzünün gelen bağlantıları için belirli bir kuralı uygulama (Sadece INPUT, FORWARD ve PREROUTING). Örneğin eth0 aygıtında tüm gelen icmp trafiğini engellemek için # iptables -A INPUT -p icmp -i eth0 -j DROP -o –out-interface : Belirli bir ağ arayüzünün giden bağlantıları için belirli bir kuralı uygulama (Sadece OUTPUT, FORWARD ve PREROUTING). Örneğin eth0 aygıtında tüm giden icmp trafiğini engellemek için # iptables -A OUTPUT -p icmp -o eth0 -j DROP –sport –source-port : Kaynak portu ya da sıra halindeki portları [1024:2042] belirlemek için kullanılır. Birden fazla port belirtilcekse -m multiport parametresi kullanılır. # iptables -A INPUT -p tcp --sport 80 -j ACCEPT # iptables -A INPUT -p udp --sport 80 -j DROP # iptables -A INPUT -p tcp -m multiport --sport 3128,21,1000 -j DROP # iptables -A INPUT -p tcp --sport 1024:2042 -j ACCEPT –dport –destination-port : Sıra halindeki varış portlarını belirtmek için kullanılır. Birden fazla port belirtilcekse -m multiport parametresi kullanılır. # iptables -A OUPUT -p tcp --dport 110 -j DROP # iptables -A OUPUT -p udp --dport 110 -j DROP # iptables -A OUPUT -p tcp -m multiport --dport 110,4242,119 -j DROP # iptables -A OUPUT -p tcp --dport 4925:4633 -j ACCEPT –mac-source : MAC adresini belirtmek için kullanılır. Örneğin 35:26:AA:35:26:AA MACadresinden gelen tüm trafiği engellemek için # iptables -A INPUT --mac-source 35:26:AA:35:26:AA -j DROP –state : Belirli bir paket durumunun karşılaştırması için kullanılır. (ESTABLISHED, NEW, INVALID, RELATED) # iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
7. Sunucumuzda açıkladığımız firewall ayaraları ile ilgili örnek yapılandırmalar yapalım.
-- Ön ayarlı kuralların yüklenmesi (Tüm ağ trafiğini engeller) # iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -P FORWARD DROP -- Loopback Adapter için izin ver # iptables -A INPUT -i lo -j ACCEPT # iptables -A OUTPUT -o lo -j ACCEPT -- Web trafiğine izin ver # iptables -A INPUT -i eth0 -p tcp -m tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT -- DNS sunucu hizmetine izin ver: # iptables -A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT # iptables -A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT # iptables -A INPUT -i eth0 -p tcp -m tcp --sport 53 -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 53 -j ACCEPT -- FTP sunucu hizmetine izin ver # iptables -A INPUT -i eth0 -p tcp -m tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT # iptables -A INPUT -i eth0 -p tcp -m tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -i eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp -m tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT # iptables -A OUTPUT -o eth0 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED,RELATED -j ACCEPT -- Belirli bir ip için izin ver veya engelle: -- İzin vermek için # iptables -A INPUT -s 192.168.2.130 -j ACCEPT -- Engellemek için # iptables -A INPUT -s 10.123.452.36 -j DROP -- Özetle TCP Portu açmak için # iptables -A TRUSTED -i eth0 -p tcp -m tcp --dport port_numarası -j ACCEPT -- Özetle UDP Portu açmak için # iptables -A TRUSTED -i eth0 -p udp -m udp --dport port_numarası -j ACCEPT
8. Sunucularımız için bir firewall standartı oluşturmak istiyorsak bunu bir script haline getirebilir ve sunucularımızda çalıştırabiliriz. Oluşturacağımız script ile firewall ayarlarımızı düzenleyebiliriz.
-- Firewall scriptimizi oluşturuyoruz ve aşağıdaki içeriği yazıyoruz. # vim /tmp/firewall_config.sh -- Script İçeriğimiz #!/bin/bash # Ağ Segmentimiz LAN=192.168.2.1/24 # IP Adresimiz OWNIP=192.168.1.2 # Tüm firewall ayarlarını sil iptables -F iptables -X # Ön tanımlı ayarları geri yükle. Tüm bağlantıları kabul et iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT # Yeni iki zincir oluştur iptables -N FIREWALL iptables -N TRUSTED # ESTABLISHED ve RELATED gelen bağlantılara izin ver iptables -A FIREWALL -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT # Loopback trafiğine izin ver iptables -A FIREWALL -i lo -j ACCEPT # Gönderilen tüm paketleri TRUSTED zincirine yolla iptables -A FIREWALL -j TRUSTED # Diğer tüm paketleri engelle iptables -A FIREWALL -j DROP # Tüm gelen INPUT paketleri FIREWALL zincirine yolla iptables -A INPUT -j FIREWALL # Tüm forward edilmiş paketleri engelle iptables -A FORWARD -j DROP # samba (Netbios'suz) iptables -A TRUSTED -i eth1 -p tcp -m tcp -s $LAN --dport 445 -j ACCEPT # Samba (Netbios) iptables -A TRUSTED -i eth1 -p udp -m udp -s $LAN --dport 137:139 -j ACCEPT iptables -A TRUSTED -i eth1 -p udp -m udp --sport 137:138 -j ACCEPT # Sonuç mesajı echo " [Iptables kuralları uygulandı] " -- Script dosyamızın çalışma izinlerini düzenliyoruz. # chmod u+x /tmp/firewall_config.sh -- Scriptimizi çalıştırmak için # /tmp/firewall_config.sh
Linux Firewall (iptables) ile ilgili inceleyceklerimiz bu kadar genelde sık kullanılan yapılandırmaları inceledik. Yukarıdaki örneklerle kendi sunucu ve ağ yapımıza göre firewall yapılandırmamızı yapabiliriz. Sunucularımızda Oracle Veritabanı Yönetim Sistemi kullanacaksak Oracle varsayılan olarak firewall servisinin sorun çıkmaması açısından “disabled” durumda olmasını önermektedir. Yukarıdaki işlemler “Red Hat Enterprise Linux 6.x” işletim sisteminde test edilmiştir. Oracle Enterprise Linux 6.x ve CentOS 6.x gibi Red Hat türevi işletim sistemlerinde yapılandırmalarımız benzerdir.
Başka bir makalede görüşmek üzere…