iptables nedir, nasıl ve nerelerde kullanılır — 2?

Bu flood’da Linux’ta paket işlemenin temel taşlarından netfilter ve iptables'ı incelemeye devam ederek farklı kullanım alanlarını göreceğiz.

Bir önceki flood’da iptables'ın kullanıcıya sunduğu arayüzden ve netfilter ile paketleri nasıl filtrelediklerinden bahsetmiştik. https://medium.com/@gokhansengun/7c081a9512c0

iptables kullanarak gelen, giden isteklerin loglanması sağlanabilir. iptables'ın zincir özelliği ile istenen paketlerin loglaması çok esnek ve şık bir biçimde gerçekleştirilebilir. REJECT ettiğimiz bütün paketleri aynı zamanda loglamak istediğimizi farzedelim.

Bu işlem için LOG_AND_REJECT adında bir zincir oluşturulur, daha sonra bu zincire sırasıyla iki kural eklenir. İlk kural loglama işlemini gerçekleştirir, ikinci kural ise paketi reddeder. Daha sonra loglanıp reddedilecek paket kuralları yazılarak bu zincire atlama sağlanır.

iptables ile çekirdeğin işlediği trafiğe Rate Limiting uygulanabilir. Örneğin bir porta belirli bir IP'den bir dakikada yapılabilecek istek sayısı sınırlanabilir, böylece servisin kötüye kullanımının önüne geçilebilir. Bu özelliğin kullanılabilmesi için NAT fonksiyonunda da kullanılan ve sunucunun yaptığı bağlantıları tutan conntrack modülüne ihtiyaç duyulur çünkü çekirdek sadece elindeki pakete bakarak limitlerin aşılıp aşılmadığını anlayamaz. conntrack modülü ilerleyen flood'larda da ara ara karşımıza çıkacak önemli bir modüldür.

Aşağıdaki ekran görüntüsünde istemcinin tek IP üzerinden sunucunun TCP - 80 portuna gönderdiği isteklerin dakikada sadece 5'ine izin verilecek diğerleri reddedilecek şekilde bir ayarlama yapılmıştır. Burada kaynak IP bazlı limitleme için hashlimit kullanılmıştır.

Bu noktada fail2ban programından da bahsetmek gerekir. fail2ban web sunucunun log dosyasına (aslında herhangi bir log dosyasına) bakarak belirli sayının üzerinde istek yapan IP'leri tespit ederek iptables kullanıp ilgili IP'yi bloklayabilir.

Bir başka kullanım alanında iptables, bir porta gelen trafiği karşılayarak aynı bilgisayardaki başka bir porta ya da başka bir bilgisayarda istenen porta yönlendirebilir yani çekirdeğin proxy olarak kullanılmasını sağlayabilir.

iptables'ın önemli kullanımlarından biri de Linux sunucunun bir Load Balancer (yük dağıtıcı) gibi davranmasına olanak tanımasıdır. Aşağıdaki örnekte 80 portuna gelen istekler aynı sunucunun 8081 ve 8082 numaraları portlarında yayın yapan web sunuculara dağıtılmaktadır.

Yukarıdaki örneğin basitleşmesi için sunucunun 80 portuna gelen istekler aynı sunucudaki farklı portlara dağıtılmıştır, burada başka sunucular ve portlar da kullanılabilirdi. iptables ile yük dağıtma özelliği Kubernetes - k8s tarafından servis objelerine verilen IP'lere gelen trafiğin pod'lara yönlendirilmesinde de kullanılmaktadır. Bu mekanizma ile k8s, aslında herhangi bir ağ arayüzü (network interface) ile ilişkilendirmemiş servis IP'leri oluşturabilmekte ve bu IP'lerden bütün node'lardan trafiği kabul edebilmektedir.

Son olarak netfilter ile ağda yaşanan paket kayıpları simüle edilebilir. iptables ile gelen paketlerin %40'ını düşürelim, paket kaybını doğru simüle etmek için burada REJECT yerine DROP kullanılması daha uygundur.

Şimdi de gelen paketleri %40 düşürme ayarını geri alıp, giden paketleri sadece ve sadece %0.5 oranda düşürerek bir indirme testi yapalım. Daha sonra ise paket kaybı simülasyonunu durdurup testi tekrarlayarak oluşan muazzam hız farkını gözlemleyelim.