21 Ekim 2011 Cuma

iptables


    IP Tables, güvenlik duvarı için Linux'ta kullanılan temel araçlardan birisidir. Linux'un çekirdek uzayındaki güvenlik duvarı gerçekleştirimi olan netfilter ile etkileşime giren, kullanıcı uzayında çalışan bir takım araçların bir araya gelmesinden oluşmuştur. IP Tables bir takım kurallar(rules) ve eylemlere(actions) göre davranır. Kurallar hangi paketler (ör. belli bir ağdan gelen paketler) için hangi eylemlerin (ör. paketlerin düşürülmesi) gerçekleştirileceğini belirlerler. Netfilter her paket için bütün kuralları sırasıyla işletecektir. Eşleşen bir kural bulduğunda bu kural için tanımlanan eylemi işletir.

$man iptables

ile kılavuzu okuyabilirsiniz.

Tablolar
iptabes ismi iptables'ın tablolar üzerinde çalıştığı gerçeğinden gelmektedir. Tabloların her biri belli bir paket davranışı üzerinde özelleştirilmiştir. Aşağıdakiler Linux 2.6.8 çekirdeği üzerinde varolan tablolardır(değişik çekirdek sürümlerinde değişik tablolar olabilir):

Tablo Anlamı
raw Paketlerin düşük seviye ayrıştırılması.
nat Paket başlığında değişiklikler (where NAT takes place).
mangle Özelleştirilmiş paket ayrıştırması.
filter Paket filtreleme.

Paketle ne yapmak istediğinize bağlı olarak uygun bir tablo bulunmaktadır.

Zincirler (Chains)
Ip Tables'ta, her tabloya yapışık ve herbiri farklı trafik tipiyle ilişkili birçok zincir vardır:


Zincir Anlamı
PREROUTING Yönlendirmeden(routing) devreye girmeden makineye gelen trafik.
INPUT Makinenin kendisine gelen trafik.
FORWARD Makine üzerinden geçen trafik (başka makinede üretilen, hedefi başka makine olan).
OUTPUT Yerel olarak yaratılmış trafik (hedef yerel ya da dış bir makine olabilir).
POSTROUTING Dışarı giden trafik.

Ayrıca kendi zincirlerinizi oluşturmak da mümkün.

Veri Akışı
Linux çekirdeğinde her tablo/zincirde veri akışı aşağıdaki grafikte gösterilmiştir. Her kutuda zincir ve o zincir için geçerli tablolar gösterilmiştir. Trafik her zincir için geçerli her tablodan sırasıyla geçmektedir. Örneğin,  PREROUTING zincirinde raw, mangle ve nat tabloları var. Trafik akışı sırasıyla bu tabloların üçünden de geçer.



       Incoming
       Traffic
          |
          |
          V
     +----------+
     |PREROUTING|
     +----------+
     |   raw    |  <--------------+
     |  mangle  |                 |
     |   nat    |                 |
     +----------+                 |
          |                       |
          |                       |
       Routing                    |
    +- Decision -+                |
    |            |                |
    |            |                |
    V            V                |
  Local        Remote             |
Destination   Destination         |
    |            |                |
    |            |                |
    V            V                |
+--------+  +---------+           |
| INPUT  |  | FORWARD |           |
+--------+  +---------+           |
| mangle |  | mangle  |           |
| filter |  | filter  |           |
+--------+  +---------+           |
    |            |                |
    |            |                |
    V            |                |
  Local          |                |
 Machine         |                |
    |            |                |
    |            |                |
    V            |                |
 Routing         |                |
 Decision        |                |
    |            |                |
    |            |                |
    V            |                |
+--------+       |                |
| OUTPUT |       |                |
+--------+       |                |
|  raw   |       |                |
| mangle |       |                |
|  nat   |       |                |
| filter |       |                |
+--------+       |                |
    |            |                |
    |      +-------------+        |
    |      | POSTROUTING |      Local
    +----> +-------------+ --> Traffic
           |   mangle    |
           |     nat     |
           +-------------+
                 |
                 |
                 V
              Outgoing
              Traffic


Örnek olarak makinede üretilen ve yine makineye dönen bir trafik şu şekilde bir yol izler:

  1. Paket yerel bir süreç ya da çakirdek tarafından üretilir
  2. Yönlendirme kararı
  3. OUTPUT: raw
  4. OUTPUT: mangle
  5. OUTPUT: nat
  6. OUTPUT: filter
  7. POSTROUTING: mangle
  8. POSTROUTING: nat
  9. PREROUTING: raw
  10. PREROUTING: mangle
  11. PREROUTING: nat
  12. Yönlendirme kararı
  13. INPUT: mangle
  14. INPUT: filter
  15. Paket yerel bir süreç ya da çekirdek tarafından alınır
 Kurallar (Rules)
