| Linux uzerinde IPCHAINS Firewall
    Kurulumu ve Konfigurasyonu.   | ||
| 
 | ||
| Firewall tek bilgisayarınıza veya yerel
    ağınıza internet ten veya diğer ağlardan erişimi i kısıtlayıp bilgisayarınızın
    veya yerel ağınızın internet ten veya diğer ağlardan gelecek saldırılara karşı
    koruyan bir sistemdir. Firewall İnternet ile Yerel ağınızın arasında
    bulunur(Aşagıdaki Şekilde oldugu gibi). Bu sayede İnternetten gelen ve internete giden paketleri mutlaka firewall kurulu bilgisayardan geçmek zorundadır. Bu sayede gelen ve giden paketleri kontrol edebilir. İstedigine izin verip , istediginizi engelleyebilirsiniz. Bu kısıtlama paket filtreleme yöntemi ile yapılır | ||
| 
 | ||
| Bu dokumanin en guncel hali; http://www.enderunix.org/docs/ipchains.html
    adresindedir. Aksi belirtilmedigi takdirde bu kabil dokumanlarin haklari kendilerini yazan yazarlarda saklidir. Bu dokuman da, parca parca ya da tamamen herhangi bir sekilde, yazarinin izni dahilinde dagitilabilir. Yazar, bu dokumani okuyanlarin ugrayacaklari herhangi bir zarardan oturu sorumluluk kabul etmez. Use at your own risk! Bu makalede, yeni kullanicilara ipchains paketinin tanitimi, ve guzel firewall dizayni hakkinda bir kac bilgi verebilmek amaciyla yazilmistir. Kullanicinin temel network kavramlari, temel isletim sistemi kavramlari, paket filtreleme, tcp/ip hakkinda genel bilgisi oldugu kabul edilmektedir. Vasatin uzeri seviyede Linux bilgisi gerekmektiedir!!!. Egerki, BSD uzerinde bir firewall uygulamasi ( ipfilter'la ) Murat hoca'nin OpenBSD / FreeBSD + IpFilter dokumanini okuyabilirsiniz. Adresi: http://www.enderunix.org/docs/ipfilter.html Burada, temel ( www/smtp/ssh/pop/imap gibi ) birkac servisin firewall kontrolu altinda alinmasi, ve organizasyonun internet cikisinin firewall'imizdan yapilmasi icin gerekli konfigurasyonu, ipfilter'i genel olarak anlatarak yapacagiz. --Ismail Yenigul | ||
| Paket Filtreleme | ||
| Paket filtreleme Linux kernel(Çekirdek) içerisine gömülmüş durumdadır ve TCP/IP
    protokolunun Network Layer(Ağ Katmanı) da çalışır.Bu sayede sadece firewall
    kurallarının izin verdiği paketlerin geçisine izin verilir. Paketler tipine ,kaynak
    adresine(source address), hedef adresine (destination address)  ve portlara göre
    filtrelenir. Paket  Aynı zamanda Router görevi yapan firewall makinasına geldigi
    zaman paketin başlık(header) kısmı açılır ve paket başlıgındaki bilgilere göre
    paket e izin verilir veya engellenir. Paketin başlık kısmında aşağıdaki bilgiler
    bulunur 
 İki türlü Firewall dizayn vardı      1-   Kapatınlan  trafik
    dışındaki tüm trafige izin vermek.  1. Burada güvenlik açığı olabilecek uygulamaları tek tek kapatmak zorundasınız ve diğerlerine izin vermelisiniz. Bu durumda bazı gözden kaçırdığınız durumlar olabilir. Bu yüzden güvenlik açısından çok iyi bir yöntem değildir. Biz burada 2. yöntemi uygulayacağız. 2. Durum en iyi firewall dizayndır. Burada nelere izin verilip verilmedigi bellidir. ve dahiliniz dışında hehangi bir pakete izin verilmez. 
 | ||
| Ipchains Firewall | ||
| Ipchains, Linux 2.1.102 kernel dan itibaren kullanılmaya başlayan tüm linux
    çeşitlerinde bulunan ücretsiz bir  firewall çeşitidir. ve binlerde $ verilip
    alınan diğer firewalların yaptığı (IP  bazında ,Ağ bazında ,protokol
    bazında, port bazında filtreleme ,  port yönlendirme, gelen paketi reddetme ) gibi
    tüm işleri  yapmaktadır.Ama ne yazıkki ipchainsi bilmeyenler için
    ,ipchains  sadece ücretsiz basit bir firewall programından ibaret
    görülmektedir.  Günde onlarca sitenin HACK edildiği günümüzde
    ,İnternette  güvenliğin ne kadar önemli olduğuna anlatmaya gerek yok.  Bu
    belgede ipchains ile neler yapılacağı anlatılacaktır ve örnek bir ağ yapısı ele
    alınarak ipchains firewall dizaynı yapılacktır. Bu dökümanın   binlerce $
    vermek istemeyen veya veremeyen firmalar veya kişiler için   sistemlerini
    korumakta yardımcı olacağını ümit ederim. Linux 2.1.102 kernel dan önce ipfwadm isimli firewall vardı. Linux kernel liniz 2.0 ise ipchains kullanmak için yama(patch) yapmanız gerekiyor. Ama tavsiyem, şu an en son kararlı kernel 2.2.17 yi ftp://ftp.kernel.org adresinden indirip derlemeniz olacak . Burada baştan Kernel derleme anlatılmayacaktır. sadece kernel a ipchains destegi(Yoksa !) nasıl verileceği anlatılacaktır.Eğer 2.1.102 kernel dan yukarısını kullanıyorsanız. ve /proc/net/ip_fwchains dosyası var ise ipchains kurulu demektir.Kernel derlemenize gerek yoktur. Eğer Kernel de ipchains destegi yoksa ve ipchains yüklü değilse http://netfilter.filewatcher.org/ipchains adresinden ipchains indirip kurun ve kernelinize Network firewalls (CONFIG_FIREFALL) [N] Y  IP:Masquerading (CONFIG_IP_MASQUERADE) [N] Y  yukarıdaki destekleri vererek kernel i tekrar derleyiniz. kernel
    derlemek için  
 xxx Linux un bulunduğu root dizini ifade etmektedir.  
 | ||
| Ipchains komutlari | ||
| İlk olarak #  kullanıldığını da bunun Linux konsolu oldugunu ve Linux e root
    kullanıcısı ile girildigi kabul edilecektir. Kullandığınız ipchains versiyonunu ögrenmek için # ipchains
    --version            komutu
    verildiginde  Ipchains te paketler için ön tanımlı olarak 3 grup vardır. input: (Giriş) Makinanızanın arayüzüne gelen paketller. output: (Çıkış) Makinanızın ara yüzünden çıkan paketler. forward: (Yönlendirme) Makinanızın bir arayüzünden gelip , diğer arayüzüne geçen paketler (MASQUARING gibi) bunların dışında kullanıcıların kendilerine grup tanımlayabilirler. Kendi grubunuzu tanımlamak için # ipchains -N grubadı komutu ile belirtilen grub adında bir grub oluşur. Ipchains le kullanılan parametler şu şekildedir.  -i        
    interface(arayüz)          :Hangi arayüzün
    kullanılacağını belirtir.  Firewall makinamızda Paket için aşagıdaki Karar mekanizmaları(Policy) işler. ACCEPT:        
    Paketin kabul  edildiğini belirtir.  Yukarıdaki tüm ifadeleri örneklerle açıklayalım. # ipchains -A input -i eth0 -p tcp -s 193.12.3.100 -d 212.65.128.100 80 -j ACCEPT Bu komut eth0 arayüzüne(-i eth0), 193.12.3.100 IP adresinden (-s 193.12.3.100) gelen (-A input) , tcp (-p tcp) protokolunu kullanan ve 212.65.128.100 IP li (-d 212.65.128.100 )bilgisayarın 80 portuna gelen paketleri kabul et(-j ACCEPT) manasına gelmektedir. # ipchains -A output -s 212.65.128.100 25  -d 0/0 -p tcp
    -i eth0 -j ACCEPT   #ipchains -A forward -s 0/0 -i eth1  -d 200.1.2.3 -p
    icmp -j ACCEPT  #ipchains -D forward -s 0/0 -i eth1 -d 200.1.2.3 -p icmp -j ACCEPT İfadesi ile bir üstte oluşturduğumuz kuralı kurallar tablosundan sil demektir. # ipchains  -P input DENY  Bu komutlar ile ön tanımlı üç kural grubu için gelen paketleri yasakla (DENY) demektir. Bu durumda hiç bir paket giriş çıkışı olmaz # ipchains -A forward  -i eth0   -p tcp -s
    192.168.1.0/24  -d 0/0  -j MASQ  #ipchains -F  input  #ipchains -L  
 | ||
| Firewall Dizayni | ||
| Bu dökümanda Aşağıdaki gibi bir sisteme sahip bir firmamız olduğu varsayılacak ve buna göre firewall dizayn yapılacaktır. 
 
 Şekilde 3 tane arayüze(interface)sahip bir Linux (Ipchains Kurulu) bilgisayar gözükmektedir. Linux umuz eth0 (Birinci ethernet kartı) isimli arayüz ile firmamızın Sunucularının olduğu ağa bağlanmştır. Sunucların olduğu ağda Firmamıza ait WWW(Web sunucusu IP: 212.2.2.2 ), SMTP(Mail ve POP3 sunucusu IP:212.2.2.3) , DNS(dns sunucusu IP: 212.2.2.4) bulunmaktadır. ve eth1 arayüzü ile Şirkette çalışanların bilgisayarlarının olduğu Yerel Ağa bağlı. Son olarakta ppp0 (Modem) arayüzü ile internet çıkışımızı sağlanmaktadır. Çoğu firmanın Kiralık Hat kulandığı göze alınarak Modem bağlantısının Kiralık hat ile yapıldığı ve sabit bir IP(160.75.5.5) ye sahip olduğu kabul edilmiştir. (Not: hangi servisin hangi numaraya sahip olduğunu /etc/services dosyasından öğrenebilirsiniz.) Dikkat ederseniz Yerel ağ 192.168.1 ile başlayan kayıtsız (unregistered) IP lere sahip bir özel(private) ağdır. Bu tür IP lere sahip bilgisayarların internete bağlanması ve için Linuxumuzda MASQUARING (Maskeleme) yapılması lazımdır. MASQUARING de yerel ağdan çıkan paketler sanki Firewall makinasından çıkıyormuş gibi gösterilir. ve paketinize gelen cevap ilk önce Linux firewall makinamıza gelir ve sizin bilgisara ulaştırılır. Bir örnekle açıklayalım . Diyelim ki siz 192.168.1.49 IP li yerel ağdaki bilgisarayızın web tarayıcısından http://skywalker.mis.boun.edu.tr web sayfasına bağlanmak istediniz. 1-Bu paket sizin bilgisayarınızın 1500 portundan http://skywalker.mis.boun.edu.tr sunucusunun 80(HTTP) portuna gitmek için oluşturulur ve Gateway e iletilir. 2-Gateway olan Linux umuze gelen paket MASQUERADING sayesinde biraz değiştirilir . Aynı paket Linux umuzun kendi yerel 65155 portundan geliyormuş gibi tekrar oluşturulur ve http://skywalker.mis.boun.edu.tr sunucusunun 80 portuna gönderilir. 3- http://skywalker.mis.boun.edu.tr sunucusuna gelen paketimiz bu sunucu tarafından Linux (firewall.pcworld.com.tr diyelim)umuzun 65155 portundan gelmiş gibi gözükür ve gelen pakete cevabı Linux makinamıza gönderir. 4-Linux u muze gelen bu paketi ,Linux 192.168.1.49 bilgisayarına gönderilmesi gerektiğini anlar(Linux kimlerin hangi paketi gönderdiğini hatırlamaktadır ve internet ten paket gelince paket kim göndermisse cevabı ona iletir. ) ve paketi tekrar oluşturarak 192.168.1.49 bilgisayarına iletir.     Anlaşılacağı üzre MASQUERADING
     olmasa idi gerçek IP ye sahip olmayan bilgisayarların internet e bağlanması
    mümkün değildi.  IPchains komutlarını vermeden önce bir firewall yaptırımlarını belirleyerek nelere izin verilip nelere izin verilmeyeceğini belirleyelim. 1- Yerel Ağdan Internete: - İnternete sınırsız erişime izin verilecek. 2- Yerel Ağdan Sunucu Bölgesine (Server zone):  - WWW sunucusunda çalışan HTTP(80 .port) ve
    HTTPS (443. port)  TELNET(23) FTP (20 , 21) servislerine erişimi  3-Internet ten Yerel Ağ erişim.  4-Internet ten Sunucu Bölgesine, Sunucudan İnternete:  - WWW sunucusudaki HTTP(80) ve HTTPS(433)
    servislere giriş ve  çılış erişimi  5-Sunucu Bölgesinen Yerel Ağa - Sadece Yerel Ağın sunucu bölgesine gönderdiği paketlere
    gelen cevap paketler kabul edilecektir.  Evet bu şekilde bir firewall uygulaması  yapılacaktır.
    (Evet biliyorum biraz karışık galiba :)) ) şimdi Firewall kurmaya
    başlayabiliriz..  | ||
