Genel
Önceki Linux IPCHAINS NASIL Sonraki
Genel
Genel Olarak Ipchains
Ipchains'de öntanımlı gelen veya kullanıcının tanımlayabileceği kural kümeleri (chain - burada küme diye bahsedilecek) sorgulamaları yürütür. Bu kümeler gelen paketleri sorgular ve tanımlara uyan paketleri yakalarlar. Öntanımlı olarak gelen 3 adet küme vardır:
input
Makinanıza gelen paketler için geçerlidir. Bunun içine makinanın kendi haberleşmesi de dahildir.
output
Makinanızdan çıkan paketler için.
forward
Makinanız maskeleme yapıyorsa.
Bunlar haricinde kullanıcılar kendi kümelerini tanımlayabilirler veya öntanımlı kümeleri kullanabilirler. Bu komut eth0-in adlı bir küme oluşturur:
# ipchains -N eth0-in
ipchains komutuyla kullanılabilecek parametreleri 3 kısma ayırabiliriz:
  • [-p|-s|-d ...] gibi sorguları düzenleyen parametreler.
  • [-N|-D|-X ...] gibi kümeler zerinde işlem yapan parametreler.
  • [--version] [-help] ... genel işlemler yapan parametreler.
Kural Koşul Tanımlamaları
Gelen / gönderilen / yönlendirilen her paket için kümeler ve kümeler altında gruplanmış kurallar olduğunu belirtmiştik. Her paket durumuna göre bu kurallarla karşılaştrılıyor ve yakalanırsa (kurallara uyarsa) belirtilen yaptırımlar paket üzerinde uygulanıyordu. Yani ben istersem 155.223.3.202 adresinin 21. portundan benim Linux makinemdeki 1025. geçici (ephemeral karşılığı olarak) porta gelen ftp isteğini reddedebilirim / kabul edebilirim / yerel herhangi başka bir porta yönlendirebilirim.
Şimdi paketi kabul etmeyen bir ipchains satırını inceleyelim:
# ipchains -A input -p tcp -s 155.223.3.202/32 -d 155.223.64.10/32 -j REJECT
            |        |      |               |   |              |   | |
            +---+    +--+   +-----------+   |   +----------+   |   | +-----+
            |   |    |  |   |           |   |   |          |   |   | |     |
              1        2          3         4          5       6   7    8
  1. Burada input kümesi içinde (bu küme öntanımlı bir kümedir kullanıcının herhangi bir küme tanımı yapmasına gerek yoktur) kuralın nereye yerleştirileceği belirtilir.
    -A, kural kümenin sonuna eklenecek demektir. Çoğu durumda kuralların diziliş sırası önemlidir.
  2. Hangi protokol için bu testin yapılacağı belirlenir. Burada protokol tcp seçilmiştir.
  3. Kaynak makinanın adresidir. Bu adres bir ip olacağı gibi bir alan adı da olabilir.
  4. Adresin ağ maskesidir. Buradaki sayı 255.255.255.255 olan maskeyi ifade eder. 255.255.255.255 için soldan itibaren aralıksız bit sayısı = 32.
  5. Paket için hedef makina tanımı; 3'deki gibidir.
  6. Hedef makinanın ağ maskesi.
  7. Şu ana kadar olan kısımlar paketin test edileceği şartlardı. Eğer paket bu koşullara uyan paketse yani aranılan paketse bu pakete ne gibi bir yaptırım (policy) uygulanacağı burada belirtilir.
  8. Yakalanan paket kabul edilmeyecektir (ayrıntılı açıklama Yaptırımlar bölümünde bulunabilir).
Yaptırımlar
Yukarıdaki örnekte yakalanan paket reddedildi. Yani paketi gönderen makinaya (155.223.3.202) gelen tcp paketinin reddedildiğini belirten bir ICMP paketi geri gönderildi; başka neler yapılabilirdi?
DENY
Paket öldürülebilir. Yani paketin çıktığı makinaya hiçbir geri bildirim yapılmaz. Bu biraz kabaca görünse de portlarınızı tarayan bir portscan esnasında bu işlemi karşıdaki için daha uzun bir hale getirir. Portlarınizı tarayan bu meraklı her seferinde timeout beklemek zorunda kalır.
REJECT
Paket reddedilir ve geriye bilgisi döner.
ACCEPT
Paket bir işleme tabi tutulmadan yoluna devam eder. Kabul edilir.
MASQ
Eğer makinanız arkada bir kaç sisteme maskeleme hizmeti veriyorsa (masquerade-howto incelenebilir) makinanız ve dolayısıyla ethernet kartlarınız üzerinden o sistemlere ait paketler taşınmalıdır. Bu yaptırım kullanıcı tanımlı kümelerde veya öntanımlı forward kümesinde kullanılabilir. Çekirdekte ise CONFIG_IP_MASQUERADE tanımlanmalıdır.
155.223.3.0/255.255.255.0 ağını elimizdeki bir makina ile maskelediğimizi farzedersek maskeleme ayarları şu şekilde yapılabilirdi:
# ipchains -A forward -p all -s 155.223.3.0/24 -d 0/0 -j MASQ
                         |                               |
                     tcp/udp/icmp                     yaptırım
