iptables Linux çekirdeği tarafından sağlanan Netfilter paketinin çatısında bulunan bir komut satırı aracıdır. Bu araç Linux çekirdeğinin güvenlik duvarında (firewall) bulunan kuralları değiştirmemize, düzeltmemize ve yeni kurallar eklememize yardımcı oluyor. Yani iptables bir firewall görevi görüyor. Basitçe sistemimizden internete çıkış yaparken veya sistemimize dışarıdan giriş yapılırken kontrol edilecek bazı durumlar var ise bunları tanımlamamıza, bunları bir tabloya kurallar dizisi şeklinde kaydetmemize yarıyor.

Bu aracı kullanabilmek için yönetici yetkilerine sahip olmanız gerekiyor. Yani ilgili sistemde root bilgilerine sahip olmanız ya da superuser yetkisine sahip olan bir kullanıcınız olması gerekiyor.

iptables IPv4 güvenliği için kullanılan bir araç. Linux’da IPv6 ve IPv4 güvenlikleri ayrı şekilde sağlanıyor. IPv6 güvenliği için ip6tables kullanabilirsiniz.

iptables’e nasıl ulaşırım?

iptables Linux dağıtımlarının çok büyük çoğunluğunda hazır olarak geliyor. Eğer dağıtımınız başka bir firewall uygulaması kullanıyor ise, iptables yüklemek için dağıtımınızın dökümasyonlarında paketi nasıl yükleyeceğinizi araştırmalısınız. iptables genel olarak Linux sistemlerinde /usr/sbin/iptables veya /sbin/iptables dizininde bulunuyor. iptables‘in komut yapısını (syntax) ve parametrelerini görmek için man iptables yazabiliriz.

Kullanım

iptables’in bir kurallar dizisinin bulunduğu bir tablo olduğunu söylemiştik. Bu kuralları görüntülemek için -L veya --list parametrelerinden birini kullanacağız. Kuralları görüntüleyelim:

root@suayip-lnx:~root@suayip-lnx:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Eğer siz de benim gibi herhangi bir kural eklemediyseniz muhtemelen böyle bir tablo karşınıza gelecek. Gördüğünüz gibi tabloda 3 zincir (chain) var. INPUT, FORWARD ve OUTPUT. Bu zincirler adlarından anlaşıldığı üzere sırayla giriş, yönlendirme ve çıkış durumlarında neler yapılmasını gerektiğini listeliyor. Her zincirin bir policy değeri var. Şuan hepsinin değeri ACCEPT. Hemen bu policy’lerden birini değiştirip internete çıkış yapmamızı engelleyen bir örnek yapalım. Öncelikle tabloda kayıtlı olan kuralların bir çıktısını -S parametresi ile alalım:

root@suayip-lnx:~# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

Gördüğünüz üzere tüm policy’ler şuan ACCEPT durumunda. İnternete çıkış yapmayı engellemek istediğim için OUTPUT policy değerini DROP olarak değiştirmemiz gerekiyor. Policy ayarını değiştirmek için -P parametresini kullanacağız:

root@suayip-lnx:~# iptables -P OUTPUT DROP

Bu komutu çalıştırdıktan sonra internete çıkış yapamaz hale geleceğiz. Teyit etmek için Google amcaya ping atmayı deneyelim:

root@suayip-lnx:~# ping google.com
ping: google.com: Name or service not known

Gördüğünüz gibi artık sistemimizin internete çıkışı engelleniyor. Kurallar listesine bakarak OUTPUT’un policy değerinin DROP olduğunu da görebilirsiniz. Tekrar internete ulaşmak için aynı şekilde OUTPUT’un policy değerini ACCEPT olarak değiştirin. Zincirlerin policy’leri sadece ACCEPT ve DROP olabilir.

Basit olarak internete çıkışımızı veya internetten veri gelişini engelledik. Fakat bu kullanımlar pek işimize yaramayacak. Sonuç olarak spesifik olarak giriş ve çıkışları engellemek istiyoruz. Bu durumda tabloya eklemeler yapmaya başlayabiliriz. Örneğin spesifik bir ip adresinden gelen istekleri engellemek istiyoruz. Tabloya şu şekilde bir ekleme yapabiliriz:

iptables -A INPUT -s 216.58.206.174 -j DROP

Parametreleri tek tek incelersek:

-A sonrasında gelecek zincire ekleme yapmak istediğimizi söylüyoruz (append).

-s kaynak belirtiyoruz. bu kaynak herhangi bir ip adresi veya hostname olabilir.

-j kuralın ne yapacağını belirtiyoruz. bu örnekte DROP etmesini söyledik örneğin.

Bu parametre için aynı zamanda REJECT de kullanabilirdik. İkisi arasındaki farkı açıklamak gerekirse, DROP karşı tarafa herhangi bir şey söylemiyor. Öte yandan REJECT karşı tarafa bağlantının reddedildiğini dolayısıyla bir firewall korumasının olduğunu belirtiyor. Bu yönden bakınca DROP kullanmak her zaman daha makbul gelebilir fakat doğru değil. Kullanım alanlarınıza göre DROP veya REJECT ‘den hangisini kullanacağınızı internetten araştırmalısınız.

