The truth about my life

Sat, 13 Nov 2004

Daha önce söz verdiğim gibi, bu günlük kaydına IPTables/Netfilter konusunda temel düzeyde bazı açıklayıcı bilgiler ekledim, umarım birilerinin işine yarar.

Bu arada, FrontSITE'da çalıştığım dönemde eğitim belgelerinde kullanılmak üzere hazırlanan örnek ağ şemalarından ve firewall script'lerinden birini kullanmama izin vererek bu belgeyi hazırlama süremi kısalttığı için Murat Koç'a teşekkürler.

İçindekiler:

Netfilter nedir?

Netfilter, en basit ifade biçimi ile 2.3 ve daha yeni Linux çekirdeği sürümleri içerisinde bulunan yetenekli ve yüksek performanslı NAT, filtering ve packet mangling sistemi olarak biliniyor.

Peki, IPTables nedir?

iptables, çekirdek içerisinde yer alan Netfilter sistemini userspace içerisinden denetlemek amacıyla kullandığımız araç ve yazılımın adı.

Bu ikisi sürekli birlikte anılıyor, farkları nedir?

Netfilter, Linux çekirdeği içerisinde sürekli olarak çalışır ve Linux sistem çağrıları (syscall) yoluyla yönetilir. IPTables ise, çekirdek içerisinde çalışan netfilter yapısını yönetmek amacıyla kullandığımız araç. Her ikisi de Netfilter projesi kapsamında, aynı kişiler ve gruplar tarafından geliştiriliyor. Buna karşın netfilter kodu resmi Linux çekirdeği ile birlikte gelirken, iptables adındaki araç ayrı bir yazılım ve kullanılan dağıtım tarafından sağlanıyor.

Temel kavramlar: IP paketinin yapısı

IP paketlerini mektup zarflarına kadar basitleştirecek olursak, temel anlamda bir IP paketi:


Şekil 1: Basit bir IP paketi

bu kadar basit algılanabilir (tabii gerçekte böyle değil, IP paketleri çok daha fazla bilgi içeriyor fakat şimdilik bu bölümlerle ilgilenmeyeceğiz). Bir IP paketini şimdilik yalnızca nereden geldiğini, nereye gitmek üzere gönderildiğini ve veriyi içeren bir mantıksal bir birim olarak düşünelim.

Nelerden bahsedeceğiz?

Bu belge içerisinde, yalnızca Netfilter'ın çok sık kullanılan NAT ve Filtering özelliklerinden bahsedeceğim; packet mangling ve bandwidth shaping gibi daha ileri düzey konulara şimdilik girmeyeceğim.

Ayrıca kullanıcı tanımlı kural zincirlerinin yönetimi, REJECT ve LOG target konularından ve paketlerin bağlantı durumlarına göre incelenmeleri gibi konulardan da detaylı olarak bahsetmeyeceğim.

Bu konulardan bahsetmeme nedenim, belgeyi olabildiğince basit ve giriş düzeyinde tutmak. Bahsetmediğim konular gelişkin bir güvenlik duvarı yapılandırması için değerli ve gerekli konular. Bu konularda vakit bulduğumda ayrıca geniş bir belge hazırlayacağım.

Netfilter nasıl çalışıyor?


Şekil 2: Netfilter, tablolar ve zincirler

Yalnızca NAT ve IP Filtering konularından bahsedecek olmanın verdiği rahatlıkla yukarıdaki şekli çizdim.

Netfilter temel anlamda iki farklı türden ve mantıksal olarak birbirine benzerlik gösteren işlemler gerçekleştiriyor. Bunlar:

  • NAT (Network Address Translation): IP paketlerinin kaynak veya hedef adreslerinin (IP adresi ve port numarası gibi bilgilerin) routing (ip paketinin bir arayüzden bir diğerine aktarılması işlemi) öncesinde veya sonrasında, çeşitli biçimlerde değiştirilmesi işlemine verilen genel ad. NAT işlemi, routing'den önce (PREROUTING) yapılırsa routing sürecinin davranışını etkiler. Routing'den sonra (POSTROUTING) yapılırsa, tahmin edebileceğiniz gibi, routing sürecinin davranışı bu durumdan etkilenmez.
  • Filtering: IP paketlerinin kaynak ve hedef adreslerinin tanımlanan çeşitli kriterlere göre geçişine/kabulüne izin verilmesi veya verilmemesi ile ilgili tüm işlemler filtreleme kapsamda anılır.