Belli zincir/tablolar için hangi paketlere hangi eylemlerin uygulanacağını belirlemek için kurallar tanımlamak yeterlidir. Bütün kurallar bütün zincirlere uygulanmaz.

Zincir yönetiminde kullanılan bazı seçenekler ve parametreler
Zincir yönetiminde kullanılan seçenekler:
-N: Yeni zincir ekleme
-X: Boş zincir silme
-P: Temel zincirlerdeki kuralı (policy) değiştirme
-L: Zincir kurallarını listeleme
-F: Zincirlerdeki kuralları boşaltma
-Z: Zincirlerdeki paket ve byte sayacını sıfırlama

Zincirlere kural tanımlamak için:
-A: Zincire yeni kural ekleme
-I: Zincirde herhangi bir konuma kural eklemek için
-R: Zincirde herhangi bir konumdaki kuralı değiştirmek için
-D: Zincirden herhangi bir kural silmek için

Zincirdeki kuralların yönetiminde kullanılan parametrelerden bazıları:
-p: protokol
-s: kaynak makine
-d: hedef makine
-i: Giriş işleminde kullanılacak arabirim
-o: Çıkış işleminde kullanılacak arabirim
-j: Uygulanacak kural
-t: Kullanılacak zincir

Basit Komutlar
sudo iptables -L

komutu iptables'taki kurallarınızı listeler. Eğer henüz herhangi bir kural tanımlamadıysanız şu şekilde bir çıktıyla karşılaşıcaksınız:

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

Kurulu Oturumlara İzin Vermek:
Halihazırda kurulu oturumların trafiğine izin vermek için:
$sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Belli Bir Porttan Gelen Trafiğe İzin Vermek
Öntanımlı SSH portundan (22) gelen trafiğe izin vermek için, iptables'a bu porttan gelen bütün TCP trafiğine izin vermesini söyleyebilirsiniz:
$sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
Komutu incelersek:
  • -A INPUT: Gelen trafiğe bakmak için kuralı girdi zincirine ekliyoruz
  • -p tcp: TCP olup olmadığına bakıyoruz
  • --dport ssh: Eğer öyleyse, girdinin ssh portuna gidip gitmediğine bakıyoruz
  • -j ACCEPT: Eğer öyleyse, girdiyi kabul ediyoruz
Bu eklemelerden sonra kuralları tekrar kontrol edersek:
$sudo iptables -L
 Chain INPUT (policy ACCEPT)
target     prot opt source               destination       
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh

Şimdi gelen bütün web trafiğine izin verelim:
$sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Kurallarımızı tekrar kontrol edelim:
$sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
Özel olarak ssh ve web trafiğine izin verdik ama herhangi bir engelleme yapmadığımız için bütün trafik devam edecektir.

Trafiği Engelleme
Bir paketi kabul etmek için bir kural tanımladığımızda, diğer kurallar onu etkilemez. Ssh ve web trafiğine izin veren kurallarımız önce geldiği sürece bütün trafiği engellesek de bu portlardan gelen trafik devam edecektir. Önemli olan bu kuralı sona eklemektir:
$sudo iptables -A INPUT -j DROP
$sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
DROP       all  --  anywhere             anywhere
Özel olarak herhangi bir arayüz(interface) belirtmediğimiz için, ssh ve web haricinde bütün portlardaki ve arayüzlerdeki trafik engellenir.
iptables Düzenleme
Son tanımladığımız kuralla loopback arayüzü de engellenmiş oldu. Engelleme kuralını özel olarak -i eth0 ile sadece eth0 için tanımlayabilirdik. Bunun yanında loopback için de bir kural ekleyebiliriz. Kuralımızı eklediğimizde en sona geleceği ve onun öncesinde bütün trafiği engellediğimiz için bir işe yaramayacaktır. Bu yüzden bu kuralı dah önceye eklemeliyiz:
$sudo iptables -I INPUT 1 -i lo -j ACCEPT
$sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        
ACCEPT     all  --  anywhere             anywhere           
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
DROP       all  --  anywhere             anywhere
Bu açıdan bakınca ilk ve son satır neredeyse aynı. Daha detaylı bakmak için:
$sudo iptables -L -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        
    0     0 ACCEPT     all  --  lo     any     anywhere             anywhere           
 2661  616K ACCEPT     all  --  any    any     anywhere             anywhere             state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http
  222 24504 DROP       all  --  any    any     anywhere             anywhere


Kaynaklar:

Hiç yorum yok:

Yorum Gönder