IPTables u32 Modülü Kullanımı
Giriş
IPTables genişletilebilir ve modüler bir güvenlik duvarı yazılımıdır. Eğer bir pakette sizin istediğiniz özelliği test edemiyorsa kendiniz bir test yazabilir ya da varolan testleri düzenleyebilirsiniz. Önemli nokta şu ki -çoğu özgür yazılımda olduğu gibi- hepimiz programcı değiliz ve yazılımın kodlarına müdahale etme ya da yeni modüller yazma şansımız yok.
Bu yüzden programlama gerektirmeyen bir seçeneğimiz var. Don Cohen, paketlerden istediğimiz bayt'ları çekip alabileceğimiz, bir takım düzenlemeler yapabileceğimiz, sonucun belli bir aralıkta olup olmadığını kontrol edebileceğimiz bir IPTables modülü geliştirmiş. Örneğin, IP başlığından "Fragmentation" bilgisini alabilir, "More Fragments" bayrağı dışındaki tüm bilgileri atabilir ve bu bayrağın tanımlanıp tanımlanmadığını test edebiliriz.
Hem de hiç C kodu yazmadan. :-)
Burada temel mantığı anlatmaya çalışacağım ve umarım açıklayıcı olacak bir takım örnekler vererek sizin de kendi testlerinizi yazabilmenize imkan tanıyacağım.
Burada IP başlığındaki alanların neler olduğunu ya da onları neden test etmeniz gerektiğine değinmeyeceğim. Zaten bu konuları anlatan kaynaklar mevcut. Eğer bu konuları anlatan basit bir kaynağa ihtiyacınız varsa tcpip.pdf dosyasına bakabilirsiniz.
Bu belgedeki bütün konum bilgilerinde başlığın ilk bayt'ı 0 olarak alınmıştır. Yani, IP başlığında, bayt "0" 4 bit "Version" ve 4 bit "IP Header Length", bayt "1" "TOS" alanını tutar.
2 Byte'lık bir değeri test etmek
En basit şekliyle, u32 başlangıç değerinden itibaren 4 bayt'lık alandaki veriyi alır, belirttiğimiz Mask'ı bu veriye uygular ve sonucu belirttiğimiz aralıkla karşılaştırır. İlk örneklerimizde kullanacağımız dizilim şu şekildedir:
iptables -m u32 --u32 "Başlangıç&Mask=Aralık"
Genellikle "Başlangıç" değerini erişmek istediğimiz son bayt'tan 3 öncesi olarak tanımlıyoruz. Yani eğer IP başlığının 4. ve 5. bayt'larına (IP ID Field) bakmak istiyorsak "Başlangıç" değeri 5-3=2 olmalı. “Mask”, istemediğiniz değerleri silecek, 0xFFFFFFFF değerine kadar bir bitmask olmalıdır. Hedeflediğimiz 4. ve 5. bayt'ları alabilmek için 2. ve 3. bayt'ları sıfırlamalıyız. Bu durumda kullacağımız mask değeri 0x0000FFFF olacaktır. Ama bunu kısaltıp buna eşdeğer olan 0xFFFF değerini de kullanabiliriz.
Bu bilgilere göre IPID değerinin 2 ile 256 arasında olup olmadığını test edecek iptables komutu şöyledir.
iptables -m u32 --u32 "2&0xFFFF=0x2:0x0100"
Bu komutu soldan sağa okumak gerekirse: "u32 modülünü yükle ve takip eden u32 filtresini bu pakete uygula. 2. bayt'tan başlayarak 4 bayt al (2. ve 3. bayt'lar Total Length field, 4. ve 5. bayt'lar IPID), 0x0000FFFF maskesini uygula (ilk iki bayt'ı 0 olarak değiştir son iki bayt'ı olduğu gibi bırak) ve değerin -IPID- 2 ile 256 arasında olup olmadığını bak. Eğer öyleyse true, değilse false döndür.
Normalde iptables'da IPID testi mümkün değil fakat bu yöntemle tcpdump/bpf filtrelerinde "ip[2:2] >= 2 and ip[2:2] <= 256" tanımına eşdeğer işi yapabiliyoruz.
Örnekte herhangi bir eylem belirtmedik ama ihtiyacınıza göre
-j LOG --log-prefix "ID-in-2-256 "
-j DROP
gibi eylemleri komuta ekleyebiliriz.
Aşağıdaki komut ile de toplam paket uzunluğu 256'ya eşit ya da daha büyük olan paketleri yakalayabiliriz. IP başlığında Total length field 2. ve 3. bayt'lardır bu yüzden başlangıç noktamız 3-3=0. Biz yine 2 bayt'lık bir alana bakacağımız için maske olarak 0xFFFF kullanacağız. Böylece ortaya çıkan komut:
iptables -m u32 --u32 "0&0xFFFF=0x100:0xFFFF"
Bu komut aşağıdaki komutlara denktir.
iptables -m length --length 256:65535
veya
bpf filtresinde "len >= 256"
1 Byte'lık bir değeri kontrol etmek
1 bayt'lık alanı kontrol etmek de neredeyse önceki başlıkta olduğunun aynı. Yalnız bu sefer tek bir bayt'a ulaşmak istediğimizden 3 bayt'ı sıfırlamak için maske olarak 0x000000FF değerini kullanacağız. (veya 0xFF olarak kısaltabiliriz.) Traceroute yapan kullanıcıların paketlerini tespit etmek için TTL değeri 3'ün altında olan paketleri yakalamak istediğimizi düşünelim. Bu iş elbeteki ttl modülü ile yapılabilir ama biz u32 ile nasıl yapılacağına bakalım.
8. bayt'a ulaşmak istiyoruz. Bu durumda başlangıç değerimiz 8-3=5. Test komutumuz da:
iptables -m u32 --u32 "5&0xFF=0:3"
Bu komutun eşdeğeri komutlar:
"iptables -m ttl --ttl-lt 4"
veya bpf filtresinde
"ip[8] <= 3"
4 bayt'lık bir alanı kontrol etme
Hedef IP adresin tamamını kontrol etmek için 16.-19. bayt'lar arasına bakacağız. 4 bayt'lık bir alana bakacağımızdan maske kullanmamıza gerek yok. Hedef adresi 224.0.0.1 paketi yakalamak için kullanacağımız komut:
iptables -m u32 --u32 "16=0xE00000001"
Bu komutun eşdeğeri komut:
iptables -d 224.0.0.1/32
Eğer sadece ilk 3 byta'a bakmak istesersek (kaynak adresin C sınıfı bir ağ olup olmadığını test etmek için) yine maske kullanmamız gerekecekti. Kullanacağımız maske de son bayt'ı sıfırlamak için 0xFFFFFF00 olacaktı. Şimdi kaynak adresin (12.-15. bayt'lar arasını alacağız ama 15. bayt'ı sıfırlayacağız) C sınıfı bir ağ 192.168.15.0 (0xC0A80F00) olup olmadığına bakalım:
iptables -m u32 --u32 "12&0xFFFFFF00=0xC0A80F00"
Bu komutun eşdeğeri komut:
iptables -s 192.168.15.0/24
Başlığın başındaki bayt'ları kontrol etme
Eğer TOS alanını kontrol etmek istiyorsak (IP başlığının 1. bayt'ı) elbette 1-3=-2 bayt'dan başlayamayız. Bunun yerine 0. bayt'dan başlayıp istediğimiz bayt'ı çekmemiz, sonrasında da daha kolay test edebilmek için bu değeri en son konuma getirmemiz gerekiyor. Bu yöntem bunu yapmanın tek yolu değil ama bize lazım olacak bir tekniği de bu şekilde göstermiş olacağım.
TOS alanını çekmek için öncelikle u32'ye bize 0-3 arasındaki bayt'ları vermesini söylüyorum. Daha sonra 0x00FF0000 maskesi ile istediğim bayt'ı (1. bayt'ı) alıyorum. Şimdi daha kolay karşılaştırma yapabilmek için bu değeri en sağa kaydırmam gerekiyor. Bu tekniğe, pek şaşırtıcı olmasa gerek, "sağa kaydırma" deniyor. Sağa kaydırma ">>" işareti ve hemen ardından verinin kaç bit sağa kaydırılacağı belirtilerek yapılıyor. Bu konu hakkında daha detaylı bilgi almak için Harper College'ın bu eğitseline bakabilirsiniz.
TOS alanını kontrol etmek için maskelediğim veriyi 2 bayt -ya da 16 bit- sağa kaydırmak istiyorum. Bunun için ">>16" ifadesini kullanacağım. Böylece değer doğru konuma gelecek ve karşılaştırmamı kolayca yapabileceğim. 0x08 (Maximize Throughput)
iptables -m u32 --u32 "0&0x00FF0000>>16=0x08"
Bu komutun eşdeğeri:
iptables -m ttl --tos 8
Tekil bit'leri incelemek
IPTables ile kontrol edilemeyen "More fragments" bayrağına bakmak istediğimi düşünelim. Bu bilgi başlığın 6. bayt'ında bulunuyor. Bu yüzden başlangıç noktam 6-3=3. bayt olacak ve 3.-5. bayt'ları sıfırlayacağım. Yukarıdaki örneklere bakarak bu durumda maske değeri olarak 0x000000FF kullanabilirdim ama bu sefer son bayt'ta işime yaramayan bit'leri de silmek istiyorum. Ulaşmaya çalıştığım bit en üstten 3. bit (0010 0000). Dolayısı ile bu sefer maske olarak 0x00000020 kullanacağım. Bu noktada iki seçeneğim var. Bu bit'i ya en düşük pozisyona alıp karşılaştırabilirim ya da olduğu pozisyonda karşılaştırmamı yapabilirim.
Bu bit'i en sona, 5 bit sağa kaydıralım ve karşılaştıralım.
iptables -m u32 --u32 "3&0x20>>5=1"
Diğer yöntemi seçip değeri olduğu yerde bırakıp kontrol etmek isteseydim bu sefer bu bit'in sağındaki değerler konusunda dikkatli olmam gerekecekti. Bu durumda karşılaştırma değerim "0x20" olacaktır.
iptables -m u32 --u32 "3&0x20=0x20"
Her iki yöntem de "More Fragment" bayrağı tanımlıysa True döndürecektir.
Testleri birleştirme
Eğer aynı paketin birden fazla özelliğini test etmek istersek her test arasına "&&" işaretlerini koymalıyız.
TCP başlığında hareket etme
Bu yöntem biraz hileli. TCP başlığının 4.-7. bayt'larına (TCP sequence number) baktığımızı düşünelim. Önce basit yolu ardından da bunu geliştirip diğer yolları deneyelim.
İlk yöntemimizde, IP başlığımızın 20 bayt uzunluğunda olduğunu düşünmüştük. -Bu genelde güzel bir tahmindir.- Bu yüzden de TCP başlığının ilk 4 bayt'ına ulaşmak için başlangıç değerini IP başlığının bitiminden hemen sonraki 4. bayt olarak tanımlamıştık. Bu da sıra numarası 41 olan bir paketi test etmek için basitçe şu kurala denk düşmüştü.
iptables -m u32 --u32 "24=0x29"
IP başlığı 20 bayt olan paketler için bu yöntem işleyecektir. Ama bazı sorunlar var. Şimdi bunları sırayla tanımlayıp çözelim.
Birincisi, paketin TCP paketi olup olmadığını hiç kontrol etmedik. Bu bilgi IP başlığının 9. bayt'ında tutuluyor. 6. bayt'dan itibaren 4 bayt alıp 6.-8. bayt'ları sıfırlayıp, bu değerin 6 olup olmadığına bakalım. Yeni kuralımız önce bu paketin tcp paketi olup olmadığına daha sonra da sıra numarasının 41 olup olmadığına bakacak.
iptables -m u32 --u32 "6&0xFF=0x6 && 24=0x29"
İkinci problem IP başlığının uzunluğunu görmezden geldik. Evet genelde IP başlığı 20 bayt uzunluğundadır ama eğer IP options değeri tanımlandıysa daha uzun da olabilir.
Uygulayacağımız adımlar şöyle, IP başlığının uzunluğunu alacağız (başlıktaki bir yarım bayt (nibble) başlıkta kaç tane 4 bayt'lık alan olduğunu gösterir, bu genelde 5'tir.). IP başlığında kaç bayt olduğunu bulmak için bu değeri 4 ile çarpacağız. Daha sonra da TCP başlığına ulaşmak için kaçıncı bayt'tan başlamamız gerektiğine bu sayıya göre karar verip 4 bayt ileri gidip sıra numarasını alacağız.
Başlık uzunluğunu almak için ilk bayt'a ihtiyacımız var: "0>>24", fakat biz bu bayt'ın sadece ilk yarısını alacağız ve bunu 4 ile çarpacağız. Çarpma işlemi için 24 yerine 22 bit sağa kaydıracağız. Bu kaydırmayla daha önce kullandığımız 0x0F maskesi yerine 0x3C maskesini kullanmak durumdayız. Şimdiye kadar ki ifade "0>>22&0x3C" şeklinde. Bu ifade IP options değeri olmayan başlıklarda beklenildiği gibi 20 döndürecektir. Şimdi u32'ye bu rakamı kullanıp, buraya atlamasını söylemeliyiz. Bu adımı da "@" işlemcisi ile gerçekleştireceğiz.
iptables -m u32 --u32 "6&0xFF=0x6 && 0>>22&0x3C@4=0x29"
"@" işlemcisi solundaki bizim oluşturduğumuz rakamı (normalde 20) alıyor ve bu kadar bayt ileri atlıyor. (İlerleyen bölümlerde görebileceğiniz gibi bunu birden fazla da yapabiliriz.) Onun yanındaki 4 u32'ye 4.-7. bayt'ları getirmesini söylüyor tabi u32 20 bayt atladıktan sonraki 4 bayt olduğunu biliyor ve bu da bize IP options tanımlı dahi olsa sıra numarasını veriyor.
Son enteresan konu da bölümlenmiş bilgileri yakalamak. IP başlığı ile çalışırken böyle bir durum yok. İnternet protokolünün tasarımı sebebiyle IP başlığı asla bölümlenemez. Fakat TCP başlığı ya da uygulama yükleri teknik olarak bölümlenebilir ve eğer biz ikinci ya da daha sonraki bir bölümü yakaladıysak sıra numarası için baktığımız 4.-7. bayt'lar TCP başlığının başka bir kısmına muhtemelen bazı uygulama verilerine denk geliyor olabilir.
Şimdi baktığımız paketin ilk bölüm olduğunu (ya da paketin bölümlenmemiş bir paket olduğunu) test edeceğiz ve gerçekten TCP başlığına baktığımıza emin olacağız. Bunu yapmak için, 6. ve 7. bayt'lara yani fragment ofsetine bakacağız ve değerin 0 olduğuna emin olacağız. Testimiz: "4&0x1FFF=0"
Bu adımlardan sonra oluşan komut (TCP olduğunu kontrol et, bölümlenmemiş ya da ilk bölüm olduğunu kontrol et, IP başlığını atla ve TCP başlığının 4.-7. bayt'larının 41 olup olmadığına bak) şu şekilde:
iptables -m u32 --u32 "6&0xFF=0x6 && 4&0x1FFF=0 && 0>>22&0x3C@4=0x29"
Eğer paket bölümlendiyse dikkat edilecek bir konu daha var. Test edeceğimiz alan gelecek paketlerde kalmış ve yakaladığımız paket beklediğimizden küçük olabilir. Fakat bu durum yine de sorun olmayacaktır çünkü her IP başlığı en fazla 60 bayt olsa bile her IP bağlantısı en az 68 bayt tutmalıdır. TCP başlığının ilk 8 bayt'ı ilk bölümde bulunmalıdır.
Bu gibi şeyleri test ederken u32'nin sorduğumuz bir değer paketin dışında kalıyorsa False döndürmesi özelliğinden faydalanacağız.
ICMP başlığındaki değerlerin kontrolü
Şimdi de "ICMP Host Unreachables" paketlerine bakalım. (ICMP, tip 3, kod 1) Yukarıdaki örnekte olduğu gibi, protokol alanına ve bölümlenmemiş ya da en azından ilk bölüm olup olmadığına bakıyoruz. "6&0xFF=1 && 4&0x1FFF=0"
ICMP türünü ve kodunu kontrol etmek için yine IP başlığını atlayacağız ("0>>22&0x3C@..."). İlk iki bayt'ı almak için ofset 0'da başlayacağız ve 16 bit sağa kaydıracağız.
iptables -m u32 --u32 "6&0xFF=1 && 4&0x1FFF=0 && 0>>22&0x3C@0>>16=0x0301"
UDP yüklerindeki değerlerin kontrolü
Şimdi de paket yüklerinin içine girelim ve UDP DNS sorgularına ait paketleri yakalayalım. Burada sadece hedef portu 53 olan paketleri kontrol etmeyeceğiz, aynı zaman yükün 2. bayt'nın en üst bit'ini kontrol edeceğiz. Eğer bu bit tanımlıysa bu bir DNS sorgusudur.
Öncelikle UDP paketini kontrol ederek başlayalım: "6&0xFF=17". Bilindik "ilk bölüm mü?" testini ekleyelim: "4&0x1FFF=0".
Hedef portu kontrol etmek için udp başlığından 2. ve 3. bayt'ı alacağız. (Daha önceki örneklerde olduğu gibi IP başlığını atlayarak.): "0>>22&0x3C@0&0xFFFF=53".
Eğer paket bu testlerin hepsini geçtiyse, bunun bir cevap değil de sorgu olduğunu doğrulamak için yüke geri gideceğiz. 2. bayt'ın en yüksek bit'ini alırken ilk 4 yük bayt'ını almak için ofset 8 kullanacağız ve Query bit'ini en düşük pozisyona almak için 15 bit sağa kaydıracağız sonra da geri kalan bit'leri 0x01 maskesi ile sıfırlayacağız: "0>>22&0x3C@8>>15&0x01=1"
Sonuç olarak testimiz şöyle olacak:
iptables -m u32 --u32 "6&0xFF=17 && 4&0x1FFF=0 && 0>>22&0x3C@0&0xFFFF=53 && 0>>22&0x3C@8>>15&0x01=1"
Tabi hatırlatmak gerekiyor ki paketin "udp" paketi olduğunu, "ilk/bölümlenmemiş paket" olduğunu ve hedef portun "53" olduğunu başka modüllerle de kontrol edebiliriz. Böylece komutumuz daha anlaşılır bir hal alacaktır:
iptables -p udp --dport 53 \! -f -m u32 --u32 "0>>22&0x3C@8>>15&0x01=1"
TCP yüklerindeki değerlerin kontrolü
Yukarıdaki UDP yükü örneğinde olduğu gibi, bu yol sadece ilgilendiğimiz verinin tam olarak nerede olduğunu biliyorsak işe yarayacaktır. Bu örnekte, 22 dışında bir port kullanılıyor olsa dahi ssh oturumunu bulmak istiyorum. Fakat bir saniye, ssh bağlantıları şifrelenmiş! Durum umutsuz mu göründü? Aslında değil.
SSH bağlantısında gerçekleşen ilk olay sunucunun istemciye gönderdiği protokol dizgesidir. Bu dizge şöyle görünür: SSH-protokolsürümü-yazılımsürümü yorumlar
Protokolsürümü genelde 1.99, 2.0 veya 1.5'tir. Tüm satır (muhtemel yenisatır, satırsonu karakterleri dahil) 255 bayt'tan küçük olmalıdır. Bu satırdan önce başka satırlar _olabilir_ fakat bu ssh 1.0 istemcileri için uyumluluğu bozacaktır bu yüzden bunun çok yaygın olmadığını düşünüyorum. Ayrıntılı bilgi için bu bilgileri aldığım yere bakabilirsiniz. draft-ietf-secsh-transport-17.txt
İlgilendiğimiz enteresan nokta bu "SSH-" dizgesi. Bu, bağlantının ilk 4 bayt'ında yer alır. İşte bulduk. Bağlantının ilk aşamasında u32'yi sadece bu bayt'lara bakmak için kullanabiliriz. Bu yöntem string modülü ile bakmaktan daha az yorucu olacaktır ve güvenlik duvarında aşırı yük yaratmadan herhangi bir porttan gelen ssh bağlantılarını daha verimli görmeyi sağlayacaktır.
İşin kolay kısmını hemen halledelim. TCP paketi mi, bölümlenmemiş/ilk bölüm mü, tamamlanmış bağlantı mı, paket uzunluğu 45 ve 375 bayt arasında mı sorularını diğer modüllerle kontrol edelim ve paketin sadece ilk 255 bayt'ını alalım.
iptables -p tcp \! -f -m connbayts --connbayts 0:255 -m state --state ESTABLISHED -m length --length 46:375
Bu sınırlamalarla inceleyeceğimiz paket sayısını oldukça azaltmış olmalıyız, bunlar bize her bağlantının ilk birkaç paketini kontrol etme imkanı tanıyacak.
Şimdi u32'nin sihri. Komutumuzu sıfırdan oluşturacağız. Protokolü zaten kontrol ettiğimiz için "6&0xFF=0x6" kısmını kullanmıyoruz. IP başlığını atlamak için "0>>22&0x3C@" kullanıyoruz.
Şimdi TCP başlığını da atlayacağız. TCP başlığının uzunluğunu ilk 12 bayt'ın yarısından alacağız. 32 bit önbelleğimizin son 4 bit'ini almak için 28 bit sağa kaydırmamız gerekmesine rağmen yine 4 ile çarpmamız gerektiğinden 26 bit sağa kaydırıyoruz. Maske değerimiz yine "0x3C":
0>>22&0x3C@ 12>>26&0x3C@
Bu bizi tcp yükü kısmına getiriyor. Bakacağımız kısım genelde paketin ilk 4 bayt'ı olduğu için 0 dan başlayacağız ve "0x5353482D" değeri ile karşılaştıracağız. ("SSH-" dizgesinin hex değeri):
0>>22&0x3C@ 12>>26&0x3C@ 0=0x5353482D
Komutun tamamını yazalım:
iptables -p tcp \! -f -m connbayts --connbayts 0:255 -m state --state ESTABLISHED -m length --length 46:375 -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0=0x5353482D
Bunu bir kere yaptıktan sonra "-m string --string 'SSH-1.99'" ile belli ssh sürümlerini hatta "-m string --string 'SSH-1.99-OpenSSH_3.7.1p2'" ile ssh/istemci sürümlerini kontrol edebilirim. String modülü normalde çok fazla işlem yükü getirmesine rağmen bu durumda biz zaten ssh paketlerini yakaladığımız için çok kötü bir performans yaratmayacaktır. Ayrıca "SSH-" dizgesinin paketin en başında olduğundan emin olduğumuz için bu belgeyi 80 numaralı porttan indiren biri bu filtreye takılmayacaktır.
Özet
Üzerinde çalıştığımız örnekler oldukça karışıktı. Ama bunun güzel tarafı onları tekrar yazmak için zaman harcamanıza gerek yok. icmp başlığında, tcp yükünde ya da başka bir yerde birşey bulmak için komuta ihtiyacınız olduğunda yukarıdan -ya da aşağıdaki tablodan- kopyalayın, size özel alanları düzenleyin ve işinizi bitirin.
Önce yukarıdaki komutları tekrar listeleyelim.
"2&0xFFFF=0x2:0x0100"
IPID değerinin 2 ile 256 arasında olduğunu kontrol et
"0&0xFFFF=0x100:0xFFFF"
Paketin 256 ya da daha çok bayt içerdiğini kontrol et
"5&0xFF=0:3"
TTL değeri 3 ya da daha az olan paketleri bul
"16=0xE0000001"
Hedef adresi 224.0.0.1
"12&0xFFFFFF00=0xC0A80F00"
Kaynak adresi 192.168.15.X C sınıfı ağ
0&0x00FF0000>>16=0x08
TOS alanı değeri 8 mi? (Maximize Throughput)
"3&0x20>>5=1"
More Fragments bayrağı tanımlı mı?
"6&0xFF=0x6"
TCP paketi mi?
"4&0x1FFF=0"
Fragment ofseti 0 mı? (Öyleyse ya bölümlenmemiş paket ya da ilk bölüm)
"0>>22&0x3C@4=0x29"
TCP sıra numarası 41 mi? (Bu önceki iki testi de gerektirir.)
"0>>22&0x3C@0>>16=0x0301"
ICMP tip=3 ve kod=1 mi? (UDP ve ilk bölüm testi gerektirir.)
"0>>22&0x3C@0&0xFFFF=53"
UDP hedef portu 53 mü? (UDP ve ilk bölüm testi gerektirir.)
"0>>22&0x3C@8>>15&0x01=1"
UDP DNS sorgu bit'i tanımlı mı? (yine öncelikle UDP, ilk bölüm testi ve hedef port 53 testleri gerektirir.)
"0>>22&0x3C@ 12>>26&0x3C@ 0=0x5353482D"
TCP yükünün ilk 4 bayt'ı "SSH-" mı? (bu birçok ek kontrol gerektirir. tam satır şöyle olmalı: iptables -p tcp \! -f -m connbayts --connbayts 0:255 -m state --state ESTABLISHED -m length --length 46:375 -m u32 --u32 "0>>22&0x3C@ 12>>26&0x3C@ 0=0x5353482D")
Ve şimdi bazı yeni testler:
"6&0xFF=1"
ICMP paketi mi? (Don Cohen'in belgesinden)
"6&0xFF=17"
UDP paketi mi?
"4&0x3FFF=0"
Fragment ofseti 0 ve MF temiz mi? (Eğer böyleyse bu bölümlenmemiş bir paket)
"4&0x3FFF=1:0x3FFF"
Fragment ofseti sıfırdan büyük ve MF tanımlanmış mı? (Eğer böyleyse bu bir bölüm)
"0>>22&0x3C@12>>26&0x3C@-3&0xFF=0:255"
TCP paketinde herhangi bir yük var mı? (TCP ve ilk bölüm testi gerektirir.)
"0>>22&0x3C@8=3000"
TCP ack alanı 3000 mi? (Bu da TCP ve ilk bölüm testi gerektirir)
"0>>22&0x3C@10&0x80=0x80"
TCP bayrağı (bayt 13) high order bit'i (CWR) açık mı? (TCP ve ilk bölüm testi gerektirir) Kapalı mı diye bakmak için =0x80 yerine =0 kullanın
"0>>22&0x3C@10&0x40=0x40"
Next bit down (ECN-Echo) açık mı? Benzer şekilde kapalı mı kontrolü iiçin =0 kullanın.
"3&0xE0=0x20"
More Fragments bit'i tanımlı ve Reserved ve Don't fragment bayrakları temiz mi?
"3&0x20=0x20"
Bu da MF bit'ini kontrol eder fakat Reserved ya da unfragmented olması ile ilgilenmez.
"3&0xE0=0x60"
More Fragments ve Unfragmented tanımlı mı ve Reserved temiz mi?
"3&0xE0=0x80"
Reserved tanımlı mı ve More Fragments ve Don't fragment temiz mi?
"0>>22&0x3C@2&0xFFFF=0"
ICMP ID 0 mı?
"0>>22&0x3C@4&0xFFFF=35"
ICMP Echo sıra numarası 35 mi?
Bu belge Bill Stearns tarafından yazılmış olan “IPTables U32 Match Tutorial” belgesi temel alınarak hazırlanmıştır. Belgenin “birebir çevirisi” değildir.
- Yorum yazmak için giriş yapın veya kayıt olun