Haydi NAT yapalım

Bence ideal bir dünyada NAT olmamalıydı. Eğer herkese yetecek kadar çok IP adresimiz olsaydı ve her IP adresi için ek bedel ödemek gibi anlamsız koşullar olmasaydı, NAT gibi bir işleme gerek kalmazdı :) Her neyse, NAT var ve bunu kullanıyoruz. Bununla yaşamamız gerek.

NAT gibi süreçler, bir tek IP adresine sahip olduğunuz fakat bu IP adresini çeşitli hizmetler için ortak kullanmanız gerektiği durumlarda, belirli sınırlar çerçevesinde faydalı oluyor. En popüler senaryolardan bir tanesini açıklamak gerekirse, dial-up bir modem ile edindiğiniz bir IP adresiniz var ve aynı zamanda bu bilgisayara bağlı bir ethernet üzerinden yerel ağınızdaki diğer bilgisayarlarla iletişim kurabiliyorsunuz. Yerel ağınıza bakan ağ arayüzünün 192.168.1.1 olduğunu, modem bağlantınızdan edindiğiniz IP adresinin de 123.123.123.123 olduğunu varsayalım. IP dolaştırma (routing) etkin olsun (nasıl etkinleştirileceğinden bahsedeceğim).

Yalnızca IP dolaştırma yapılanmasının etkin olduğu durumda yerel ağdan (örneğin IP adresi 192.168.1.5 olan "Ahmet"'in bilgisayarından) gelen bir IP paketi; kaynak adresinde 192.168.1.5 bilgisi yer alacak biçimde Internet erişimimiz bulunan IP adresi üzerinden, değiştirilmeksizin iletilecek. Eğer bağlı bulunduğumuz ISP, IP dolaştırma sırasında özel bazı adresleri de yönlendirecek kadar dikkatsiz ise Ahmet'in Internet üzerinde bağlanmaya çalıştığı sunucuya kaynak adresi 192.168.1.5 olan bir IP paketi ulaşacak :) Ve karşıdaki sunucu da bu bağlantı isteğine vereceği tüm yanıtları 192.168.1.5 adresine göndermeye çalışacak, fakat başarısız olacak çünkü bildiğiniz gibi 192.168.0.0/24 gibi ayrılmış IP blokları Internet üzerinde kullanılmaz.

