Pardus/Linux iptables ile Güvenlik Duvarı Yönetimi

Pardus kerneli, paket filtrelemek için netfilter frameworkü ile beraber gelir. Netfilter sayesinde sisteme gelen ya da sistemden dışarı çıkan trafik, engellenebilir, izin verilebilir ya da modifiye edilebilir. iptables netfilter frameworkü kullanarak, bir linux sistemi oldukça güçlü bir güvenlik duvarına çevirebilmektedir. iptables sayesinde netfilter ı kullanarak sisteme kural yazabilir, çıkarabiliriz. Ek olarak fail2ban gibi pek çok uygulama da saldırganları engellemek için iptables kullanmaktadır (linux sistemlerde).

Bu yazıda, iptables nasıl çalışır göz atarak, kendi kurallarınızı yazmanız konusunda yardımcı olması için bir kaç örnek vereceğiz.

iptables Nasıl Çalışır?

iptables, netfilter framework için komut satırı düzeyinde bir arayüzdür. iptables tarafından yönetilen Paket filtreleme mekanizması, table, chain ve target gibi yapılara sahiptir. Basitçe, bir table paketleri istediğiniz şekilde işlemenize yarayan bir kavramdır. iptables üzerinde varsayılan tablo filter tablosudur.

table(tablo) kavramı, kendilerine bağlı chain kavramı ile beraber çalışır. Chain(zincir), trafiğin belirli noktalarda incelenmesine olanak sağlar, ulaştığı anda mı, yoksa işlenmeye başlamadan hemen önce mi.. gibi. Bunlara, belirli paketlere karşılık gelecek kurallar eklenebilir, örneğin, 80 numaralı porta gelen, TCP paketlerine uygula.. gibi. Target (hedef) paketin son durumuna karar vermektedir, drop (engelle) ya da allow (izin ver) gibi.

Bir paket sisteme ulaştığında (ya da sistemden ayrılırken, kullanılan chain’e bağlı olarak) , iptables ilgili chain’e bağlı olarak yazılan kuralları teker teker bu paket üzerine uygular. Kurallara karşılık gelen bir durumla karşılaştığında, doğrudan target(hedef işlem) e yönelir. İlgili paket için belirtilen chain üzerinde herhangi bir kural karşılık gelmezse, basit bi şekilde varsayılan politika (default policy) uygulanır. Burada varsayılan politika da aynı zamanda bir targetdır. iptables varsayılan politika olarak tüm paketlere izin verir.

Şimdi, bu yapılar (table, chain, target) hakkında biraz daha detaya girelim.

Table

Daha evvel bahsettiğimiz gibi, tablolar paketlerle ilgili spesifik işlemler yapmamıza izin verir. Modern bir linux sürümünde , varsayılan olarak gelen dört tablo vardır:

Filter tablosu: Bu tablo muhtemelen en çok kullanılan tablodur. Bir paketin izin verileceği ya da red edileceğine dair karar veren tablodur.

Mangle tablosu: Bu tablo, paketi yönlendirme ve farklı şekillerde headerlarını değiştirme için kullanılan tablodur (TTL değerlerinin değiştirilmesi gibi)

Nat tablosu: Bu tablo, paketlerin farklı NAT (Network Address Translation) üzerindeki farklı hostlara yönlendirilmesini sağlayan, kaynak(source) ve hedef (destination) adreslerini değiştiren tablodur. NAT ağında oldukları için doğrudan erişilemeyen servislere yönlendirme yapılabilmesi için kullanılır.

Raw tablosu: iptables durum kontrollü bir güvenlik duvarıdır, bu da paketlerin “durum”larına göre incelendiği anlamına gelir. Örneğin; bir paket yeni bir bağlantının parçası olabileceği gibi, var olan bir bağlantının da parçası olabilir. Raw tablosu, kernel paketleri işleme almadan önce üzeirnde işlem yapabilmenize olanak sağlayan tablodur. Ek olarak, raw tablosu paketin durum takibinden muaf tutulmasına da olanak sağlamaktadır.

Not: ek olarak , bazı linux sürümlerinde, bu tablolara ek SELinux parçası olarak security tablosu da gelmektedir.

Chain

Tüm tablolar bir kaç varsayılan zincire (chain) bağlıdır. Bu zincirler, paketleri farklı biçimlerde filtre etmeye yarar. iptables tarafından sağlanan zincirler şunlardır;

