Iptables Nasıl Kullanılır?

Internete bağlanan her sistem potansiyel saldiri tehlikelerine gebedir.Bir saldirgan direkt olarak veya kendini gizleyerek sisteme sızmak isteyebilir.Güncel Linux çekirdeklerinde kullanılan firewall'larin son gözdesi iptables, paket filtrelemesi yaparak erişim yetkisini belli bir seviyede tutar.Bilinmelidir ki sistem kurulmaya başladigi andan itibaren, yönetim politikasinin belirlenmeye başlamasi ve firewall'un bu politika üzerine inşası şarttır.Netfilter ( iptables ) kurulmadan önce, kullanıcının gereksiz servisleri çalıştırmaması ve gerekli olanlarda daha seçici davranması gerekir.

Daha seçici davranmasindan kasit bir servisin her zaman bir kaç tane daha alternatifi olmasıdır ( sendmail yerine postfix gibi).Sendmail eski günlerdeki verdiği güveni artık verememektedir. Linux da bilgilerinizi şifrelemek ve harici kullanıcılarin bunlara erişimini engellemek içinSSH ( Secure Shell ) kurmak, bununla birlikte telnet gibi hedef olarak görülen servisleri gerek olmadikça çaliştirmamak, zorunluluk halinde dahi root girişini açmamak, önde gelen ve sürekli kullanılan önlemler listesinde yer alır.

Peki firewall bizi ne kadar korur? Firewall'ı kurduktan sonra hiç bir saldırgan bizim sistemimize giremez deyip içimiz rahat edebilir mi?Eğer Firewall'ı kurup makinamızı kapatıp hiç açmayacaksak bu doğrudur.Bunu yapmak için firewall kurmakta gerekmez zaten.Peki biz ne yapıyoruz. Tek başina firewall bir güvenlik görevlisi gibi çalişir.Bir şirketin koruma memurundan öteye gidemez.Yani içeri giren bir şahsın elini kolunu sallayak girmesine izin vermez.Belli bir aramadan geçirerek üzerinde tehlikeli madde bulunmadığına inandığı andan sonra içeri girmesine izin verir.Ama bulaşıcı bir hastalık taşıyıp taşımadığını bilemez çünkü bu görev ona ait değildir.Bu şu demektir firewall paket filitrelemesi yapar uygun bölgelere uygun paketleri geçirir.Ama paketlerin içindeki datalarla ilgilenmez.Tcp-IP protokolunu bilenlerin ne demek isteğimi net anladiğini umuyorum.

Internete bağlanan her sistem potansiyel tehlike altindadir. Peki bağlanmayan sistem değil midir? Büyük şirketler çalişanlarina güvenirler ama içerden de tehlike gelebilir.IPtables arabirim filtremesi yapar.Yani sadece Internetten değil birkaç arabirim bulunduran büyük bir ağda da erişim yetkisi düzenlenebilir. (Arabirimden kasıt birkaç ethernet birimi içeren veya PPP vb. ara birimi içeren ağlardır)Büyük bir ağda gereklidir de.

Iptables kurallar zinciri mantığı ile çalişir, bu zincirler INPUT,OUTPUT, FORWARD, olup paket adreslerini yönetmek ,için PREROUTING, POSTROUTING kullanılır.Kullanıcı isterse kendi tanımladığı bir zinciride ekleyebilir.

TANIMLI ZİNCİRLER
INPUT Gelen paketler için kurallar zinciri.
OUTPUT Giden paketler için kurallar zinciri.
FORWARD Yönlendirilen paketler için kurallar zinciri.
PREROUTING Sadece NAT içindir.Gelen paketlerin değiştirilmesi için.
POSTROUTING Sadece NAT içindir.Giden paketlerin değiştirilmesi için.
Not : Bu zincirler silinemez.

Netfilter(iptables) da kurallar oluşturmak için iptables komutu kullanılır.Herhangi bir zincire gelen paket kurallardan herhangi biriyle uyuşana kadar ilerleyerek zincirin sonuna kadar ulaşır.Herhangi bir kuralla uyuşmayan paket işleme sokulmaz.

Netfilter zincir kurallari if-then-else mantiğinda çalişir.

# Iptables -A INPUT -j ACCEPT -i eth1 -s 10.1.34.0/255.255.255.0
eth1 arabiriminden gelen 10.1.34.0 ağına ve 255.255.255.0 netmask'ına ait paketler kabul ediliyor.