REDIRECT
Eğer çekirdeğe CONFIG_IP_TRANSPARENT_PROXY desteği verilmiş ise yakalanan paket bir başka YEREL porta yönlendirilebir. Proxy kullanmak için web isteklerini proxy'ye yöneltmek gerekir. Bu durumda yapılmasi gereken ise 80. port isteklerini 8080 porta ve/veya 8081'i 8080'e yönlendirmektir.
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202 80 -j REDIRECT 8080
Port Numaraları
Bu arada port numaralarına da değinmek gerek; port numarası için iki tam sayı ayrılmıştır port_a:port_b biçeminde. Alabileceği değerler -doğal olarak- 0 ile 65536 arasındadır. Belirtilmeyen port max veya min değer alır. Yani:
    1023:         -->   1023 - 65535
    :1023         -->   0    - 1023   portları belirtir.
! parametresi de geçerlidir:
    ! 6000:6010   -->   1..5999 ve 6011..65536 portlar,
    ! 22          -->   22. port hariç tümü manasına gelir.
değer girilmezse tüm portlar ele alınır.
Firewall Kurarken
Daha Neler Yapılabilir?
Güvenlik duvarı kurarken genel olarak izlenen yol belirli bir sınırın altındaki portların tamamını kapatmak ve makinada verilecek servisler gözönüne alınarak sadece gerekli portları açmaktır. Bu şekilde bir ölçüde korunma sağlanır.
Örnek:
# ipchains -F input
# ipchains -F forward
# ipchains -F output
veya
# ipchains -F
ve
# ipchains -P input ACCEPT
# ipchains -P forward ACCEPT
# ipchains -P output ACCEPT
Bu şekilde daha önceden tanımlı olması muhtemel ipchains tanımlarını silmiş olduk. Mutlaka güvenlik duvarı betiğinizin başında bulunması gereklidir. Daha önceden kazara eklenen bir komut veya deneme amaçlı açılan bir port güvenlik duvarı üzerinde önemli delik oluşturabilir. Veya o an sizin dışarıyla olan bağlantınız kesebilir. (output DENY gibi)
Böyle bir yapıyı oluştururken temel olarak tamamen birbirinin tümleyeni olan iki yöntemden biri kullanılabilir:
# ipchains -P input DENY
# ipchains -P forward DENY
# ipchains -P output ACCEPT
Bütün öntanımlı kümeler için ana yaptırımları tanımladık. Burası paket kurallardan geçip yakalanmadığında uygulanır. Yani şu anda elimizdeki giriş portları kapalı durumda.Kullanacağımız her portu açmamız gerekli.
VEYA
# ipchains -P input ACCEPT
# ipchains -P forward ACCEPT
# ipchains -P output ACCEPT
Şeklinde tanımlar yapıp belli portları kapatmak ve istemediğimiz bağlantıları yakalamak gereklidir. Kolayca anlaşılacağı gibi ikinci yol yakalanmayan paketleri kabul eder yani gözümüzden kaçan bir durum olduğunda port açık kalır. Özellikle ipfwadm'den kalma bir alışkanlıkla tanımlayacağınız tablolar bu şekilde olabilir. AMA birinci yöntem her durumda ikinciden daha emindir.
Eğer gözümüzden kaçan bir durum varsa; hiç önemli değil; kabul edilmeyecektir. Tabii ki bu bahisler çıkış kümesi olan output için geçerli değildir.Yapının bu şekilde kurulması daha zor görünse de güvenlik duvarı bir defa ayağa kalktıktan sonra da bir zorluk çıkmaz.
Şu durumda bütün öntanımlı yaptırımları DENY kabul ediyoruz. Daha önce bahsettiğimiz üzere REJECT kullanmadık. Elimizde dışarıdan hiçbir bağlantı kabul etmeyen ve hiçbir bağlantı yönlendirmeyen (forward) bir güvenlik duvarı var. Output için de özel ve çok geçerli bir sebep olmadıkça ACCEPT kullanmak mantıklı olacaktır. Aksi takdirde çoğu durumda kendimizi hapsetmiş oluruz.
Hangi Portlar?
Makinanın (sunucu) ne tür hizmetler vereceğini saptamamız ve bu hizmetler için hangi portlara ihtiyaç duyacağımızı belirlememiz gerekir. Bunun için elimizde hazır olan kaynakları kullanabiliriz. /etc/services dosyası bize yeterli bilgiyi verecektir. Örnek olarak ftp hizmeti verebilmek için hangi portlara ihtiyacımız olduğunu saptayalım:
# cat /etc/services | grep ftp

  ftp-data    20 tcp
  ftp         21 tcp
