Linux İşletim Sistemlerinde Firewall Yapılandırması (Iptables)

LinuxFirewallBu 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.

LinuxFirewall

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…

Bu yazı Unix / Linux kategorisine gönderilmiş ve , , , , , , , , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.