IPTABLES HEDEFLERİ
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 PARAMETRELERİ
-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.
Not :
Zincirler ( INPUT,OUTPUT,FORWARD ve POSTROUTING PREROUTING ) büyük harflerle yazılır.

IPTABLES SEÇENEKLERİ
! Kuralı tersine çevirir.
-s [!] Kaynak adresini belirtir.127.0.0.1/255.0.0.0 gibi..
-p [!] UDP,TCP,ICMP,ALL protokollerinden biri kullanılır.ALL hepsi içindir.
--sport [!] Kaynak portu belirtir.etc/services da listelenen port isimleri olabilir ya da numarasıyla yazılabilir.
--source-port --sport ile aynı
-d [!] Varış adresidir.
--dport [!] Variş portudur.
--icmp-type ICMP (Internet Control Message Protocol)tipini belirtir.
-i [!] arabirim eth1,ppp0 gibi...
-j Kural için belirtilen zincirde hedef belirtir.-j ACCEPT gibi..
--to-source Yeni kaynak ip'si yazar SNAT ile kullanılır.
--to-destination
-o [!] Çıkan ve yönlendirilen zincirlerde kullanılır.(-o ppp1 gibi)
-t Tabloyu belirtir.Nat tablosu için -t nat şeklinde yazılır.
-m Kullanılacak modülü belirtir.-m limit gibi
--state State (durum) modülü içindir.NEW,INVALID,RELATED ve ESTABLISHED seçenekleri içindir.
--tcp-flags TCP flag'laridir.ACK,FIN,RST,URG,SYN,PS veya ALL.
--syn SYN paketlerini kontrol etmek içindir.
--limit Saniye başina eşleşme hızını kontrol etmek için kullanılır.
-V Iptables'ın versiyonunu öğrenmek için kullanılır.
--mac-source[!] Belirtilen fiziksel adres için işleme alinir yada alınmaz.

Iptables'da CIDR (Classless Inter-Domain Routing) adres biçimide kullanabilirsiniz
192.168.1.0/24 -------------------- 192.168.1.0/255.255.255.0
/8 255.0.0.0 (8 bitlik ağ alanı 24 bitlik host alanı)
/16 255.255.0.0 (16 bitlik ağ alanı 16 bitlik host alanı)
/24 255.255.255.0 (24 bitlik ağ alanı 8 bitlik host alanı)
/26 255.255.255.192 (26 bitlik ağ alanı 6 bitlik host alanı)
GENEL BİR SCRİPT
İlk önce iptables komutunu yazar bir kural eklemek için -A yazıp hangi zincire uygulayacaksanız onu yazarsınız.

Mesela:
# iptables -A INPUT -s 10.1.34.1 -j ACCEPT
10.1.34.1 adresinden gelen tüm paketler kabul ediliyor.veya tam tersi
#iptables -A INPUT -j ACCEPT ! -s 10.1.34.1
10.1.34.1 adresinin dişinda gelen tüm paketler kabul ediliyor.
Tüm bir ağı kapsayan kurallar için ağ adreside belirtilebilir.
#iptables -A INPUT -s 10.1.34.0/255.255.255.0 -j ACCEPT
Anlaşildiği gibi 10.1.34.0 ağındaki paketler kabul edilebilir.
Iptables'ı öğrenmenin en iyi yolunun bir kurallar bütününü bulup onu okumaktan geçtiğine inanıyorum.
Yukarıdaki iptables komutundaki ACCEPT 10.1.34.1 ağlari için paketin olumlu kabul edilerek bir sonraki zincire aktarılacağını göstermektedir.
Iptables yazılmaya başlanırken önce paket yönlendirme kapatılır.Sontra tüm zincirlerdeki kurallar silinir.
#echo 0 > /proc/sys/net/ipv4/ip_forward
#iptables -F INPUT
#iptables -F OUTPUT
#iptables -F FORWARD

Artik iptables'in durumuna baktığımızda boştur.Bakmak için
#iptables -L -n
parametreleri kullanılabilir yada Redhat sistemlerde
#service iptables status
yazılarak yazdığımız iptables'ın durumu görülebilir.
Zincirlerin genel politikasını belirtmek için ise;
#iptables -P INPUT DROP
#iptables -P OUTPUT ACCEPT
#iptables -P FORWARD ACCEPT
Burada dışarıdan bağlantı yapmak isteyen paketlere izin verilmemektedir.
Çıkan paketler ve iletilen paketlere izin verilmiştir.

