Uzman
Önceki Linux IPCHAINS NASIL Sonraki
Uzman
Buraya kadar ipchains ile basitce bir güvenlik duvarı nasıl kurulur anlatıldı. Bu aşamadan sonra ise duyarlı ve daha güvenilir güvenlik duvarı kurulumu ve ipchains komutunun daha ayrıntılı kullanımı anlatılacaktır.
Taklit Etme (spoofing)
ipchains -i [arabirim] Bu parametre ile paketin makinaya hangi arabirim aracılığıyla geldiğini kontrol edebiliriz. lo ,eth*, ppp* bu arabirimlerden biri olabilir. Bu şekilde beklemediğimiz yerden gelen paketleri de kontrol edebiliriz. İki ethernet kartı aracılığıyla arkada bir ağı maskeleme ile internete çıkarıyor olabiliriz. Ve sadece arkadaki ağ üzerinden gelen paketleri maskelemek için sadece IP kontrolu yetmeyebilir. Arabirim kontrolü ile ip-taklidini önüne bir ölçüde geçilebilir. Örneklersek:
10.1.10.x ağına eth1 aracılığıyla maskeleme yaptığımızı düşünürsek maskeleme tanımında arabirim belirtmek; kendini bu adrestenmiş gibi gösteren birinin; bu ağa tanıdığımız haklardan yararlanmasını engelleyecektir.
# ipchains -A forward -s 10.1.10.0/24 -d 0/0 -i eth1 -j MA
                                             ^^^^^^^
# ipchains -A forward -s 10.1.10.0/24 -d 0/0 -i eth+ -j MASQ
                                                 ^
    eth+ = eth1 eth2 .....
    ppp+ = ppp1 ppp2 .....