PREROUTING zinciri: bu zincire karşılık gelen kurallar, paket ağ arayüzüne ilk ulaştığı anda işleme alınırlar. bu zincir, nat, mangle ve raw tablolarında kullanılabilirler.

INPUT zinciri: bu zincire karşılık gelen kurallar, paketler yerel olarak işleme alınmadan hemen önce uygulanırlar. INPUT zincirini nat, mangle ve raw tablolarında kullanabilir.

OUTPUT zinciri: bu zincire karşılık gelen kurallar, paketler işleme alındıktan hemen sonra uygulanırlar. Bu zinciri, mangle, raw, nat ve filter tabloları ile kullanabiliriz.

FORWARD zinciri: bu zincire karşılık gelen kurallar, paketleri kuralların içerdiği şekilde yönlendirmek için uygulanır. Bu zinciri mangle, ve filter tablolarında kullanabiliriz.

POSTROUTING zinciri: bu zincire karşılık gelen kurallar, ağ arayüzünü terketmeden hemen önce uygulanırlar. Bu zinciri nat ve mangle tabloları ile kullanabiliriz.

Aşağıdaki diagramda; paketlerin farklı tablolar üzerinde akışını görebilirsiniz:

Target

Bahsettiğimiz gibi, zincirler kurallar aracılığıyla trafiği filtrelemeye yarıyor. Şimdiye kadar anlatılanlarla, filter tablosunun INPUT zincirine port 22 den gelen trafiğe karşılık gelecek bir kural yazabiliriz. Peki kural karşılık bulduktan sonra ne olacak? İşte hedefler (target) tam olarak bu işe yarayarak paket hakkında son kararı verirler.

Bazı hedefler, terminating(sonlandıran) olarak geçer. Yani paket hakkında son kararı en hızlı şekilde verirler, bu paket daha sonraki kurallarla karşılaştırmaya girmez. En çok kullanılan sonlandıran hedefler şunlardır;

ACCEPT: bu hedef, paketin iptables tarafından kabul edilmesine sebep olur.

DROP: iptables paketi düşürür. Bu şekilde sisteminize bağlanmaya çalışan birisi, böyle bir bağlantı noktası hiç yokmuş gibi görecektir.

REJECT: iptables bu hedef ile paketi red eder. Karşı tarafa bir bağlantı sıfırlama (connection reset) paketi gönderilir. Bu da karşı tarafta bağlanılmaya çalışılan sistemin erişilmez olduğu (destination host unreachable) mesajına sebep olur (UDP ve ICMP paketlerinde).

Diğer yandan, sonlandırmayan hedefler de vardır, ki bunlar paketleri karşılık gelen kural bulunsa dahi, kurallara karşılaştırmaya devam eder. Bunlara en basit örnek, iptables ‘ın dahili hedeflerinden olan LOG hedefidir. Bir paket alındığında, LOG hedefi paketle ilgili bilgileri kernel loglarına işler. İşlem tamamlanmış olmasına rağmen, iptables  paketi diğer kurallarla karşılaştırmaya devam eder.

Bazen kompleks bir paketi karşılayabilmek için kural setlerine ihtiyacınız olur. İşleri basitleştirmek adına, özel bir zincir oluşturabilirsiniz. Bu şekilde bir zincirden diğer bir zincire paket aktararak istediğiniz sonuçlara ulaşabilirsiniz:

iptables çalışma mantığının teorik bilgilerinden sonra, şimdi de biraz örneklerle anlatılanları somutlaştırmaya çalışalım.

 

iptables komutları hakkında not

Internet protokolü için kullanılan iki versiyon bulunmaktadır, IPv4 ve IPv6. Bu protokoller kernelde işlenme sırasında bazı farklılıklar gösterir. Bu sebeple iptables bu iki protokol için farklı komutlar işletir. Ipv4 için iptables  ve IPv6 içinip6tables

Komutlar farklı olmasına rağmen, komut parametleri aralarında çok farklılık göstermez. Bu farkları daha sonra tekrar ele alacağız.

Aynı zamanda, iptables komutlarını root olarak çalıştırmanız gerekmektedir. Komutları isterseniz su -c   ile, root şifrenizi girerek kullanabilirsiniz. Alternatif olarak, her komutun başına sudo ekleyerek de kullanabilirsiniz.

 

, , , , , , , ,