İptables
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.
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:
- Paket yerel bir süreç ya da çakirdek tarafından üretilir
- Yönlendirme kararı
- OUTPUT: raw
- OUTPUT: mangle
- OUTPUT: nat
- OUTPUT: filter
- POSTROUTING: mangle
- POSTROUTING: nat
- PREROUTING: raw
- PREROUTING: mangle
- PREROUTING: nat
- Yönlendirme kararı
- INPUT: mangle
- INPUT: filter
- 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:
-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:
-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ı:
-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
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:
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:
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:
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:
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:
Kurallarımızı tekrar kontrol edelim:
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 -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 -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:
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