#iptables -A INPUT -j DROP -i eth1 ! -s 10.1.34.0/255.255.255.0
#iptables -A FORWARD -j DROP -i eth1 ! -s 10.1.34.0/255.255.255.0
eth1 arabiriminden gelen paketlerin kendi ağımıza ait olup olmadığı kontrol ediliyor.

#iptables -A INPUT -j DROP -i ! eth1 -s 10.1.34.0/255.255.255.0
#iptables -A FORWARD -j DROP -i ! eth1 -s 10.1.34.0/255.255.255.0
eth1 dışında gelen paketlerin kaynak ip adreslerinin bizim ağimizla aynı olup olmadığı kontrol edilerek böle paketler reddediliyor.IP Spoof olarak adlandırılan ip ***********lığına engel olmak için önlem alınıyor.

#iptables -A INPUT -j DROP ! -i lo -s 127.0.0.0/255.0.0.0
#iptables -A FORWARD -j DROP -i ! lo -s 127.0.0.0/255.0.0.0
loopback arabirimimiz için de aynı kontrolu yapıp bu paketleri reddediyoruz.

#iptables -A INPUT -j ACCEPT -i lo
Kendi sistemimizin haberleşmesi için gönderilecek ve alınacak paket trafiğine izin veriyoruz.

#iptables -A INPUT -j ACCEPT -p -tcp -i eth0 –dport 80 -s 192.168.1.1
#iptables -A INPUT -m state –state ESTABLISHED,RELATED -i eth0 -p tcp –sport 80 -s 192.168.1.1 -d 10.1.34.0/255.255.255.0 -j ACCEPT
#iptables -A OUTPUT -m state –state NEW -o eth0 -p tcp –sport 80 -d
10.1.34.0/255.255.255.0 -j DROP
Dış ağdan web sunucumuza erişim izni veriyoruz.ikinci satırda ise kurulmuş bağlantılara izin vererek, web sunucumuzu kendi ağımızda çalışır hale getiriyoruz.Web server'ımız 192.168.1.1'dir.İstersek başka bir arabirime yada başka bir makinayida web sunucu olarak çalıştırabiliriz.Web sunucusu dışardan ve kendi ağımızdan gelen isteklere cevap vermekte fakat kendi ağımızla bağlantı kurmasına izin verilmemekte.Web server üzerinden ağımıza mudahale etmek isteyen olabilir.

#iptables -A INPUT -i eth1 -p udp --dport 67:68 --sport 67:68 -j
ACCEPT
DHCP serverımızın varlığınıda kurallarımız arasına belirtiyoruz.

#iptables -A INPUT -m state –state ESTABLISHED,RELATED -i eth0 -p !
icmp -j ACCEPT
Dış ağlara netfilter üzerinden erişim izni vermek için kurulu bağlantılar korunarak ICMP paketleri dışındaki bütün paketler kabul ediliyor.

#iptables -A INPUT -m state –state NEW -i eth0 -j DROP
#iptables -A FORWARD -m state –state NEW -i eth0 -j DROP
Dış ağdan gelecek SYN paketlerini reddediyoruz.Dışardan bağlantı başlatılmasını bu sayede engelliyoruz.

#iptables -A INPUT -j ACCEPT -p all -i eth1 -s 10.1.34.0/255.255.255.0
Ağımıza gelen tüm paketler kabul ediliyor.

#iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
eth1'de olan ağımızın (10.1.34.0) eth0 dan çıkışını ayarlayıp maskeleme oluşturuyoruz.(NAT)

#iptables -A INPUT -j ACCEPT -p icmp -i eth0 –icmp-type 0 -d
192.168.1.1

#iptables -A INPUT -j ACCEPT -p icmp -i eth0 –icmp-type 8 -d
192.168.1.1

#iptables -A INPUT -j ACCEPT -p icmp -i eth0 –icmp-type 3 -d
192.168.1.1
ICMP paketlerine izin veriyoruz.ICMP (Internet Control Message Protocol).