şeklinde de olabilir.
IP taklidinin engellenmesi için daha başka yollar da vardır. Güvenlik duvarı genelde bu işi tam karşılamaz. Mesela çekirdek 2.1 den sonrası ip'si 127.x.x.x gibi davranan paketleri kabul etmez. Benzer şekilde çekirdekten kaynak adres kontrolü (Source Adres Verification) özelliği kullanılabilir.
/proc/sys/net/ipv4/conf/all/rp-filter'a değer yüklenebilir.
# echo "1" > /proc/sys/net/ipv4/conf/all/rp-filter
Daha geniş bilgi için Çekirdek-NASIL incelenebilir.
Paketlerin Bölünmesi
Paketler, kullanılan araçların bir defada açabileceği boyutlarda taşınırlar. MTU ile belirtilen (Maximum Transmission Unit) belli boyutlara uyulmak zorunludur. Mesala FDDI bir ağ 4000 baytlık paketler gönderebilirken buraya bağlı olan bir ethernet ağ ise ancak 1518 bayt olarak bu paketleri alabilir. Bu durumda büyük gelen paket bölünür (fragmentation). Bölünen paketler Fragment Header denilen bir başlık ile tanınırlar. Böyle bir paketin sadece ilk parçası ipchains tarafından kontrole tabi tutulabilir. Diğer paketler kontrole tabi tutulamazlar. Pek önemli görülmese de bu durumun da gözönünde tutulması kimseye bir şey kaybettirmez.
ipchains içinde bu durumu engellemek için -f parametresi kullanılabilir. Yalnız bu durumda bölünmüş olan paketin iki ve daha sonraki alt paketleri anlaşılabilir. Port adresi ise okunamaz. Bu sebeple de bu parametre ile port numarası kullanılmaz.
Özellikle ICMP paketleri kullanan exploitler için iyi bir savunma mekanizması oluşturulabilir. ICMP paketleri bölünmeyecek kadar küçük paketlerdir. (ayrıca bölünmeyi üzerlerindeki don't fragment biti de engeller). Yani bölünmüş bu tür paketleri reddetmek yararınızadır.
# ipchains -A -t icmp input -s x.x.x.x/x -d y.y.y.y/y -f -j DENY
                 ^^^^                                 ^^^
Paket Sayımı
Her bir paket yakalandığında; paketle alakalı çekirdek tarafından kontrol edilen iki sayaca işlenir. Birinci sayaç her yakalanan pakette 1 diğeri ise paket boyutu kadar artar. Paketin sayaçlarının artışı için ille de pakete bir yaptırım uygulanmış olması gerekmez. Yakalanması yeter şarttır.
# ipchains -A output -p tcp -s 155.223.3.202/32 6667 -d 0/0
komutu ile makinanızdan genelde irc için kullanılan 6667. port üzerinden kaç defa paket yollanmış ve toplam ne kadar veri akmış öğrenebilirsiniz.
Sayım sonuçlarını -L [küme] -v ile görebilirsiniz.
# ipchains -L output -v
Eğer istenirse yakalanan paketlerin bir disk sahasına depolanması da mümkündür. -o [max boyut] parametresi ile kullanılır.
Gelen Paketlerin Yapısına Müdahale
Ipchains yakalanan paketlerin üzerinde belirli işlemler yapabilmenizi sağlar. Paketi işaretleyebilir; TOS (types of service) bilgisini değiştirebilir; hangi tür paketin ne kadar yakalandığıni ve ne kadarlık bilgi aktığını anlayabilirsiniz.
Eğer isterseniz de gelen paketleri işaretleyebilirsiniz. Gelen paketler 32bit işaretsiz bir sayı ile işaretlenebilir. Hatta birden çok defa işaretlenebilir. Hiç işaretlenmemiş bir paketin işaret değeri 0 dır. Paket her işaretlendiğinde tanımlanan 32 bit sayı kadar artırılır ve azaltılır.
Eğer kernel hacking konusunda meraklı iseniz başka NASILlar öneririm.
-m +-[32 bit sayı] biçemindedir.
Paketin TOS (Types Of Services) Kısmının Kontrolü
Gelen paket içinde bulunan TOS istenirse iki onaltılık 8 bit sayı ile AND'lenip sonuç ikinci değer ile XOR'lanır.
Örnek olarak ftp'de minimum delay ve maximum throughput sağlanmalıdır.
Çünkü karşıdaki kullanıcı komutları girecek (minimum delay burada) ve dosya aktarımı yapacaktır (dosya aktarımı için ise maximum throughput).
Bunları sağlamak için de TCP paketlerinin başında bulunan 4 bit ile oynanabilir. Ve bir defada sadece biri 1 konumuna getirilebilir.
Bazı servisler için tavsiye edilen TOS değerleri:
|---------------------------------------------------------------------------|
|Servis            Minimize    Maximize    Maximize    Minimize   Hex Value |
|                    delay    throughput  reliability    cost               |
|---------------------------------------------------------------------------|
|Telnet/Rlogin        1     |      0     |     0      |    0     |   0x10   |
|FTP                        |            |            |          |          |
|  control            1     |      0     |     0      |    0     |   0x10   |
|  data               0     |      1     |     0      |    0     |   0x08   |
|any bulk data        0     |      1     |     0      |    0     |   0x08   |
|TFTP                 1     |      0     |     0      |    0     |   0x10   |
|SMTP                       |            |            |          |          |
|  command phrase     1     |      0     |     0      |    0     |   0x10   |
|  data phrase        0     |      1     |     0      |    0     |   0x18   |
|DNS                        |            |            |          |          |
|  UDP Query          1     |      0     |     0      |    0     |   0x10   |
|  TCP Query          0     |      0     |     0      |    0     |   0x00   |
|  zone transfer      0     |      1     |     0      |    0     |   0x08   |
|ICMP                       |            |            |          |          |
|  error              0     |      0     |     0      |    0     |   0x00   |
|  query              0     |      0     |     0      |    0     |   0x00   |
|  any IGP            0     |      0     |     1      |    0     |   0x04   |
|SNMP                 0     |      0     |     1      |    0     |   0x04   |
|BOOTP                0     |      0     |     0      |    0     |   0x00   |
|NNTP                 0     |      0     |     0      |    1     |   0x02   |
|---------------------------------------------------------------------------|

Bu değerler tavsiye edilen değerlerdir. (R.Stevens,TCP/IP,1998)
TCP Bağlantı İsteklerinin Engellenmesi
Bilindiği üzere TCP protokol olarak çok kullanılmaktadır. ftp, telnet vs. TCP paketleri ile yapılacak olan veri aktarımlarında ise TCP'nin üç-koşullu-onaylama (three way hanshaking) olarak adlandırılan yöntemi kullanılır.
Yöntem bir bağlantı isteği (active open olarak geçer) ile işlemeye başlar.
İstemci makina sunucuya SYN (syncronise) sayısı içeren bir paket gönderdiğinde sunucu buna SYN ve ACK (acknowledgement) ile cevap verir.
Üçüncü adım olarak da istemciden sadece bir ACK geri döner (passive open).
Daha fazla ayrıntısına girmeyeceğim bu iletişim bir TCP bağlantısı başlatır. Biz eğer makinamıza giren TCP isteklerini kontrol etmek istersek (bu sekilde TCP kullanan tüm servisler kontrol edilir; ftp, telnet, ssh, finger www vs.) ipchains'in -y parametresi yardımımıza koşar.
Bu parametre ile içinde SYN biti 1 olan ve aynı zamanda ACK ve FIN bitleri 1'e eşit olan (SYN=1 && ACK=0 && FIN=0 durumu) paketler yakalanabilir.
Parametrenin ! (tersi) seçeneği de vardır. (bit durumlarının tersi değil koşul sağlanmasının tersi). Ve de doğal olarak sadece TCP protokolü için kullanılır.
# ipchains -A input -p tcp -s 0/0 -d 155.223.3.202/32 -y -j DENY
Komutu ile makinaya gelen tüm SYN_REQ'ler kabul edilmemiş olur. Böylece dışardan hiçbir şekilde makinaya TCP bağlantısı yapılamaz.
Ve de bizim dışarıya TCP bağlantısı isteklerimiz de bundan etkilenmez. (çünkü bizim başlattığımız TCP'lerde de bu bitler kullanılır ne kadar sadece output kümesini ilgilendiriyor görünse de TCP'nin çift taraflı özelliğinden ötürü input kümesi de olaya girer. Ama belirttiğimiz gibi -y parametresi bizim başlattığımız TCP bağlantılarını görmez).
Önceki Üst Ana Başlık Sonraki
Genel Başlangıç Kümeler
Bir Linux Kitaplığı Sayfası