| Firewall Kurulumu | ||
| İlk olarak  linux e forward ozelliği verilmesi
    lazım bunun için  Redhat 6.2 kullanıyorsanız  /etc/syscl.conf  ya da, RedHat 7.0 kullaniyorsaniz: #sysctl -w net.ipv4.ip_forward = 1 Diğer Linux çeşitlerinde # echo 1 > /proc/sys/net/ipv4/ip_forward 
    komutu verin  bu komutun açılışta  aktif olması için  Buradan sonraki tüm yazınlanları bir dosyaya
    yazalım çünkü Linux reboot edildiğinde tüm firewall kuralları silinecektir. Bu
    yüzden reboot edildikten sonra kurallarımızı dosyadan tekrar çalıştırabiliriz.
     www=212.2.2.2    # web sunucusu IP  # önce ,daha önceki tüm kuralları silelim  # tüm işlemleri yasaklayalım ipchains -P input DENY  # firewall sunucusun kendisinden gelip kendisinden paketlere izin
    vereelim  # internet te bağlı arayüzden sanki bizim loopback ip sinden gelmiş gibi görünen paketleri engelleyelim ve -l parametresi ile böyle bir paket geldiginde log dosyasına yazmasına belirtelim. ipchains -A input -i $EXTERNAL_INT -s $LOOPBACK -j DENY -l  # Yerel ağın internet bağlantısı için MASQUARING i aktif
    edelim  # simdi web sunucusuna gelen ve sunucudan gelen pakerler 
    için kuralllar (rules) yazalım.  #Internetten(ppp0) Web sunucununa(eth0) HTTPD (80) erişimi  # internet arayüzünden(ppp0 ) gelen paketin ,sunucular
    tarafına giden arayüzüne (eth1) yönlendirilmesi  ( forward) kabul ediliyor  # yuakarıda firewallın sunucu arayüzüne gelen paket ,artık
    sunucu arayüzünden çıkıp web sunucusuna gidecektir. Bu durumda bu paket firewall un
    internet arayüzü için (ppp0) bir input ,Sunucu arayüzü için (eth0) bir output
    kuralıdır(Çükü paket eth0 dan ÇIKIYOR bu yüzden output dur.).  #Şimdide Web sunucusuna yukarıdaki gibi gelen paket lerin çıkışına izin verelim. #Web sunucusundan (eth0) Internete (ppp0) HTTPD (80) Cevabı
    (Reply)  # paketin internet  arayüzüne yönlendirilmesini kabul
    et.!  # paketin internet arayüzünden çıkıp ,internet gitmesine
    izin ver.  # Durup dururken hiç bir web sunucusu kendisine paket gelmeden
    hiç bir yere cevap vermez. Önce bir istek gelmesi lazım ve sunucunun da bu isteğe
    cevap vermesi ## lazım , Sadece iki yönlü paket geçisine izin vermek için ! -y
    parametresi verilir. Bu parametre sadece TCP paketleri için geçerlidir.  # Yukarıdaki aynı  mantık HTPPSD (SSL ) içinde
    geçerlidir.  ipchains -A input -i  $EXTERNAL_INT -p tcp -d $www 443 -j
    ACCEPT  #Web sunucusundan (eth0) Internete (ppp0) HTTPSD (443) Cevabı (Reply) ipchains -A input -i $SERVER_INT -p tcp -s $www 443  ! -y
    -j ACCEPT  #SMTP SUNUCU # yine aynı  kurallar MAIL sunucusu içinde geçerlidir.
    burada -y parametresi söz konusu değil Çünkü mail sunucusunun kendisi dışarıdan
    istek gelmeden paket gönderir. (Eh yoksa mailler nasıl gider :) )  ipchains -A input -i $EXTERNAL_INT -p tcp -d $smtp 25 -j ACCEPT
     #SMTP sunucusundan (eth0) Internete (eth2) SMTP (25) Cevabı (Reply) ipchains -A input -i $SERVER_INT -p tcp -s $smtp
    25    -j ACCEPT  # sunucu kısmında en son olarak dns sunucusunu alalım.
    Yukarıdakilerden pek farkı ama  domain(dns) UDP  paketini kullanır.  ipchains -A input -i  $EXTERNAL_INT -p udp -d $dns 53 -j
    ACCEPT  #DNS sunucusundan (eth0) Internete (ppp0) DOMAIN (53) Cevabı (Reply) TCP UDP ipchains -A input -i $SERVER_INT -p udp -s $dns 53  -j
    ACCEPT  $ICMP PAKETLERİNE İZİN VERELİM  # icmp Paketlerinin çıkışına izin veriyoruz  # traceroute genellikle  Kaynak(source) olarak
    32769:65535  hedef (destination) olarak 33434:33523  -    # Dışarıya Traceroute izin verelim.  #Şimdi de yerel ağı internete çıkaralım  # Local (eth1) to INTERNET (eth2 ) # Yerel ağdan gelen tüm tcp paketlerini kabul et.  # ve firewallun 61000 ile 65096 arasındaki tüm portlardan
    çıkan paketleri kabul et.!  # Evet bu portlarda neyin nesi diyenler olabilir :) .
    Açıklayayım MASQUARING yapılan tüm paketler (yani yerel ağdan gelen paketler).
    internet te çıkmadan önce firewall sunucusunda   yukarıdaki port
    aralığında herhangi bir porttan tekrar oluşturulur. ve bu portlar aralığından giden
    paketler  yine bu port aralığından firewalla gelir.  # INTERNET ( eth2) to Local (eth1)  # İnternetten Firewallın  MASQ arin port
    aralığına   gelen paketleri kabul et.  # ve Firewallın internet arayüzünden gelip yerel ağ
    arayüzüden çıkan paketleri kabul et.  # YEREL AĞDAN SUNUCU BÖLGESİNE GEÇİŞ. ## WWW sunucusuna firewall ın MASQUARING portlarından gelen
    paketlerin,  # httpd izni  # https izni  # telnet izni  # ftp izinleri  # Yerel ağın  Mail sunucusuna erişim izinleri (mail , pop3
    telnet ftp)  # yerel ağdan dns sunucusuna erişim (domain , telnet, ftp izinleri) ipchains -A output -i  $SERVER_INT -s $fwhost 
    61000:65096 -d $dns 53    -j ACCEPT  --------------- DOSYAMIZ BURADA SONA ERDİ------------------------------------------------ evet bunları firewall.sh dosyasına yazdığımız kabul edelim.
    ve bu kuralları istediğimiz zaman çalıştırıp durdurmak için bir script (betik)
    yazalım.  ----------------DOSYA BAŞLANGIÇ-------------- #!/bin/sh  case "$1" in         start)  exit 0 --------DOSYA BİTİŞ-------------------------------- bu komutların açılışta aktif olması için ilk önce  Artık Firewallımız hazırdır.  Kolay gelsın.!  Eğer bu komutları yazmak bayagı zor geliyor ise sizin için firewall kuralları üreten bazı yardımcı programlar var 
 
 | ||
| Kaynaklar | ||
| 
 
 | ||
| (c) 2001 Enderunix Software Development Team |