Anlaşıldığı üzere ftp için 20. port ve 21. portların açılması gerekli. Bu portları sadece tcp protokolü için açmamız yeterli olacaktır.
Böylece kullanılmayan udp protokolü için bir boş port bırakmamış oluruz.
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202/32  20 -j ACCEPT
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202/32  21 -j ACCEPT
ya da
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202/32  20:21 -j ACCEPT
komutları input kümemize herhangi bir yerden tcp ile (doğal olarak) 20 ve 21. portlara istek gelirse bu isteği yakala ve kabul et manasına gelen satırı ekler .(-A = küme sonuna ekle; append; bkz. Kümeler)
Eğer e-posta alışverişini sağlamak istersek:
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202/32 25 -j ACCEPT
ssh için:
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202/32 22 -j ACCEPT
# ipchains -A input -p udp -s 0/0 -d 155.223.3.202/32 22 -j ACCEPT
Dikkat edilirse ssh icin 22. port hem tcp hem de udp olarak açıldı.
Özel olarak bildiğimiz bir makinadan telnet kabul edelim:
# ipchains -A input -p udp -s 10.1.10.3/32 23 -d 155.223.3.202/32 23 -j ACCEPT
Bizim de aynı şekilde çıkmamız gerekirse (şu durumda gerekmiyor çünkü output yaptırımı accept) şu satırı da eklememiz gerekir.
# ipchains -A input -p udp -d 155.223.3.202/32 23 -d 10.1.10.3/32 23 -j ACCEPT
Bunun kısa yolu ise yukarıdaki komutlardan birini -b parametresiyle kullanmaktır. (-b: [b]idirectional - iki yönlü kip).
Benzer şekilde web, domain, vb. portlar da ihtiyaca göre açıldıktan sonra rahatlayabiliriz. Tabii ki bu onlarca komutu her sistem açılışında da yazmak işkence olur kaldı ki çoğu zaman acil olarak güvenlik duvarının devreden çıkması gerekebilir. Bir -F komutu sonrası kuralların tamamı (genel yaptırımlar hariç) iptal edilir. Bu sebeple yaptığımız bu ayarları yani oluşturduğumuz kural kümelerini saklamalıyız. Bunu bir betik yardımıyla da yapabiliriz. Ama ipchains komutunun bu işi görebilecek işlevleri olduğunu bilmek de yararlı olur.
Betik Üzerinden Çalıştırma
Burada vereceğim basit bir betik size bu konuda yardımcı olabilir. Bu betik /etc/firewall.conf/ adlı tanım dosyanızdaki komutları işletir.
Gerekirse de -F (flush) ile iptal eder istenirse yeniden çalıştırır:
#!/bin/bash
#ipchains yükleme betiğidir
#/etc/firewall.conf dosyasını okur

set -e

case "$1" in

        start)
        echo "Güvenlik Duvarı çalıştırılıyor..."
        /etc/firewall.conf
        echo "TAMAM"
        ;;
        stop)
        echo "Güvenlik Duvarı durduruluyor..."
        /sbin/ipchains -F
        /sbin/ipchains -P input ACCEPT
        /sbin/ipchains -P forward ACCEPT
        /sbin/ipchains -P output ACCEPT
        echo "TAMAM"
        ;;
        restart)
        echo "Güvenlik Duvarı yeniden çalıştırılıyor..."
        /sbin/ipchains -F
        /sbin/ipchains -P input ACCEPT
        /sbin/ipchains -P forward ACCEPT
        /sbin/ipchains -P output ACCEPT
        /bin/sleep 1
        /etc/firewall.conf
        echo "TAMAM"
        ;;
        * )
        echo "Kullanımı : $N {start|stop|restart}" >&2
        exit 1
        ;;
esac

exit 0
Güvenlik Duvarı Çatısını Kurmak
firewall.conf dosyasını oluşturmak içinse 2 yolunuz var:
  1. Yazdığınız komutları bir metin düzenleyici (pico, emacs) ile /etc/firewall.conf dosyasına ekleyebilirsiniz.
  2. Tüm komutlar bellekteyken
    # ipchains-save > firewall.conf
    
    komutu ile dosyaya eklenir. Parametresiz girilen komut bütün kümeleri ekler; istenirse
    # ipchains [küme ismi] > firewall.conf
    
    ile istenilen küme yazılabilir.
    Sonra
    # ipchains-restore < firewall.conf
    
    ile yeniden yüklenebilir. Burada bellekte halihazırda kullanımda olan ipchains kümeleri varsa bunları silmek için sizden onay bekler. Eğer -f parametresini de eklerseniz bu uyarıyı almazsınız.
Önceki Üst Ana Başlık Sonraki
Nedir? Başlangıç Uzman
Bir Linux Kitaplığı Sayfası