TÜM ICMP MESAJ TİPLERİ
0 Echo Cevabı
3 Hedefe ulaşilamiyor.
4 SQ
5 Tekrar Yöneltme
8 Echo İsteği
11 Parametre Problemi
12 Zaman Aşımı
13 Zaman Damgası İsteği
14 Zaman Damgası Cevabı
15 Bilgi İsteği
16 Bilgi Cevabı
17 Adres Maske İsteği
18 Adres Maske Cevabı

#iptables -A INPUT -p tcp -i eth0 --tcp-flags SYN,ACK,FIN,RST RST -m
limit --limit 1/s -j ACCEPT
Port taramalarından korunmak için eşleşmeyi 1 saniye veriyoruz.

#iptables -A INPUT -p icmp -i eth0 --icmp-type 8 -m limit --limit 1/s -j
ACCEPT
Ping of Death ataklar'dan korunmak için eşleşmeyi 1 saniye veriyoruz.

echo 1 > /proc/sys/net/ipv4/ip_forward

Daha sonra gerekebilir düşüncesi ile aşagidaki dosyayi firewall adı ile
kaydedebilirsiniz.

#!/bin/sh
# Iptables ile yazilmis Firewall'dir.
# Linux Kernel 2.4.20-8 cekirdekte yazildiktan sonra denenmistir.
# Sistemde DHCP,WEB serverlari calismaktadir.
# Internete bakan yuz ara1 ic network'e bakan ara2 degiskenlerine atanmistir.
#
IPB="/sbin/iptables"
LOCAL=127.0.0.0/8
WEBSERV=192.168.1.1
LAN=10.1.34.0/24
ara1=eth0
ara2=eth1
udp_port=67:68
echo 0 > /proc/sys/net/ipv4/ip_forward
$IPB -F INPUT
$IPB -F OUTPUT
$IPB -F FORWARD
$IPB -P INPUT DROP
$IPB -P OUTPUT ACCEPT
$IPB -P FORWARD ACCEPT
$IPB -A INPUT -j DROP -i $ara2 ! -s $LAN
$IPB -A FORWARD -j DROP -i $ara2 ! -s $LAN
$IPB -A INPUT -j DROP -i ! $ara2 -s $LAN
$IPB -A FORWARD -j DROP -i ! $ara2 -s $LAN
$IPB -A INPUT -j DROP -i ! lo -s $LOCAL
$IPB -A FORWARD -j DROP -i ! lo -s $LOCAL
$IPB -A INPUT -j ACCEPT -i lo
$IPB -A INPUT -j ACCEPT -p tcp -i $ara1 --dport www -s $WEBSERV
$IPB -A INPUT -m state --state ESTABLISHED,RELATED -i $ara1 -p tcp --sport www
-s $WEBSERV -d $LAN -j ACCEPT
$IPB -A INPUT -i $ara2 -p udp --dport $udp_port --sport $udp_port -j ACCEPT
$IPB -A OUTPUT -m state --state NEW -o $ara1 -p tcp --sport www -d $LAN -j DROP
$IPB -A INPUT -m state --state ESTABLISHED,RELATED -i $ara1 -p ! icmp -j ACCEPT
$IPB -A INPUT -m state --state NEW -i $ara1 -j DROP
$IPB -A FORWARD -m state --state NEW -i $ara1 -j DROP
$IPB -A INPUT -j ACCEPT -p all -i $ara2 -s $LAN
$IPB -A INPUT -j ACCEPT -p icmp -i $ara1 --icmp-type 0 -d $WEBSERV
$IPB -A INPUT -j ACCEPT -p icmp -i $ara1 --icmp-type 8 -d $WEBSERV
$IPB -A INPUT -j ACCEPT -p icmp -i $ara1 --icmp-type 3 -d $WEBSERV
$IPB -A INPUT -p tcp --syn -m limit --limit 1/second -j ACCEPT
$IPB -t nat -A POSTROUTING -o $ara1 -j MASQUERADE
$IPB -A INPUT -p tcp -i $ara1 --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit
1/second -j ACCEPT
$IPB -A INPUT -p icmp -i $ara1 --icmp-type 8 -m limit --limit 1/second -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward

#chmod +x firewall
#./firewall
#service iptables save
veya
#iptables-save > /etc/sysconfig/iptables

Yazdığımız script'in çiktisi aşagidaki gibi olacaktir.

