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

IP adreslerini bloklamak

Güvenlik duvarlarının en genel kullanımı IP adresi bloklamak şeklindedir. Örneğin,  172.217.169.142 IP adresinden sunucularınıza sürekli ataklar aldığınızı tespit ettiniz, ve bu IP adresinin sunucunuza erişmesini engellemek istiyorsunuz. Mantık olarak basit bir şekilde bu IP adresinden sunucumuza gelen tüm paketleri red etmemiz gerekiyor. O halde aşağıdaki kuralı, INPUT zincirine işliyoruz:

iptables -t filter -A INPUT -s 172.217.169.142 -j REJECT

Komutu açıklamamız gerekiyor elbette.-t  parametresi, kuralımızın hangi tabloyu kullanacağını belirtiyor, bahsettiğimiz senaryoda bu filter tablosu. -A parametresi iptablesa , bu tablodaki INPUT zincirindeki mevcut kurallara “eklemesini (append)” söylüyor. Elbette iptables ‘ı ilk defa kullanıyorsanız, tablonuz boş olacaktır ve bu ilk kuralınız olacaktır. -s parametresi, kaynak IP adresini (source address) belirtirken, son olarak -j parametresi iptables a ilgili trafiği REJECT hedefine göndererek red etmesini söylüyor. Eğer sisteminizin hiç bir cevap dönmemesini istiyorsanız, REJECT yerine DROP hedefini kullanabilirsiniz.

Daha evvel bahsettiğim gibi, eğer varsayılan işlemi (default policy) yapmak istiyorsanız, tablo belirtmeyebilirsiniz, iptables varsayılan tablosu filter tablosudur. Bunun için:

iptables -A INPUT -s 172.217.169.142 -j REJECT

Aynı zamanda IP adres aralıkların CIDR notasyonunda belirtebilirsiniz. Eğer 172.217.169.0-172.217.169.255 aralığını komple bloklamak isterseniz yapmanız gereken;

iptables -A INPUT -s 172.217.169.0/24 -j REJECT

Eğer belirli bir IP adresine yönelik sunucunuzdan çıkan tüm trafiği bloklamak isterseniz, bunun için OUTPUT zincirini kullanarak, -d parametresi ile hedef IP adresini belirtmeniz gerekmektedir:

iptables -A OUTPUT -d 172.217.169.142 -j DROP

Kuralları Listeleme

Diyelim ki bir kaç IP adresini ekleyerek blokladık. Bloklanan bu IP adreslerini daha sonra görüntülemek istediğimizde  -L  parametresini kullanabiliriz. Daha sonra bahsedeceğimiz, fakat şimdiden bahsetmekte fayda gördüğüm --line-numbers parametresini de eklediğimizde, kurallar numaralandırılarak görüntülenecektir.

iptables -L --line-numbers

Bu komutu çalıştırdığımızda eklenen IP adreslerini aşağıdaki gibi bir liste şeklinde göderebiliriz. Bu liste aynı zamanda filter tablosunun bir parçasıdır. Eğer spesifik bir tabloya ait kuralları listelemek isterse -t  parametresi ilebu tabloyu belirtebiliriz.

Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all --172.217.169.0/24 anywhere
2 DROP all --172.217.167.0/24 anywhere 
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
1 DROP all -- anywhere 172.217.169.0/24

Örneğimize göre, IP aralığı belirtelrek INPUT zincirinde ve OUTPUT zincirinde bloke işlemi yaptık. FORWARD zincirinde ise herhangi bir kural yok.

iptables  aynı zamanda ters DNS kayıtlarını göstermek konusunda da yardımcı olmaktadır. Eğer ters DNS kayıtlarını görüntülemek istemiyorsanız bu özelliği basit bi şekilde -n parametresi ekleyerek kapatabiliriz.

iptables -L -n --line-numbers

Kural Silme

Farzedelim ki, 172.217.169.0/24  aralığını hata sonucu blokladık. Bu kuralı silme işlemi-A (append) parametresini-D (delete) ile değiştirerek çok basit.  kuralı silmek oldukça basit.

iptables -D INPUT -s 172.217.169.0/24 -j REJECT

Kuralları, satır numaraları ile listeyip, ilgili kuralın satır numarasını vererek silebiliriz. Eğer INPUT zincirindeki ikinci kuralı silmek isterseniz, kullanmanız gereken komut şu şekilde olmalıdır;

iptables -D INPUT 2

Unutmayın ki, son satırdan silmediğiniz sürece, her kural silme işleminin ardından kuralların satır numarası değişecektir. Kuralları bir defa listeleyip son kural harici her kural silişimizde, kurallar tekrar sıralanır ve satır numarası değişir. Bu sebeple, her silme işlemi öncesi mutlaka kuralları tekrar sıralamanız önemlidir. Başka bir yaklaşımsa, bir kaç kural sileceğiniz zaman her zaman en yüksek satır numaralı kuraldan silmeye başlamanız faydalı olacaktır. Örneğin; eğer INPUT zincirinden 9 ve 12 numaralı satırları silmek istiyorsanız, öncelikle 12 numaralı satırı, daha sonra 9 numaralı satırı silmelisiniz, aksi halde, 12 numaralı satır, 9 numaralı satır silindikten sonra satır numarası değişecektir:

iptables -D INPUT 12
iptables -D INPUT 9

Bazı durumlarda belirli bir zincirdeki tüm kuralları silme ihtiyacı duyabilirsiniz. Bu gibi durumlarda kuralları tek tek silmek pek pratik bir yaklaşım değildir. Bu yüzden iptables kolaylık sağlıyor ve -F parametresini kullanmamıza (flush) izin veriyor. Örneğin: eğer INPUT zincirindeki tüm kuralları temizlemek istiyorsanız kullanmanız gereken komut;

iptables -F INPUT

Kural ekleme (insert) ve güncelleme 

Şimdiye kadar anlatılan kısımda kural ekleme(ekleme) ve silme işlemini gördük. Fakat iptables çalışma prensibine göre kural sıralaması da önemlidir. Yani bazen bir kuraldan önce araya başka bir kural eklememiz gerekebilir. Bu gibi durumlarda satır numaraları kullanışlı hale gelmektedir. Kural Listelemedeki örneğimizi kullanarak açıklamak gerekirse, farzedelim ki 172.217.169.0/24  ip aralığını bloklamamıza rağmen, 172.217.169.10 adresinden gelen paketleri kabul etmemiz gerekiyor (whitelisting).

iptables zincir içindeki kuralları birer birer işlediğinden, yapmamız gereken bloke eden kuraldan önce, kabul eden bir kural girmektedir. Bu durumda:

iptables -I INPUT 1 -s 172.217.169.10 -j ACCEPT

bu kuralı ilk satıra ekleyerek, 172.217.169.0/24 ip aralığından gelen tüm paketleri engellememize rağmen 172.217.169.10 adresinden gelen paketleri kabul etmesini sağladık, çünkü bloke eden kuralımız , kabul eden kuralımızdan sonra gelmektedir.  Kuralları listeleyerek teyit edebilirsiniz:

Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all --172.217.169.10 0.0.0.0/0
2 DROP all --172.217.169.0/24 0.0.0.0/0
4 DROP all --172.217.167.0/24 0.0.0.0/0

Var olan bir kuralı güncellemek istediğimizde ise basitçe -R  parametresini (replace) ekleyerek  172.217.169.10 yerine 172.217.169.20 IP adresine istisna sağlayabiliriz:

iptables -R INPUT 1 -s 172.217.169.20 -j ACCEPT

, , , , , , , ,