Bu durumda, Ahmet'in bağlandığı sunucunun yanıtları Ahmet'e gönderebilmesini sağlamak üzere, Ahmet'den gelen ve Internet yönüne doğru gidecek olan paketlerin hedef adreslerini, Internet'e bağlı bulunan sistemimizin Internet üzerindeki gerçek IP adresi ile değiştirmeliyiz ki Ahmet'in isteğine yanıt olarak gönderilecek IP paketleri Internet'e bağlı bulunan sistemimize kadar ulaşabilsin. Ayrıca, bu işlemi yapan sistemimiz hangi IP paketlerini nereden geldikleri ve nereye gittikleri gibi asıl bilgiler ile birlikte nasıl değiştirdiğini hatırlamalı ki yanıt niteliğinde gelen paketleri yerel ağımızdaki asıl hedeflerine (yani örneğimizde Ahmet'in bilgisayarına) tekrar, Internet üzerinden geliyormuş gibi gönderebilsin (stateful NAT). Bu işlem, basit bir NAT uygulamasıdır ve iptables kullanılarak tek satırlık ve birçok kişinin ne olup bittiğini anlamaksızın ezberlediği bir komut ile kolaylıkla gerçekleştirilebilir.

İlk bakışta görülebileceği gibi, NAT iki durumda yani iki farklı biçimde yapılabilir:

  • SNAT (Source NAT): IP paketlerinin kaynak (source) adreslerinin değiştirilmesidir. Yukarıdaki örnek basit bir SNAT uygulamasıydı. SNAT daima POSTROUTING (yani routing işleminden sonra) yapılır.
  • DNAT (Destination NAT): IP paketlerinin hedef (destination) adreslerinin değiştirilmesidir. DNAT daima PREROUTING (yani routing işleminden önce) yapılır.

Netfilter, daima stateful NAT yapar. Yani NAT yapılan her paketi ve TCP için paketlerin ilgili olduğu bağlantı oturumlarının durumlarını hatırlar.

Ayrıca, MASQUERADE adıyla bilinen özel bir SNAT türü var. Masquerading, sabit bir IP adresine veya sabit/güvenilir bir bağlantıya sahip olmayan sistemlerde kullanılması için tasarlanmış bir NAT türü. SNAT yerine MASQUERADE kullanıldığında, paketin hedef adresine, paketin sistemden ayrılacağı ağ arayüzünün IP adresi otomatik olarak yazılır (SNAT kullanıldığında paketin kaynak adresine yazılacak IP adresini belirtmek durumundasınız). Tek dezavantajı, SNAT'a kıyasla çok küçük performans kayıplarına neden olması. Ayrıca doğru kullanılmadığında ve küçük birkaç husus gözden kaçırıldığında MASQUERADE ile sisteminize küçük güvenlik açıkları oluşturmanız işten bile değil.

Şimdi örneğimizi tamamlayalım ve neler olup bittiğini açıklayalım:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

iptables aracını kullanarak çekirdek içerisindeki Netfilter modüllerinin yapılandırmasına bir kural ekleyerek değiştirmiş olduk ve belirttiğimiz kural, 192.168.1.0/24 ağından gelen ve ppp0 arayüzü yönüne gidecek olan (routing'den sonra NAT yaptığımız için bu bilgiye sahibiz) tüm IP paketlerinin kaynak adreslerine gönderilmeden önce otomatik olarak ppp0 arayüzünün IP adresinin yazılmasını sağladı. Bu sayede hedef sunucudan dönen yanıt paketleri bize ulaşacak ve Netfilter yanıt niteliğindeki paketleri tersi yönde otomatik olarak DNAT yapacak ve routing işleminden önce bu paketlerin hedef adreslerini değiştirerek yerel ağımızdaki kullanıcılara ulaşmasını sağlayacak (bu işlem için ayrıca bir kural eklememize gerek yok).

Aynı senaryoya bir özellik daha ekleyelim; Internet'e modem ile bağlı olan sistemimiz, Internet yönünden kendisine ulaşan HTTP (TCP port 80) isteklerini Ahmet'in 192.168.1.5 adresindeki bilgisayarına iletsin. Kuralımız:

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport http -j DNAT --to 192.168.1.5

Bu parametreler ne anlama geliyor? Nasıl kullanılıyor?

Netfilter, IP paketleri üzerinde yapılacak çeşitli işlem türlerini ve aşamalarını tablolar içerisinde gruplar. Bu belgede yalnızca nat ve filter tablolarından bahsedeceğiz. Bu tablolar içerisinde kural zincirleri bulunur (kural zincirleri sistem tarafından veya kullanıcılar tarafından gereksinimlere göre tanımlanır). Ayrıca her tablo, öntanımlı adı değiştirilemeyen ve silinemeyen belirli sayıda kural zinciri içerir, bunlar:

  • nat tablosu:
    • PREROUTING (DNAT için kullanılır).
    • POSTROUTING (SNAT için kullanılır).
    • OUTPUT (sistemin kendisi tarafından üretilen paketlere nat uygulanması için kullanılır).
  • filter tablosu ("iptables -t" ile ayrıca belirtilmezse öntanımlı tablodur)
    • INPUT (sistemin kendisine ulaşması için gönderilen paketlerin filtrelenmesi için kullanılır)
    • OUTPUT (sistemin kendisi tarafından üretilen paketlerin filtrelenmesi için kullanılır)
    • FORWARD (routing işlemi sırasında paketlerin filtrelenmesi için kullanılır)

Sık kullanılan parametrelerden bazıları:

Ad Kullanım biçimi Açıklama Örnek
Tablo seçimi -t <tablo_adi> iptables komutunun devamındaki parametrelerin hangi tablo üzerinde gerçekleştirileceğini belirtmek amacıyla kullanılır. -t nat
-t filter
Kuralları listele -L [<zincir_adi>] Bir tablodaki istenen veya tüm zincirlerde yer alan kuralları listeler. -L
-L POSTROUTING
Kuralları temizle -F [<zincir_adi>] Bir tablodaki istenen veya tüm zincirlerde yer alan kuralları temizler. -F
-F POSTROUTING
Öntanımlı davranış belirle -P <zincir_adi> <davranis> Bir tablodaki belirtilen zincirin öntanımlı davranış kuralını belirler. Zincirdeki diğer kurallarden herhangi biri tarafından işlenmeyen bir paket, öntanımlı davranış kuralında belirtilen işleme tabi tutulur. -P INPUT DROP
-P INPUT LOG
Kural ekle -A <zincir_adi> Bir tablodaki belirtilen zincir içerisine belirtilen parametrelere göre bir kural ekler. -A POSTROUTING
-A FORWARD
Kural sil -D <zincir_adi> Bir tablodaki belirtilen zincirde yer alan ve belirtilen parametrelerle bire bir aynı olan kuralı siler. -D POSTROUTING
-D FORWARD
Kullanıcı tanımlı zincir sil -X [<zincir_adi>] Bir tablodaki belirtilen veya tüm kullanıcı tanımlı zincirleri siler. -X benim_zincirim
-X

Paket seçimi için kullanılan parametreler:

Ad Kullanım biçimi Açıklama Örnek
Kaynak adresi -s [!] <adres> İncelenen paketin kaynak adresi, belirtilen adres ile örtüşüyor ise paket üzerinde belirtilen işlem gerçekleştirilir. -s 192.168.1.5
-s 192.168.1.0/24
Hedef adresi -d [!] <adres> İncelenen paketin hedef adresi, belirtilen adres ile örtüşüyor ise paket üzerinde belirtilen işlem gerçekleştirilir. -d 192.168.1.10
-d 192.168.2.0/24
Protokol -p [!] < tcp | udp | icmp | all > İncelenen paket belirtilen taşıyıcı protokol ile örtüşüyor ise paket üzerinde belirtilen işlem gerçekleştirilir. Öntanımlı değeri (belirtilmediğinde): "all" -p tcp
-p udp
-p icmp
-p all
Hedef port --dport [!] <port_no> İncelenen paketin hedef port adresi belirtilen port ile örtüşüyor ise paket üzerinde belirtilen işlem gerçekleştirilir. --dport 80
--dport ftp
Kaynak port --sport [!] <port_no> İncelenen paketin kaynak port adresi belirtilen port ile örtüşüyor ise paket üzerinde belirtilen işlem gerçekleştirilir. --sport ftp-data
--sport 53
Geliş arayüzü -i [!] <arayuz> İncelenen paketin geldiği ağ arayüzü belirtilen ağ arayüzü ile örtüşüyorsa paket üzerinde belirtilen işlem gerçekleştirilir. Bu bilgiye yalnızca routing işleminden önce veya routing işlemi sırasında yapılan denetimlerde erişilebilir. -i eth1
-i ppp0
Gidiş arayüzü -o [!] <arayuz> İncelenen paketin gitmek üzere olduğu ağ arayüzü belirtilen ağ arayüzü ile örtüşüyorsa paket üzerinde belirtilen işlem gerçekleştirilir. Bu bilgiye yalnızca routing işleminden sonra erişilebilir. -o ppp0
-o eth1

Ayrıca bu parametrelerin tümünde, belirtilecek değerden önce kullanılabilecek ünlem işareti (!), olumsuzluk belirtmek anlamında kullanılır. Örneğin, --dport ! 80 biçimindeki bir tanımın bulunduğu kural, hedef port adresi 80 olmayan tüm paketlere uygulanacaktır.

Çeşitli ifadelere göre seçilen paketlere nasıl bir işlem uygulanacağı -j parametresi ile belirtilir ve bahsi geçen kuralın bulunduğu tabloya göre değişiklik gösterir:

  • NAT tablosu için:
    Ad Kullanım biçimi Açıklama Örnek
    SNAT -j SNAT --to <adres[:port]> Sistemden ayrılmak üzere olan paketin kaynak adresini (ve belirtilmişse kaynak port numarasını) belirtilen adres (ve belirtilmişse port numarası) bilgisi ile değiştirir. Bu işlem yalnızca routing işleminden sonra gerçekleştirilebilir. -j SNAT --to 212.156.4.1
    -j SNAT --to 212.156.4.20:53
    -j SNAT --to 192.168.1.35:http
    DNAT -j DNAT --to <adres[:port]> Sisteme henüz gelmiş bir paketin hedef adresini (ve belirtilmişse hedef port numarasını) belirtilen adres (ve belirtilmişse port numarası) bilgisi ile değiştirir. Bu işlem yalnızca routing işleminden önce gerçekleştirilebilir. -j DNAT --to 192.168.1.5
    -j DNAT --to 212.156.123.123:10000
    MASQUERADE -j MASQUERADE Sistemden ayrılmak üzere olan paketin kaynak adresini, paketin sistemden ayrılacağı ağ arayüzünün adresi ile değiştirir. Bu işlem yalnızca routing işleminden sonra gerçekleştirilebilir. -j MASQUERADE
    REDIRECT -j REDIRECT --to <port> Sisteme henüz gelmiş bir paketin, iptables kurallarının çalıştığı sistem üzerindeki belirtilen port adresine yönlendirilmesini sağlar. -j REDIRECT --to 3128
  • Filter tablosu için:
    Ad Kullanım biçimi Açıklama Örnek
    ACCEPT -j ACCEPT Belirtilen paket seçimi parametrelerine uyan paketin geçişine izin verilir. -j ACCEPT
    DROP -j DROP Belirtilen paket seçimi parametrelerine uyan paket gözardı edilir, hiç alınmamış gibi davranılır. -j DROP
    REJECT -j REJECT Belirtilen paket seçimi parametrelerine uyan paket uygun bir ICMP hata paketi ile yanıtlanarak, reddedilir. Bu konuda daha detaylı bilgi için man iptables komutu verin. -j REJECT
    LOG -j LOG Belirtilen paket seçimi parametrelerine uyan paket sistem kayıtları içerisine kaydedilir. Bu konuda daha detaylı bilgi için man iptables komutu verin. -j LOG

Filtreleyelim!

Kısa bir senaryo, sistemimize SSH (tcp port 22) ile gelebilecek tüm bağlantıları kapatmak istiyoruz:

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

komutunu verdiğimizde, sistemimize herhangi bir ağ üzerinden SSH ile erişmek mümkün olmayacak, çünkü Netfilter paketlerin işletim sisteminin IP yığıtı içerisinde değerlendirmeye alınmasını engelleyecek ve gözardı edecektir.

Yeri gelmişken, daha önce bahsettiğim bir ipucunu kullanmak istiyorum. Son örneğimizde -t filter ile filter tablosunu ayrıca belirtmiştik, fakat -t parametresi belirtilmediğinde öntanımlı olarak zaten filter tablosu kullanılır, dolayısıyla bu ifade çok da gerekli değil.

Örneğimizi biraz geliştirelim; 192.168.1.5 dışında hiçbir yerden ssh kabul etmeyelim:

iptables -A INPUT -s ! 192.168.1.5 -p tcp --dport ssh -j DROP

Bir başka örnek, yerel ağdan gelmeyen tüm SSH isteklerini boşverelim:

iptables -A INPUT -i ! eth0 -p tcp --dport ssh -j DROP

Sanırım artık FORWARD zinciri ile de oynayabiliriz, yerel ağdan internet yönüne giden tüm SMTP iletişimini boşverelim örneğin (IP Forwarding'in açık olduğunu varsayıyorum):

iptables -A FORWARD -i eth0 -p tcp --dport smtp -j DROP

IP Forwarding nedir, nasıl çalıştırılır?

IP Forwarding, daha önce de belirttiğim gibi IP paketlerinin bir ağ arayüzünden bir diğerine aktarılması; yani IP paketlerinin bir fiziksel ağdan bir diğerine aktarılması işlemidir. Linux çekirdeği, bu işlemi gerçekleştirmek için gerekli tüm yapıyı barındırır ve aktif hale getirmek kolaydır:

echo 1 > /proc/sys/net/ipv4/ip_forward

IP Forwarding işleminin düzgün çalışabilmesi için, en az bir ağ arayüzüne (Linux çekirdeği sanal arayüzler arasında da IP Forwarding yapabilir) ve en az iki IP subnet'in routing tablosunda tanımlı olmasına gereksinim duyulur:

roadrunner:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.199.0   0.0.0.0         255.255.255.0   U     0      0        0 eth1
0.0.0.0         192.168.199.3   0.0.0.0         UG    0      0        0 eth1

Örnekteki routing tablosuna göre, 192.168.1.0/24 ve 192.168.199.0/24 ağları arasında IP Forwarding işlemi gerçekleştirilebilir. Ayrıca bir default gateway (0.0.0.0: bilinmeyen ağlara 192.168.199.3 yoluyla eth1 üzerinden ulaşılacağı anlamına gelir) tanımlı olduğundan, diğer tüm ağlara erişim buradan sağlanır. IP paketlerinin hangi ağlara yönlendirileceği, routing tablosu içerisindeki kayıtlara göre belirlenir.

Öntanımlı zincir kuralları

IPTables, tüm zincirler için öntanımlı bir davranış kuralı tanımlanmasına izin verir. Eğer bir IP paketi, ilgili zincir içerisindeki kurallardan herhangi biri tarafından ACCEPT yada DROP/REJECT biçiminde işaretlenmemişse, zincirin öntanımlı kuralı tarafından yakalanır.

Örneğin, filter tablosundaki FORWARD zincirinin öntanımlı kuralını DROP olarak değiştirecek olursak:

iptables -P FORWARD DROP

IP forwarding/routing sırasında, FORWARD zinciri içerisindeki kurallardan herhangi biri tarafından ACCEPT edilmeyen paketler, gözardı edilir. Özetle öntanımlı olarak tüm paketlerin forward edilmesini kapatmış oluruz, daha sonra FORWARD zincirine ekleyeceğimiz kurallarla da istisnalar tanımlayabiliriz:

iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.1.0/24 -o ppp0 -p tcp --dport ssh -j ACCEPT

Bu tanım sayesinde 192.168.1.0/24 ağı, ppp0 (Internet) yönüne yalnızca SSH protokolünü kullanarak erişebilir. Tabii NAT yapmazsak erişemeyecekler :)

Öneriler

Bu bölüme, iptables'i öğrenmeye başladığım günden bu yana edindiğim naçizane tecrübelerimi ve önerilerimi eklemek istedim.

  • Birşeyler yapmaya başlamadan önce, tüm ağınızın bir detaylı ve bir de basit haritasını çıkarın. Ağ bileşenlerini birbirine bağladığınız çizgilerin her iki ucunda birer ok olduğunu, verinin ve bağlantıların iki yönü olabileceğini unutmayın.
  • Önce herşeyi kapatın (öntanımlı zincir kurallarını kullanarak), daha sonra yalnızca ihtiyaç duyduğunuz portlara izin verin.
  • Zincirlere eklediğiniz kuralların mümkün olduğunca detaylı olmasına dikkat edin. Kaynak ve hedef adres/ağ, port, ağ arayüzü gibi çeşitli parametreleri birlikte kullanarak paket seçimini olabildiğince kesin biçimde belirtin.
  • Güvenliğin firewall'dan ibaret olmadığını aklınızda tutun. Kontrolünüzdeki Internet bağlantısı üzerinden yerel ağınıza erişimi engelleyebilirsiniz, ama kullanıcılarınızın kendi bilgisayarlarına modem bağlayıp Internet'e kendileri bağlanabileceklerini de hatırlayın. Güvenlik duvarınıza delik açmak veya arkasından dolaşmak için onlarca yol bulunduğunu bilin.

Kapsamlı bir firewall yapılandırması örneği

Önce örnek ağımızın neye benzediğine bir bakalım:


Şekil 3: Örnek ağ şeması

ve gereksinimlerimizi belirleyelim:

  • Yerel ağımızdaki (LAN: 192.168.1.0/24) kullanıcıların 192.168.1.1 adresindeki güvenlik duvarı üzerinden yalnızca HTTP (port 80) ile web sayfalarına ulaşabilmelerini istiyoruz.
  • Yerel ağımızdaki kullanıcıların DMZ (de-militarized zone, silahsızlandırılmış bölge: 10.0.0.0/8) içerisindeki dosya ve e-posta sunucularına yalnızca belirli portlardan ulaşabilmelerini istiyoruz.
  • Internet üzerindeki kullanıcıların, DMZ içerisindeki e-posta sunucusuna POP3 ve SMTP portları ile, ayrıca webmail için HTTP ile erişebilmelerini istiyoruz.
  • DMZ içerisindeki e-posta sunucusunun yalnızca SMTP portu ile Internet üzerindeki herhangi bir sunucuya ulaşabilmesini istiyoruz.
  • DMZ içerisindeki sunucuların LAN erişimi olmamasını istiyoruz.
  • Gayet tabii, Internet üzerinden LAN erişimi mümkün olmasın ve belirttiğimiz istisna dışında Internet üzerinden DMZ erişimi de mümkün olmasın istiyoruz.

Aşağıdaki shell script, gereksinimlerimizi karşılıyor olmalı:

01: #!/bin/sh
02: # Temizle
03: iptables -t nat -F
04: iptables -t nat -X
05:
06: iptables -F
07: iptables -X
08:
09: # NAT Kuralları
10: iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to 212.156.45.35
11: iptables -t nat -A POSTROUTING -s 10.0.0.0/8     -o eth1 -j SNAT --to 212.156.45.35
12: iptables -t nat -A PREROUTING -i eth1 -p tcp -m multiport --dports 25,80,110 -j DNAT --to 10.0.0.2
13:
14: # Filtering kuralları
15: iptables -P FORWARD DROP
16: # Internet üzerinden mail server erişimi izni
17: iptables -A FORWARD -i eth1 -p tcp -m multiport --dports 25,80,110 -d 10.0.0.2 -j ACCEPT
18: # Mail server'in Internet'e erişim izni
29: iptables -A FORWARD -i eth2 -s 10.0.0.2 -p tcp --dport 25 -o eth1 -j ACCEPT
20: # LAN -> Internet erisim izinleri
21: iptables -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT
22:
23: # LAN -> DMZ erişim izinleri
24: # Mail server
25: iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.2 -p tcp -m multiport --dports 25,110 -o eth2 -j ACCEPT
26: # File server
27: iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.3 -p tcp -m multiport --dports 139 -o eth2 -j ACCEPT
28: iptables -A FORWARD -s 192.168.1.0/24 -d 10.0.0.3 -p udp -m multiport --dports 137,138 -o eth2 -j ACCEPT
29:
30: # Tüm gelen bağlantıları yasakla
31: iptables -P INPUT DROP
32:
33: # Loopback'den gelen bağlantıları kabul et
34: iptables -A INPUT -i lo -j ACCEPT
35: # SSH bağlantılarını yerel ağdan kabul et
36: iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
37: # Internet yönünden gelen SSH bağlantılarını kabul et
38: iptables -A INPUT -i eth1 -p tcp --dport 22 -j ACCEPT

1. satır, bu dosyanın bir shell script olduğunu belirtmek için kullanılıyor. 3. ve 4. satırlar, NAT tablosu içerisindeki tüm kuralları ve kullanıcı tanımlı zincirleri silecek. 6. ve 7. satırlar bu işi Filter tablosu için yapacak. 10. satır, LAN -> Internet yönünde gidecek olan paketlere SNAT uygulayarak yerel ağdaki kullanıcıların Internet'e bağlanmasını sağlayacak. 11. satır, DMZ -> Internet yönünde erişimi SNAT ile sağlayacak. 12. satır, Internet üzerinden TCP port 25 (smtp), 80 (http) veya 110 (pop3) ile gelen kullanıcıların DMZ içerisindeki e-posta sunucusuna yönlendirilmelerini sağlayacak. 15. satır, filter tablosundaki FORWARD zincirinin öntanımlı kuralını DROP olarak değiştirecek, böylece öntanımlı olarak tüm routing işlemlerini kapatmış olacağız. Diğer satırlarda tanımlanan istisnalarla gerektiği kadarını açacağız. Diğer satırlar sanırım yerince açıklama içeriyor :)

Bu belgeyi hazırlamak biraz zamanımı aldı ve örneği istediğim kıvama getirmek için yeterince zaman bulamadım, önerilerinize açığım. Umarım birilerinin işine yarar.

İyi eğlenceler,

blog comments powered by Disqus

About me

I'm Enver ALTIN. I'm from the other side of the river.

Calendar

November 2004
SuMoTuWeThFrSa
  1 2 3 4 5 6
7 8 910111213
14151617181920
21222324252627
282930    

Categories

/ (398)
  articles/ (1)
  books/ (8)
  coffee/ (1)
  construia/ (2)
  debian/ (1)
  events/ (13)
  factsoflife/ (15)
  general/ (9)
  gnome/ (16)
  humor/ (21)
  lkd/ (9)
  management/ (1)
  mobile/ (6)
  mono/ (4)
  music/ (8)
  personal/ (47)
  politics/ (31)
  postgresql/ (4)
  programming/ (12)
  projects/ (2)
  quotes/ (3)
  technology/ (10)
  tips/ (7)
  travel/ (2)
  work/ (13)

Archives

Links

Popular

Talk slides

Other stuff

License

Creative Commons License
This work is licensed under a Creative Commons Attribution 2.5 License.

Miscellaneous

This site is built on the wonders of Pyblosxom, supposed to be W3C XHTML 1.0 and CSS 1.0 compliant, always handcoded using Vim. The server that hosts this site is powered by Debian GNU/Linux.
.O.
..O
OOO