Iptables

Iptables, netfilter framework alt yapısını kullanan ve uzunca bir süredir Linux çekirdeğiyle gelen bir lokal firewall. Bu yazımızda iptables denilince ilk olarak nelerin bilinmesi gerektiğini göreceğiz.

# Zincirler

Iptables ile ilgili kural girerken veya bir iptables kuralı gördüğünüzde bunu anlayabilmenin bir numaralı şartı kısaca aşağıdaki grafiği anlamaktan geçiyor. Tabi ki aşağıdaki diyagram en basit haliyle olan anlaşılır gösterimdir. Bunun daha ayrıntılı gösterimleri de mevcuttur.

1 8 1024x293 - Iptables

Iptables ‘da kurallar, bir nevi kategori düzeni sağlayan tablolar (filter, nat, mangle vs.) içerisinde zincir adını verdiğimiz yapılarda tutuluyor. Iptables ile birlikte bu tabloların içerisinde hazır zincir yapıları bulunuyor.  Yukarıdaki tabloya baktığınızda da kolaylıkla anlayabileceğiniz bu hazır zincir yapıları şu anlamlara geliyor:

INPUTDışarıdan gelen bir paketin kullanıcı tarafına girişi esnasında bu zincir yapısındaki kurallarla eşleşip eşleşmediğine bakılır. Eşleşiyorsa hedef seçeneği uygulanır.

OUTPUT : Kullanıcıdan dışarıya doğru bir paketin çıkışı esnasında ilk bu zincir yapısındaki kurallarla eşleşip eşleşmediğine bakılır. Eşleşiyorsa hedef seçeneği uygulanır.

FORWARDPaket eğer yeni bir adrese doğru iletilecekse bu zincir yapısındaki kurallarla eşleşip eşleşmediğine bakılır. Eşleşiyorsa hedef seçeneği uygulanır.

PREROUTINGRouting öncesi paket başlık bilgilerini düzenlemek için bu zincir yapısındaki kurallarla eşleşip eşleşmediğine bakılır. Eşleşiyorsa hedef seçeneği uygulanır.

POSTROUTING: Routing sonrası paket başlık bilgilerini düzenlemek için bu zincir yapısındaki kurallarla eşleşip eşleşmediğine bakılır. Eşleşiyorsa hedef seçeneği uygulanır.

# Tablolar

filter : iptables ‘ı listelerseniz göreceksiniz Varsayılan olarak bu tablo listelenir. Bu tabloda INPUT, OUTPUT ve FORWARD zincirleri bulunur. Paket gidicek mi düşürülsün mü gibi kuralları işler.

nat : Network adress translation ile ilgili kuralları işletir. Bu tabloda PREROUTING, INPUT, OUTPUT, POSTROUTING zincirleri bulunur.

mangle : IP paketinin bilgilerini değiştirmek için tanımlı kuralları işler. Bu tabloda PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING zincirleri bulunur.

raw : Paket state’lerini izlemek için gerekli kuralları işler. PREROUTING, OUTPUT zincirleri bulunur.

security : Selinux güvenlik modulü için gerekli kuralları işler. INPUT, FORWARD, OUTPUT zincirleri bulunur.

Şu şekilde tablo/zincir yapısını özetleyebiliriz.

2 - Iptables

# Eşleşme Seçenekleri

Bir paketin bir kuralla eşleşip eşleşmediğini belirlemek için kullanıcı tarafından kuralda belirtilen bir değer ile paket içerisindeki değeri karşılaştırmak gerekecektir. Bunun için aşağıdaki seçeneklerden birini kullanabiliriz.

–source (-s) : Paket içerisindeki kaynak ip ile kural içerisinde belirtilen ip eşleşiyorsa, hedef seçeneği uygulanır.

–destination (-d) : Paket içerisindeki hedef ip ile kural içerisinde belirtilen ip eşleşiyorsa, hedef seçeneği uygulanır.

–protocol (-p) : Paket içerisinde hedef protokol ile kural içerisinde belirtilen protokol eşleşiyorsa, hedef seçeneği uygulanır.

–source-port (–sport) : Paket içerisinde kaynak port ile kural içerisinde belirtilen kaynak port eşleşiyorsa, hedef seçeneği uygulanır.–protocol parametresi ile birlikte kullanılır.

–destination-port (–dport) : Paket içerisinde hedef port ile kural içerisinde belirtilen hedef port eşleşiyorsa, hedef seçeneği uygulanır.–protocol parametresi ile birlikte kullanılır.

–tcp-flags : Paket içerisindeki flag ile kural içerisinde belirtilen portlar eşleşiyorsa, hedef seçeneği uygulanır. –protocol parametresi ile birlikte kullanılır.

–input-interface (-i) : Eğer paket belirtilen interface’den geliyorsa hedef seçeneği uygulanır.

–output-intrafece (-o) : Eğer paket belirtilen interface’den çıkıyorsa hedef seçeneği uygulanır.

# Eşleşme modülleri

Eşleşme seçeneklerine ek olarak farklı eşleşme seçeneklerini de modüller aracılığıyla kullanabilirsiniz. iptables içerisinde varsayılan olarak gelen bir çok modül bulunuyor. Bunları –match (-m) parametresiyle birlikte kullanabilirsiniz.

Malesef modülleri listelemek için bir parametre şuan için bulunmuyor. Modülleri şuradan görebilirsiniz.

ls /lib/modules/$(uname -r)/kernel/net/netfilter/

State modülünün kullanımına örnek:

iptables -A FORWARD -i eth0 -m state ! --state NEW -j DROP

# Hedef Seçenekleri

Kural ile eşleşen paketin akıbeti yine o kural içerisindeki aşağıdaki hedef değerlerinden biriyle belirtilir. Kural içerisinde –jump (-j) parametresiyle kullanılır.

ACCEPT : Paket kabul edilir.

DROP : Paket kabul edilmez, düşürülür.

REJECT : Paket kabul edilmez, düşürülür. Ayrıca paket göndericisine bir ICMP mesajı gönderilir. (bknz: Firewall Reject mi, Drop mu?)

LOG : Paketi loglar.

RETURN : Paketi geldiği zincir kurala geri gönderir ve orada kaldığı yerden filtrelerden geçme işlemine devam etmesini sağlar.

REDIRECT : Paketi yönlendirir.

SNAT : Source Nat işlemini gerçekler. IP ve port aralığı belirtilebilir. POSTROUTING ile gerçekleşir. Birden fazla ip bir çıkış ip sinden internete çıkması isteniyorsa SNAT kullanılır.

DNAT : Destination Nat işlemini gerçekler. PREROUTING ile gerçekleşir. Birden fazla sunucu tek bir ip kullanmak isteyebilir. Örneğin loadbalancing işlemini örnek verebiliriz. Port forwarding olarak düşünebilirsiniz.

SAME : SNAT ile benzer işlemi gerçekler, farkı her zaman aynı adresi kullanmasıdır.

TTL : TTL değerini değiştirmek için kullanılır. Tüm sistemler için TTL değeri uygun bir değere çekilebilir.

<Kullanıcı Tanımlı Zincir> : Paket kullanıcı tanımlı zincire atanır.

# Kural ekleme / silme

Bir firewall’daki en önemli işlevlerin birincisi kural girmek ve silmektir. iptables’de kural eklemek için –append (-A), silmek için ise –delete (-D) parametreleri kullanılır.

iptables --append OUTPUT --destination 192.168.127.131 --protocol tcp --destination-port 80 --jump DROP

Silmek için en kolay yöntem ise zincir içerisinde kural numarasını belirterek silmektir. Ya da girdiğiniz kuralın aynısını -A parametresi yerine -D parametresiyle değiştirerekte girebilirsiniz. –line-numbers parametresiyle ise kural numarasını öğrenebilirsiniz.

iptables --list OUTPUT --line-numbers
iptables --delete OUTPUT 1

–append parametresi ile eklenen kural her zaman en son sıraya eklenir. Eğer sırayı belirlemek isterseniz  –insert (-I) parametresini kullanabilirsiniz. Örneğin 1. sıraya eklemek istersek aşağıdaki gibi kullanabiliriz.

iptables --insert OUTPUT 1 --destination 192.168.127.131 --protocol icmp --jump DROP

# Kural değerlerini değiştirme

–replace (-R) parametresi ile kural içerisindeki değerleri bir başka değerle değiştirebilirsiniz.

iptables --list OUTPUT --line-numbers
iptables -R OUTPUT 2 -s 192.168.0.0/24 -j DROP

Örneğin yukarıdaki kural 2 numaralı OUTPUT kuralının -s ve -j konumundaki değerleri değiştirir. Kural girerken tüm parametreleri girmeye özen gösteriniz aksi halde girilmeyenler any olarak değişir.

# Iptables kurallarını kaydetme, eski kurallara geri dönme 

Iptables kurallarını iptables-save komutuyla ekrana basıp daha sonradan bunları bir dosyaya kaydedebilirsiniz. Böylece herhangi bir değişiklik yapsanız da iptables-restore komutuyla eski konfigürasyona dönebilirsiniz.

iptables-save > kurallarim.txt
iptables-restore < kurallarim.txt

# Iptables kurallarını kalıcı olarak uygulama

Girilen iptables kurallarınız sunucunuz yeniden başlatıldığında uçar. Yani girilen kurallar on-the-fly dır.

Kalıcı hale getirmek için ise girdiğimiz kuralları belirlediğiniz sabit bir dosyaya yazalım.

iptables-save > /etc/iptables.conf

Daha sonra her yeniden başlatmada bu dosyayı işleyecek şekilde startup da başlayacak şekilde /etc/rc.local dosyasına girilir.

iptables-restore < /etc/iptables.conf

# Zincir içerisindeki kuralları temizleme

Iptables içerisinde zincirleri –flush (-F) parametresiyle temizleyebilirsiniz.

iptables -F
iptables -F OUTPUT
iptables -t nat-F

# Kuralların byte sayaçlarını temizleme

Yazmış olduğunuz kurala gelen byte sayısını –verbose (-v) diyerek görebilirsiniz. Bu sayacı temizlemek için ise –zero (-Z) diyerek temizleyebilirsiniz.

iptables --list OUTPUT --line-numbers -n -v
iptables --zero OUTPUT 3

# Zincirlerin varsayılan politikalarını değiştirme

Firewall’lar da genellikle iki varsayılan davranış gösterir. Bir tanesi her şeyi kabul eder, kurallar kısıtlar. Bir diğeri ise hiç bir şeyi kabul edilmez, kuralla aktif edilir. Zincir yapınızın bu varsayılan politikasını –policy parametresiyle değiştirebilirsiniz.

iptables --policy INPUT DROP
iptables --policy OUTPUT DROP

# Yönlendirme

Gelen paketi yönlendirmek için -j REDIRECT kullanılır.

Kullanımına örnek:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080-8082
iptables --list -t nat