Komutu sorunsuz bir şekilde çalıştırdıktan sonra iptables -L komutu ile listemize bakarsak kullandığımız zincirin altına yeni bir kural eklenmiş olduğunu göreceksiniz. Kuralımızı test edelim. Kullandığım IP adresi Google’ye ait ip adreslerinden biriydi. Yine üstteki şekilde ping attığım zaman, paket gönderdiğim halde kendim paket alamıyorum:

--- 216.58.206.174 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10216ms

Başarılı bir şekilde spesifik bir adresten gelen, girişleri veya o adrese çıkışları engelleyebildik. Peki oluşturduğumuz kuralları nasıl silebiliriz? Ben 2 yöntem vereceğim. Birinci yöntemimiz spesifik bir kuraları silmeye yönelik. Diğer yöntem ise tüm kuralları toptan silmek için. İlk yöntem için -D parametresini kullancağız. Kural eklerken kullandığımız -A parametresi yerine -D koymak yeterli olacak:

root@suayip-lnx:~# iptables -D INPUT -s 216.58.206.174  -j DROP

Listeye tekrar bakarsanız kuralın silinmiş olduğunu göreceksiniz. Peki ya yazdığımız kuralı unuttuysak ne olacak? Üstte kayıtlı olan kuralların çıktısını -S komutu ile alabileceğimizi zaten biliyoruz. Buradan aldığımız çıktıyı direkt kopyalayarak parametreyi yine -D olarak değiştirmemiz yeterli olacaktır.

Eklediğimiz kurallar çok ise ve tek tek silmek istemiyorsak işimiz yine basit. -F parametresini kullanarak tüm kayıtları silebiliriz. Eğer spesifik bir zincirdeki kayıtların tamamını silmek istiyorsak -Fparametresine bu zinciri belirtebiliriz. Örnek kullanımlar:

root@suayip-lnx:~# iptables -F ## tüm zincirlerdeki kurallar
root@suayip-lnx:~# iptables -F INPUT ## sadece INPUT zinciri

Birkaç örnek kullanım

Yukarıda iptables’in ne olduğunun ve nasıl bir yapısının olduğunu hakkında biraz bilgi edindik. Aslında bu aşamadan sonra yapacağımız şey kullanım amacımızı belirlemek ve bu doğrultuda gerekli olacak parametreleri manuel sayfasından araştırmak olacak. Şimdi ilham vermesi açısından birkaç kullanım görelim:

a) SSH portundan gelen istekleri DROP eden bir kural, burada kaynak yerel ağ olarak belirtilmiş. Yani yerel ağdan kimse bu makineye SSH ile bağlanamaz. Spesifik bir IP adresi de tercih edilebilirdi:

iptables -A INPUT -p tcp --dport ssh -s 192.168.1.1 -j DROP

b) Geldiği yer farketmeksizin her türlü SSH bağlantısını reddeden kural, --dport için herhangi bir port da belirtebilirdik.

iptables -A INPUT -p tcp --dport ssh -j DROP

Yukarıdaki örnekten yola çıkarak yararlı başka bir kural elde edebiliriz. Örneğin zinciri OUTPUT olarak değiştirip portu 80 yapabiliriz. Bu sayede güvenlik sertifikası olmayan sitelere erişemezdik.

c) Makinemize yapılacak olan girişleri dakikada 25’e limitleyen bir kural. DoS ataklarını engellemek için kullanılabilir:

iptables -A INPUT -p tcp --dport 80 -m limit\
         --limit 25/minute --limit-burst 100 -j ACCEPT

Yukarıda gördüğünüz kuralda -m parametresi kullanılmış. Bu parametre bir eklentiye işaret ediyor. Iptables’in çokça eklentisi de bulunmakta. Sonradan gelen limit parametreleri de bu eklentiyle ilgili. Fazla sayıda eklenti ve yüzlerce parametre olduğu için bunları tek tek açıklamayacağım. man sizin dostunuz!

Kuralları kalıcı hale getirmek

Kuralları ekleyip pek çok değişiklik yapıyoruz, fakat bu değişiklikler sistemin o anki oturumu için geçerli. Bu değişiklikleri kalıcı hale getirmek istiyorsak çalıştırmamız gereken bir komut var. Bu komut dağıtıma göre değişebilir. Ben Ubuntu 18.04 kabuğunda şu şekilde çözdüm ve şöyle bir çıktı aldım:

root@suayip-lnx:~# /sbin/iptables-save
# Generated by iptables-save v1.6.1 on Tue Aug 14 17:29:44 2018
*filter
:INPUT ACCEPT [9:5501]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [6:464]
-A INPUT -s 216.58.206.174/32 -j DROP
COMMIT
# Completed on Tue Aug 14 17:29:44 2018

Red Hat / CentOS kullanıcıları için:

/sbin/service iptables save

veya

/etc/init.d/iptables save

Sonuç

Belki gücünü görmüş olmayabilirsiniz ama iptables gerçekten güçlü bir araç. Yazı genel olarak iptables hakkında size kaba bir bilgi vermiştir diye düşünüyorum. Aslında erbabı için daha anlatılacak tonla şey var. Ben ancak kendi bilgim ve araştırmalarım doğrultusunda elde edebildiğim anlaşılır ve işe yarar bazı kilit bilgileri vermeye çalıştım. Bu kaba bilgilerden yola çıkarak neler yapabileceğinizi keşfedeceğinizi öngörüyorum. Kolay gelsin.