# Generated by iptables-save v1.2.7a on Sun Sep 12 00:37:15 2004
*nat
:PREROUTING ACCEPT [13:1727]
:POSTROUTING ACCEPT [13:2030]
:OUTPUT ACCEPT [36:5662]
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Sun Sep 12 00:37:15 2004
# Generated by iptables-save v1.2.7a on Sun Sep 12 00:37:15 2004
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s ! 10.1.34.0/255.255.255.0 -i eth1 -j DROP
-A INPUT -s 10.1.34.0/255.255.255.0 -i ! eth1 -j DROP
-A INPUT -s 127.0.0.0/255.0.0.0 -i ! lo -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.1.1 -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.1.1 -d 10.1.34.0/255.255.255.0 -i eth0 -p tcp -m state --
state RELATED,ESTABLISHED -m tcp --sport 80 -j ACCEPT
-A INPUT -i eth1 -p udp -m udp --sport 67:68 --dport 67:68 -j ACCEPT
-A INPUT -i eth0 -p ! icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -m state --state NEW -j DROP
-A INPUT -s 10.1.34.0/255.255.255.0 -i eth1 -j ACCEPT
-A INPUT -d 192.168.1.1 -i eth0 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -d 192.168.1.1 -i eth0 -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -d 192.168.1.1 -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j
ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK RST -m limit --limit
1/sec -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT
-A FORWARD -s ! 10.1.34.0/255.255.255.0 -i eth1 -j DROP
-A FORWARD -s 10.1.34.0/255.255.255.0 -i ! eth1 -j DROP
-A FORWARD -s 127.0.0.0/255.0.0.0 -i ! lo -j DROP
-A FORWARD -i eth0 -m state --state NEW -j DROP
-A OUTPUT -d 10.1.34.0/255.255.255.0 -o eth0 -p tcp -m state --state NEW -m tcp
--sport 80 -j DROP
COMMIT
# Completed on Sun Sep 12 00:37:15 2004

IPTABLES KOMUTLARI
#iptables-save > /etc/sysconfig/iptables
iptables-save komutu kuralları standart çıktıya gönderir.
#iptables-restore < /etc/sysconfig/iptables
iptables-restore komutu kuralları geri yüklemek için kullanılır.

Netfilter /etc/sysconfig/iptables dosyasina kaydedilir.Bu dosya açilişlarda
ve service iptables start komutu verildiğinde kontrol edilecektir.
Ayrıca
#service iptables save
komutu ile /etc/sysconfig/iptables dosyasına değişiklikleri yansıtabilirsiniz.
#service iptables stop
iptables'ı durdurulur.
#service iptables start
iptables başlatir.
Service iptables status
iptables kurallarını gösterir.

#iptables -L -n komutu ile iptables'ın durumu aşağıda görülmektedir.

Chain INPUT (policy DROP)
target prot opt source destination
DROP all -- !10.1.34.0/24 0.0.0.0/0
DROP all -- 10.1.34.0/24 0.0.0.0/0
DROP all -- 127.0.0.0/8 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 192.168.1.1 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 192.168.1.1 10.1.34.0/24 tcp spt:80 state
RELATED,ESTABLISHED
ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spts:67:68
dpts:67:68
ACCEPT !icmp -- 0.0.0.0/0 0.0.0.0/0 state
RELATED,ESTABLISHED
DROP all -- 0.0.0.0/0 0.0.0.0/0 state NEW
ACCEPT all -- 10.1.34.0/24 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 192.168.1.1 icmp type 0
ACCEPT icmp -- 0.0.0.0/0 192.168.1.1 icmp type 8
ACCEPT icmp -- 0.0.0.0/0 192.168.1.1 icmp type 3
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x16/0x02
limit: avg 1/sec burst 5
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp flags:0x17/0x04
limit: avg 1/sec burst 5
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 8 limit:
avg 1/sec burst 5
Chain FORWARD (policy ACCEPT)
target prot opt source destination
DROP all -- !10.1.34.0/24 0.0.0.0/0
DROP all -- 10.1.34.0/24 0.0.0.0/0
DROP all -- 127.0.0.0/8 0.0.0.0/0
DROP all -- 0.0.0.0/0 0.0.0.0/0 state NEW
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 0.0.0.0/0 10.1.34.0/24 tcp spt:80 state NEW
 

 

Yorumunuzu Ekleyin


Yükleniyor...
    Yükleniyor...