Linux Sistemlerin Likewise İle Windows Active Directory Entegrasyonu

14 October, 2009 (08:31) | Linux | By: alper

Günümüzde artan Enterprise yönetilebilirlik ihtiyacı ile beraber hemen hemen her şirkette  LDAP sistemleri yaygın olarak kullanılmaya başlandı, Özellikle Windows 2000 , 2003 , 2008 Active directory sistemlerine sıkça rastlamaktayız. Linux Sistemlerimizi genellikle aşağıdaki sebeplerden dolayı AD ” Active Directory” Domain e dahil etmek zorunda kalıyoruz.

  1. Kullanıcıların geçerli kullanıcı ve şifrelerini kullanabilmeleri.
  2. Network ve Sistem kaynaklarına ulaşabilmek
  3. Linux Server üzerinde bulunan bazı uygulamaların AD entegrasyonu.

Likewise Open bu konuda oldukça kolay bir çözüm üretiyor Samba ve winbind çözümleri kadar seçenekler sunmasada hızlı ve kolay çözüm üretmek için ideal. Linux dağıtımların bir çoğunda paket hazır olarak geliyor paket yöneticinizi kullanarak deponuzdan bu paketi öncelikle kurmanız gerekiyor. ( Suse ve Redhat default olarak LDAP auth desteklemektedirler. Elimde  hazır. bulunan linux dağıtımı Ubuntu olduğu için örnekleri onunla vereceğim.) likewise ile grup gibi bir çok özelliği kullanmak için enterprise sürümümü kullanmalısınız.

  • Likewise-open Kurulumu

alper@linux:~$ sudo apt-get install likewise-open

Kerberos Server için sisteminiz soru soracak enter e basıp geçebilirsiniz.

  • Domain e dahil olma

sudo domainjoin-cli join example.local Administrator

example.local = active directory domain’i Fully Qualified Domain Name (FQDN)

Administrator = Active directory üzerinde bilgisayarı domain e dahil etme yetkisine sahip bir kullanıcı.

not : domain ismini çözmek için dns adresleriniz doğru olduğundan ( AD DNS server adresi ) emin olunuz. IP Adres yapılandırmasını şayet desktop tabanlı bir proğram ile yapıyorsanız değiştirin. network e bağlanmadan LDAP user sorgulaması yapamayacağınızı gözardı etmeyiniz.

NOT  : Ubuntu default “/etc/nsswitch.conf” dosyası hatalı dosyayı açarak “hosts” satırını “hosts:          hosts dns files” şeklinde düzeltmeniz gerekiyor aksi takdirde domain’i bulamayacaktır. ( Selimcan Dalgıç‘a teşekkürler )

Domain’e dahil olduğunuzda likewise-open “SUCCESS” şeklinde bir mesaj dönecektir. Yeniden başlatmadan kullanıcı adı ile Desktop login olamayacaktır.

  • Kontrolü

sudo update-rc.d likewise-open defaults

root@ykubuntu:/home/alper# /etc/init.d/likewise-open start
* Starting the Likewise-open auth daemon                                                                                                             [ OK ]
root@ykubuntu:/home/alper#

“ssh ‘example\user’@localhost”  Komutu nu vererek ( çalışıyorsa ) kendi makinanıza example domaindeki kullanici ismi ile login olmayı deniyoruz ( Kendi kullanici adi ve şifrenizi kullanınız )
( root değilseniz “sudo” unutmayın )

  • Domain’den çıkma

Herhangi bir sebepden dahil ettiğiniz makinanızı domain den çıkarmak için :

sudo domainjoin-cli leave

Komutunu kullanabilirsiniz.

iptables -7- Targets

19 September, 2009 (23:16) | iptables | By: alper

  • Daha önce iptables “targets”i tanımlarken; bir iptables kuralında söz konusu paket için belirli Match şartları mevcutsa ( belirli bir ip den gelen gibi ), o paket ile ne yapacağımızı belirtebilmemiz için kullanılır ve örneğin başka bir “chain”e yönlendirmek veya nat yapmak gibi diye ifade etmiştim. Iptables ile kullanabileceğimiz “target”lere göz atalım.

Jumps

Jumps ( Sıçramalar), kullanım şekli targets ile aynı olmakla beraber aynı tablo içerisinde başka bir “chain”e (zincire) sıçramak amacı ile kullanılır. “Jump”ın kullanılabilmesi için sıçranacak zincirin önceden oluşturulmuş olması zorunludur. Hemen bir jump örneği yapalım.

bash-3.2#iptables -N  tcp_packets
bash-3.2#

tcp_packects isminde yeni bir zincir oluşturduk.

bash-3.2# iptables -A INPUT -p tcp -j tcp_packets
bash-3.2#

Gelen tcp paketlerimizi “tcp_packets” zincirine yönlendirdik, yani jump yaptık. Sıçranan zincir içerisindeki kurallar tamamlanır tamamlanmaz, jump yaptığımız kuraldan sonraki kurala geri dönülür.

chains

Sanırım yukarıdaki resim bu durumu gayet net açıklıyor.

Targets ile bir pakete ne yapılacağını söylemiş oluyoruz.
Iptables, bir çok target yani paketle ne yapılacağı konusunda bir çok seçim sunar. Bunlardan bazıları; örneğin DROP ACCEPT gibi targetler bir pakete uygulandığında, paket o chain için başka hiç bir rule altında işlem görmez. Log gibi “target”ler ise paketin aynı chain içerisinde işlem görmeye devam etmesine mani değildir.

Accept Target

[root@linux ~]# iptables -A INPUT -j ACCEPT
[root@linux ~]#

İlgili paketin iptables üzerinden geçmesine izin verir. Yukarıdaki örnekte gelen tüm paketleri kabul ettik.

Drop Target

[root@linux ~]# iptables -A INPUT -p udp -j DROP
[root@linux ~]#

Paketi basitçe yok etmek için kullanılır. Söz konusu pakete herhangi bir işlem yapılmaz. Söz konusu kurala geldiğinde paket yok olur.
Örneğimizde gelen UDP paketlerini yok ettik ( engelledik , düşürdük )

Reject Target

1- –reject

[root@linux ~]# iptables -A FORWARD -p TCP –dport 22 -j REJECT
[root@linux ~]#

Reject Target, Drop ile aynı görevi yapmakla beraber, bunun yanında  istemciye paketin reddedildiğine dair mesaj döndürür.

2 –reject-with

[root@linux ~]#iptables -A FORWARD -p TCP –dport 22 -j REJECT –reject-with tcp-reset
[root@linux ~]#

–reject-with opsiyonu bize hangi sebepten paketin geri çevirildiği konusunda seçim yapma hakkı tanır.
Desteklenen reject tipleri:  icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited ve
icmp-host-prohibited.
–rejetct-with opsiyonu belirtilmez ise  ”port-unreachable to the host” default opsiyon olarak döner.

Classify Target

[root@linux ~]#iptables -t mangle -A POSTROUTING -p tcp –dport 80 -j CLASSIFY –set-class 20:10
[root@linux ~]#

Bu örnek:
tc, qdisc ile kullanıldığında ( Linux QOS ) tc filter yerine iptables ile paketleri sınıflandırarak “class”lara yönlendirmek için kullanılır. –set-class opsiyonu ile birlikte kullanılır.
Örneğin burada,  20 nolu major “class”ı 10 nolu minor “class”a yönlendirdik.
linux altında qos konusuna yabancı olmayan arkadaşlar için son derece anlaşılır olduğunu düşünüyorum.

Clusterip Target

Clusterip target bize, iptables ile basit bir cluster kurmamızı sağlar. Söz konusu cluster son derece basit olup herhangi bir standart cluster opsiyonu sağlamamaktadır.
Bir çok durumda birden fazla server üzerinde yük paylaşımı için kullanılabilir. Clusterip target “ipt_clusterip” modülünü kullanır.
“/proc/net/ipt_CLUSTERIP/
” dizininden ilgili dosyalara ulaşabilirsiniz. Cluster için oluşturulan 1 adet ip adresi ve mac adresi, cluster bilgisayarlar tarafından paylaşılır.
mac adres, multicast mac olmak zorundadır.
“ 01:00:5e: ” ile başlamalıdır.
İlgili hostlar tek bir ip ve mac adresini paylaşarak Round Robbin Hash algoritması ile cevap verirler.

iptabls cluster

Yukarıdaki yapıyı kurmak için :

[root@linux ~]# iptables -A INPUT -i eth0 -p tcp -d 192.168.0.5 –dport 80 -j CLUSTERIP –new –hashmode sourceip –clustermac 01:00:5e:00:00:20 –total-nodes 2 –local-node 1
[root@linux ~]#

1- –new

Yeni bir CLUSTERIP girdisi yaratmak için kullanılır.

2- –hashmode

3 çeşit hashmode destekler.
Bunlar :

  • sourceip
  • sourceip-sourceport
  • sourceip-sourceport-destport

Kısaca sourceip = kaynak ip’den gelen tüm istekler aynı “server”e gider, sourceip-sourceport aynı kaynak ip ve kaynak portundan çıkan paketler aynı “server”a gider,
sourceip-sourceport-destport = kaynak ve hedef portları aynı olanlar aynı “server”e gider.
Clusterip target’i, kullanmak istediğiniz hizmet tipine göre seçilmelidir.

3- –clustermac

Cluster için MAC adresi, tüm cluster bilgisayarları tarafından paylaşılan Multicast MAC adresdir ve “01:00:5e” ile başlamalıdır. Multicast mac kullanılmazsa bağlı olduğunuz switch veya router ile problem yaşamanız olasıdır.

4- –total-nodes

Cluster yapınızda kaç adet host’un olduğunu belirtir. Yukarıdaki örnekte 2 adet server için “2″ girdik.

5- –local-node

Kuralın girildiği Server’in cluster yapısında kaç numaralı server olduğunu belirtmek için kullanılır. gelen bağlantılar Round-Robbin ile dağıtılırken bu sıra göz önüne alınır.

6- –hash-init

Rastgele başlangıç noktasını belirler.

  • Serverlerin bağlı olduğu switch veya router RFC 1812 ile belirtilen standartları karşılamalıdır.

Mark Target

Mark Target, iproute2 paketi ve iptables kuralları ile haberleşmek için kullanılır “4294967296″ adet mark yapılabilir. Sadece mangle table’da kullanımı mümkündür. Dikkat edilecek nokta söz konusu işaretlerin ip header’da herhangi bir değişiklik yapmaması yani, söz konusu işaretlenmiş paketler dışardaki bir host tarafından anlaşılamazlar. söz konusu mark kernel tarafından izlenir.

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 22 -j MARK –set-mark 2

–set-mark

Mark numarası belirtmek için kullanılır. örneğimizde 22 nolu tcp portuna giden tüm paketleri 2 ile işaretledik. daha sonra iproute2 ile bu paketleri farklı bir routing e yönlendirmek veya, QOS uygulamak mümkündür. ( tc filters ile de yapılabilir tamamen sizin dizaynınızla ilgili bir tercih )

Connmark Target

Connmark target, Mark target ile aynı işi yapmakla beraber bir paketi değil komple bir bağlantıyı işaretlemek için kullanılır. ipconntrack modülünü enable eder ( CPU ve RAM hesaplamalarını göz ardı etmeyiniz )

1- –set-mark , –set-xmark

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp –dport 80 -j CONNMARK –set-mark 4
[root@linux ~]#

Paketi “4″ olarak işaretledik. Bağlantıyı belirten mark numarası ile işaretlemeye yarar.

2- –save-mark

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 80 -j CONNMARK –save-mark
[root@linux ~]#

Paketin içerdiği mark’i connmark’a kayıt eder. yani /proc/net/ip_conntrack içerisine.

3- –restore-mark

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 80 -j CONNMARK –restore-mark
[root@linux ~]#

ip_conntrack içerisindeki mark bilgisini pakete işler. Sadece mangle table içerisinde kullanılabilir.

4- –mask

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 80 -j CONNMARK –restore-mark –mask 12
[root@linux ~]#

Mark ile işaretlenmiş paketin, ikilik sayı sistemine çevirildiğinde, bit mask belirterek birden çok mark değerini aynı anda göstermek için kullanılır. –restore-mark ve –save-mark ile beraber kullanılabilir. yukarıdaki 12 mask değeri binary 1100 eşit olduğundan “1″ değerlerinin eşit olduğu tüm mark değerlerini kapsar. örneğin :1111,1100,1101 değerlerinin hepsi 1100 mask’ina uymaktadır.

Connsecmark Target

–save

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 80 -j CONNSECMARK –save
[root@linux ~]#

SELinux tarafından işaretlenmiş paket bilgilerini conntrack içerisine işler.

–restore

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 80 -j CONNSECMARK –restore
[root@linux ~]#

Conntrack girdisinde SELinux için işareti işlemiş fakat paket içeriğinde bulunmuyan güvenlik bilgisini pakete işler.

DNAT target

DNAT Target paketin hedef ip adresini değiştirmek için kullanılır ( Destination Network Address Transilation ) . en basit kullanım örneği localde bulunan 10.1.2.1 ip adresinde çalışan web server’imize internetten gelen http paketlerini yönlendirmek için kullanılabilir.

–to-destination

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination 192.168.1.1-192.168.1.10
[root@linux ~]#

–to-destination paket DNAT yapıldığında hedef ip adresinin ne olarak değiştirileceğini belirtmek için kullanılır. yukarıdaki örnekte olduğu gibi “-” ile ip adres grubu belirterek load balance sağlanabilir.

–random

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination 192.168.1.1-192.168.1.10 –random
[root@linux ~]#

–random routing tableda source port un randomize edilmesi için kullanılır.

DSCP Target

DSCP ( RFC 2638 Differentiated Services Code Point ), alanındaki bilgileri değiştirmek için kullanılır.

1- –set-dscp

[root@linux ~]# iptables -t mangle -A FORWARD -p tcp –dport 80 -j DSCP –set-dscp 1
[root@linux ~]#

Decimal veya hexedecimal olarak DSCP değerini atamaya  yarar, Hexedecimal olarak atamak için değerin başına “0x” koymalıyız.

2- –set-dscp-class

[root@linux ~]# iptables -t mangle -A FORWARD -p tcp –dport 80 -j DSCP –set-dscp-class EF
[root@linux ~]#

DSCP sınıfını belirtmek için kullanılır. değer olarak tüm DSCP snıfları kullanılabilir ( BE,EF,AFxx,CSx ).

ECN Target

–ecn-tcp-remove

[root@linux ~]# iptables -t mangle -A FORWARD -p tcp –dport 80 -j ECN –ecn-tcp-remove
[root@linux ~]#

Paketlerden ECN bilgilerini çıkarmaya yarar. İnternet üzerinde bazı router’lar ECN field i dolu olan paketleri route etmezler bunun için kullanılır. sadece “-p tcp” ile beraber çalışır.

LOG Target & ULOG Target

LOG ve ULOG target’ler iptables ile log tutmak için kullanılan target’lerdir. düzgün yapılandırılmış bir firewall da log tutmak son derece önemli olduğu ve bu Target’ler oldukça geniş yer tuttuğu için ayrı bir yazımda ayrıntılı olarak işleyeceğim.

Masquerade Target

Temel olarak SNAT ( Source Network Adress Transilation ) ile aynı işi yapar. nat table içerisinde çalışır. inertenet bağlantısının basitçe paylaştırmak için idealdir. ADSl, Kablonet, Dialup gibi bağlantıları Masquerade ile paylaştırabilirsiniz.

[root@linux ~]# iptables -t nat -A POSTROUTING -s 192.168.0.1/24 -o eth0 -j MASQUERADE
[root@linux ~]#

Yukarıdaki örnek 192.168.0.1/24 lokal networkümüzdeki istemcilere eth0 üzerinden sağlanan interneti SNAT yaparak paylaştırır. interface ismi verip ip adresi belirtilmediği için ppp gibi dinamik ( değişken ) ip adreslerine sahip bağlantıları paylaştırmak için uygundur.

–to-port

[root@linux ~]# iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE –to-ports 1024-31000
[root@linux ~]#

TCP ve UDP protokolleri ile beraber kullanıldığında, Masqerade yapılmış paketlerin, giden interface üzerinde kaynak portlarının aralığını belirtmek için kullanılır. port aralığı hariç tek bir port da kullanılması mümkündür.

MIRROR Target

Mirror target gelen bir paketi aynen gönderene geri göndermek için kullanılır ( ayna ). Kesinlikle çok büyük DDOS açıkları veren bir targettir. Özellikle ADSL gibi upload inizin download inizdan düşük olduğu yapılarda kesinlikle kullanmayın çok kolay abuse edilebilir.

NETMAP Target

Netmap target ”one to one” maping dediğimiz 1 e 1 NAT Maping olayını gerçekleştir. Basitçe örneklendirecek olursak , 192.168.0.1/255.255.255.0 local ip adreslerimizin hepsine 1 ip adresimiz olacak kadar internet ip adresimiz var. her birini tek tek NAT yapmak yerine Netmap target ile adresleyebiliriz. Sadece nat table içerisinde  çalışır.

–to

[root@linux ~]# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -j NETMAP –to 10.5.6.0/24
[root@linux ~]#

192.168.1.0/24 networkünden gelen istekleri 10.5.6.0/24 network’üne map yaptık.

NFQUEUE Target

NFQUEUE target, QUEUE target in yerini almıştır. Amacı belirtilen paketlerin SNORT gibi IDS sistemleri veya network yönetim proğramları için paketlerin kuyruklanmasıdır.

–queue-num

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp –dport 80 -j NFQUEUE –queue-num 30
[root@linux ~]#

–queue-num nfqueue için kuyruk numarası atamamıza yarar bu değer girilmezse default queue numarası 0 dir. queue-num 16 bittir yani 0 dan 65535 e kadar kuyruk atanabilir.

NOTRACK Target

[root@linux ~]# iptables -t raw -A PREROUTING -i eth0 -p tcp –dport 80 -j NOTRACK
[root@linux ~]#

NOTRACK Target, ip conntrack tarafından takip edilmemesini istediğimiz paketleri işaretlemek için kullanılır. Sadece RAW table içerisinde geçerlidir.

Rateest Target

Rateest target tek başına anlaşılması güç olduğu için rateest match ile beraber ayrı bir yazımda anlatacağım.

REDIRECT Target

Redirect target, gelen bir paketin hedef adresini gelen interface’in ip adresine yönlendirir. kaynak adresi host’un kendisi ise 127.0.0.1 e yönlendirilir. örneğin her herhangi bir ip adresinin 80 nolu portuna giden istekler 3128 e yönlendirilerek transparent squid çalıştırılması gibi. Redirect target sadece nat table içerisinde PREROUTING ve OUTPUT zincirlerinde çalışır.

–to-ports

[root@linux ~]# iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
[root@linux ~]#

–to-ports hedef port’u belirtmek için kullanılır. örneğimizde 8080

Return Target

Return target, bir paketin herhangi bir chain içerisinde gezinmesini sonlandırmak için kullanılır. örneğin INPUT chain içerisinde paket “-j RETURN” target e rastlarsa başka hiç bir rule’a uğramayarak default policy e gider.

[root@linux ~]# iptables -A FORWARD -p TCP –dport 22 -j RETURN
[root@linux ~]#

Örneğimizde TCP 22 nolu port ‘a giden paketlerimiz INPUT chain içerisinde başka hiç bir kurala uğramaz.

SNAT Target

SNAT Target paketin ip header’inda kaynak ip adresinin değiştirilmesi için kullanılır. ( Source Network Address Transilation ), kısacası interneti paylaştırmak için. Local networklerimizde kullandığımız IANA ( 192.168.0.0,10.0.0.0,172.16.0.0 ) ip adreslerini gerçek ip adresleri ile değiştirerek internete çıkmamızı sağlar. dikkat edilmesi gerekn nokta SNAT target in statik ip ile çalışıyor olması, evimizde bulunan ADSL gibi hatların paylaşımı için MASQUAREDE target kullanılmalıdır.

–to-source

[root@linux ~]#  iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT –to-source 10.70.20.197:1024-32000
[root@linux ~]#

Örneğimizde ”eth0″ interface inden gelen tcp paketlerini “10.70.20.197″ nolu ip adresini alarak kaynak portları “1024-32000″ olacak şekilde çıkmasını sağladık. dikkat edilmesi gereken nokta SNAT paketin gideceği yer konusunda herhangi bir işlem yapmaz sadece gönderen ” kaynak” kısmını değiştirir. birden fazla ip adresi için loadbalance yapmak istersek ip adreslerini “-” ile ayırarak gösterebiliriz örneğin “10.70.20.1-10.70.20.15″ 1 ila 15 arasındaki ipler arasında kaynak adresi belirtmesini sağlar.

Same Target

Same target aynı SNAT target gibi çalışmakla beraber temel farkı birden çok ip grubu belirlendiğinde istemciyi her zaman aynı source ip ile çıkarmaya çalışır. örneğin 192.168.0.1-192.168.0.50 ip grubunu belirttiğimizde 10.70.20.2 nolu ip adresine sahip istemci ilk çıktığında 192.168.0.7 ip adresine denk gelmesi durumunda Same target her seferinde aynı istemciyi 192.168.0.7 adresinden çıkarmaya çalışacaktır.

Dnat Target’in –persistent parametresi Same Target ‘in yerini almıştır.

Secmark Target

Secmark target SELinux için paketleri işaretlemek için kullanılır. Konumuz SELinux olmadığı için ayrıntılılarına girmeyeceğim.

iptables -t mangle -A PREROUTING -p tcp –dport 80 -j SECMARK –selctx httpcontext

TCPMSS Target

TCPMSS Target paketlrin MSS ( Maksimum Segment Size ) değerlerini değiştirmek için kullanılır. Normal şatlar altında bu değer MTU ( Maksimum Transmission Unit ) -40 a eşittir. Bazı internet Servis sağlayıcıları veya sistem yöneticileri ICMP fregmanted paketeri drop ‘laya bilir ler . budurum aldında çok ilginç şartlar meydana gelebilir. örneğin , Mail alış verişinde hiç bir problem olmamasına rağmen çok büyük dosya gönderilen mail lerin gitmemesi, ssh ile sorunsuz bağlantı sağlandığı halde sftp ile büyük dosya transferlerinin yapılamaması gibi. Kısacası herşey in çalıştyığı ama büyük paketlerin iletilemediği bir durum meydana gelir. TCPMSS Target bize bunları engelleyebilme şansı verir.

1- –set-mss

[root@linux ~]# iptables -t mangle -A POSTROUTING -p tcp –tcp-flags SYN,RST SYN -o eth0 -j TCPMSS –set-mss 1460
[root@linux ~]#

Giden paketlerin MSS değerlerini değiştirmek için kullanılır. örneğimizde eth0 üzerinden giden paketlerin, MSS değerlerini 140 olarak değiştirdik. MSS değeri SYN paketlerinde doğru olarak yapılandırılmalıdırlar.

2- –clamp-mss-to-pmtu

[root@linux ~]# iptables -t mangle -A POSTROUTING -p tcp –tcp-flags SYN,RST SYN -o eth0 -j TCPMSS –clamp-mss-to-pmtu
[root@linux ~]#

Bu paramtre MSS değerini otamatik olarak default değerine set ederki bunun yapılandıılmasına normal şartlar altında gerek yoktur. MSS değeri default olarak PMTU ( Path  Maksimum Transmission Unit ) eksi 40 dir. Bir çok uygulama için kabul edilebilir bir değerdir.

TPROXY Target

TPROXY  Target transparet proxy uygulamaları için kullanılır. genellikle linux iptables la beraber redirect target kullanılır ama tproxy target in ana farkı ip header’da herhangi bir değişiklik yapmadan bunu yapabilmesidir.http isteklerinde genel olarak redirect ile bir sorun olmasada örneğin UDP için transparent proxy uygulamalarında hedef ip adresi kaybolduğu için redirect target in kullanılması imkansız hale gelmektedir. TPROXY Target in kullanılabimesi için proxy nin bunu desteklemesi gerekmektedir. Squid ile kullanımı için squid web sayfasında ayrıntılı bir döküman mevcutur. TPROXY target aynı zamanda paketn mark deerini değiştirerek advanced routing ile kullanımına imkan sağlar.

[root@linux ~]# iptables -t mangle -A PREROUTING -p tcp –dport 80 -j TPROXY –tproxy-mark 0×1/0×1 –on-port 3129
[root@linux ~]#

TRACE Target

Trace target kısaca bir paketi ip tables zincirleri içerisinde gezerken takip etmekamacı ile kullanılır. Sadece raw table içerisinde kullanılabilir. Trace target ile işaretlenmiş paket herhangi bir iptables kuralına denk geldiğinde ( hit ) , kernel tarafından log lanır.

[root@linux ~]# iptables -t raw -A PREROUTING -j TRACE
[root@linux ~]#

Örneğimizde tüm paketleri trace ile işaretledik.

TOS Target

TOS nedemek daha önce TC Fifo yazımda değinmiştim.  TOS Tagret ile giden paketlerin TOS field lerini ( Değerlerini ) değiştirebiliriz. TOS Target sadece “mangle” table içerisinde kullanılabilir. iptables version 1.2.2 ve daha önceki versionlarında TOS Target sorunludur.

[root@linux ~]# iptables -t mangle -A PREROUTING -p TCP –dport 80 -j TOS –set-tos 0×10
[root@linux ~]#

- –set-tos

TOS değerini belirtmek için kullanılır. yukarıdaki örneğiiz de TOS değerini http 80 nolu port için 0×10 yani Decimal 2 değeri atadık  “Maximize reliability Maksimum kararlılık(mr)”

TTL Target

TTL Target ip header içerisinde TTL değerini ( Time TO Live ) değiştirmek için kullanılır. TTL kavramına daha önce Iptables Tables & Chains yazımda değinmiştim .

1- –ttl-set

[root@linux ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL –ttl-set 64
[root@linux ~]#

TTL değerini değiştirmek için kullanılır. Linux default dışarıya giden bağlantılar için TTL değeri 64 dür.  Herhangi bir sebepden dolayı bu değerin değiştirilmesi gerekirse –ttl-set parametresi ile yeniden düzenlenebilir.

2- –ttl-dec

[root@linux ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL –ttl-dec 1
[root@linux ~]#

TTL değerini olan değerden düşürmek için kullanılır. yukarıdaki örnekde TTL değeri 1 düşürülmüştür.

3- –ttl-inc

[root@linux ~]# iptables -t mangle -A PREROUTING -i eth0 -j TTL –ttl-inc 1
[root@linux ~]#

TTL değerini arttırmak için kullanılır. örneğimizde TTL değeri 1 arttırılmıştır.

Kablo Net Router

28 July, 2009 (16:19) | Genel Network | By: alper

Uydunet (eski Kablonet), abonelerine 128 adede kadar ip adresi alma imkanı  sunuyor. Test amaçlı, evde bu şekilde fazladan ip adresimin olmasının iyi olacağına karar vererek 8 adet ip adresi aldım.  Bunun için öncelikle yapmanız gereken, Uydunet sitesinden tarifelere bakarak kendinize uyan ip adedini seçmek ve  destek@uydunet adresine, istemiş olduğunuz ip adreslerinin adedini, abone hizmet numaranızı ve  modem mac adresini ( şart değil ama kolaylık olması açısından ) bir mail ile bildirmek. Herhangi bir terslik olmaz ise 1 hafta 10 gün gibi bir süre içinde,  ip adreslerinizin bulunduğu “subnetmask”ı (alt ağ maskesi) ip adresinize route ediyorlar. Arada terslikler olsa da çalışmış oldukları stresli ortam göz önüne alındığında, Uydunet internet hizmetlerinden sırasıyla; Ümit bey, Serdar  bey, ve Burak bey e teşekkür ederim. Son derece Sabırlı ve anlayışlı çalışıyorlar.

Sistemin Çalışması : (Bu yapıyı  herhangi iki network arasında router olarak kullanabilirsiniz.)

Uydunet firması sizin kullanmış olduğunuz x.x.x.x gibi ip adresinizin arkasında kullanmanız için y.y.y.y/z  şeklinde bir ip bloğunu static route ile yönlendiriyor. Burada dikkat etmeniz gereken nokta; kesinlikle Nat ( Network Adress Translation ) yapılandırması yapmamalısınız.

Öncelikle, x.x.x.x ip’sinin atandığı “router”ınızın “local network interface” ine, size atanan “subnetmask” dan bir ip adresini atıyorsunuz. Örneğin y.y.y.104-111 ip’leri bana atandığından y.y.y.104 network adresi , y.y.y.111 broadcast adresi olarak ayrılıyor( ip adresi olarak bu ikisini kullanamazsınız ! ).  Ben burada elimde kalan ip lerden herhangi biri olan  y.y.y.105′i router in “local interface” ine atadım. Daha sonra içeride bulunan istemcilere y.y.y.106 ile y.y.y.110 arası ip adreslerini dağıtıyoruz. İstemcilerin ağ geçidi ( gateway , default route ) adresi olarak, “router” ımızın “local interface”ine vermiş olduğumuz ip adresini kullanmamız gerekiyor.
Herhangi bir DNS sunucu veya forwarder yapılandırmadıysanız, ağ geçidinizi dns adresi olarak kullanamayacağınızı göz ardı etmeyiniz. şimdi anlattığımız yapıya resim olarak bakalım;

Yapı

Burada Router olarak bir hardware router kullanabileceğiniz gibi elinizde bulunan bir pc yada sunucuyu da router olarak kullanabilirsiniz, “IP FORWARDING” enable edilmiş herhangi bir işletim sistemi bu görevi görecektir. Herhangi bir static routing tanımlamanıza yada firewall çalıştırmanıza gerek yoktur. İşletim sistemleri local olarak bağlanmış olan kendi “interface”leri arasındaki “routing” leri otamatik olarak girer ve route eder. Şimdi bu olayın değişik bazı işletim sistemlerinde nasıl yapıldığına bakalım :

FreeBSD :

/etc/rc.conf içerisine gateway_enable=”YES” ekliyoruz.

veya

sysctl   net.inet.ip.forwarding=1

yada /etc/sysctl.conf içerisine  net.inet.ip.forwarding=1 yazıyoruz. Kontrol etmek için :

[root@gariban /home/alper]# sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 1
[root@gariban /home/alper]#

Şeklinde ipforwarding enable olduğundan emin oluyoruz.

OpenBSD ve NETBSD :

sysctl -w  net.inet.ip.forwarding=1

Kalıcı olması için /etc/sysctl.conf a ekliyoruz. net.inet.ip.forwarding=1

Solaris :

ndd /dev/ip ip_forwarding

Değer “0″ ise

ndd -set /dev/ip ip_forwarding 1

Solaris de default iprouting enable’dir, /etc/norouter adlı boş bir dosya oluşturulması bunu engeller. ayarın kalıcı olması için bu dosyayı silmeniz yeterlidir.

HP Unix :

/usr/contrib/bin/nettune -s ip_forwarding=1

Kalıcı olması için

/sbin/init.d/net dosyasında start) satırının altına komutu girin

Aix :

/usr/sbin/no -o ipforwarding=1

Aix de default açıktır.

MacOS X :

sysctl   net.inet.ip.forwarding=1

kalıcı olması için /etc/sysctl dosyasının içerisine net.inet.ip.forwarding=1 ekliyoruz ( dosya yoksa oluşturun )

Ms Windows İşletim Sistemleri :

XP home-pro,Server 2000,2003,2008,Vista, Windows 7

regedit.exe yi çalıştırın,

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters içerisinde EnableIpRouter değerini “1″ olarak değiştirin.

Linux :

sysctl net.ipv4.ip_forward

kalıcı olması için : /etc/sysctl.conf içerisine  net.ipv4.ip_forward=1 ekliyoruz.

yada

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

Herhangi bir hata yapılmadığı takdir’de yapılandırmamız bu kadar.

Hata Analizi :

Hemen hemen hiç bir ayar gerektirmeyen bu sistemi kurduğunuz halde sisteminiz çalışmıyor mu?

  1. “Router”ınızın kendisi internete çıkıyor mu kontrol edin. Eğer çıkmıyorsa gerekli ayarlarınızı tekrar gözden geçirin ( Standart kablo Modem ayarı )
  2. “Router”ınız internete çıkıyorsa, önce içeride bulunan bir istemcinizden “router”ınızın iç ( local ) “interface”ine ping atın.
    Eğer cevap gelmiyorsa network’ünüzü gözden geçirin.
    Cevap geliyorsa “router”ın harici “interface”indeki ip adresinize ping atın.
    Cevap gelmiyorsa , ağ geçidi olarak router’in local interface i yazılmamıştır veya ip forward enable edilmemiştir. Yukarıdaki basamaklara göre tekrar kontrol edin.
  3. Sorununuz halâ çözülmediyse firewall etkindir ve engelliyordur. “Firewall”u devre dışı bırakın veya izin verin.
  4. Yukarıdaki sorunlarınızı çözdüyseniz, kablonette sizden sonraki ip adresine yani ağ geçidinize ping atın. “Resimde x.x.x.1 ile gösterilen” internete çıkan router cevap alacaktır. Arkadaki bilgisayar ping atabiliyormu ? atamıyorsa ağ geçidinizi kontrol edin. “Router”ın “local interface”inin verildiğinden emin olun.
  5. Hâlâ sorun yaşıyorsanız http://ping.eu adresinden, localde bulunan ip adreslerinizden birine traceroute yapın. “Trace”in “router” ınıza kadar geldiğinden emin olun. Daha farklı bir yerde sonlanıyorsa durumu Uydunet’e bildirerek düzeltmelerini isteyin.
  6. Local bilgisayarlardan “Router”"ınızın iç ve dış “interface”lerine ulaşabiliyorsanız, local bilgisayarlarınızın ip adresleri doğru ise, “router”iniz sorunsuz olarak internete ulaşıyor ve  firewall tarafından paketleriniz engellenmiyor ise, Uydunet ile routing tanımlamaları için görüşün. Sorun sizden değildir.
  7. http://www.whatismyip.com/ adresine girdiğinizde local’de size tanımlanan yerine router’in ip adresini görüyorsanız Router üzerinde  NATD yani internet bağlantı paylaşımı ( windows içn  ICS ) devrededir. Kapatın.

Linux Ethernet Mac Adresi nasıl değiştirilir ?

29 May, 2009 (02:09) | Linux Networking | By: alper

Linux’da  mac adresinizi aşağıdaki şekilde değiştirebilirsiniz.

Öncelikle ağ kontrol kartı  (NIC:network interface conroller-card (eternet kartı) ) aygıtını  down durumuna alıyoruz. Bizim sistemimizde bu aygıt, “eth1″ dir;

[root@linux ~]# ifconfig eth1 down
[root@linux ~]#

Şimdi MAC adresimizi değiştirelim;

[root@linux ~]# ifconfig eth1 hw ether  00:03:FF:2C:28:50
[root@linux ~]#

eth1, değiştirmek istediğiniz ağ kontrol kartı aygıtının ismi ve bu aygıta vermek istediğimiz yeni mac adresi ise  mac adress “00:03:FF:2C:28:50″ dir.

Ve eth1 aygıtını yeniden up durumuna getiriyoruz.

[root@linux ~]# ifconfig eth1 up
[root@linux ~]#

Yapmış olduğumuz işlemi kontrol edelim.

[root@linux ~]# ifconfig eth1 |grep HWaddr
eth1      Link encap:Ethernet  HWaddr 00:03:FF:2C:28:50
[root@linux ~]#

iptables -6- Matches

25 May, 2009 (22:31) | iptables | By: alper

Daha önce ki yazımda; Match : Paket header’ina bakılarak söz konusu paketin belirli şartlara uyup uymadığını anlamak için kullanılır. örneğin filter içerisinde -source match kullanılarak paketin belirli bir ip den gelip gelmediğine bakılabilir. şeklinde açıklamıştık. Bu yazının oldukça uzun olduğunun farkındayım. iptables aktif olarak kullanmayı düşünüyorsanız match ve target lerin anlaşılması iptables in yeteneklerini kavramak açısından son derece önemlidir. Match yada target’lerin komple ezberlenmesinin hiç bir gerekliliği yoktur. iptables ile yapabileceklerinizi ve nasıl yapıldığını bir kere kavramış olmanız son derece yeterlidir. şimdi iptables ile kullanılan match’lere daha yakından göz atalım.

Genel Match’ler

1. -p , –protocol

bash-3.2# iptables -A INPUT -p tcp
bash-3.2#

TCP,UDP,ICMP gibi protokolleri kontrol etmek amacıyla kullanılır. bir protokol başına ! konularak hariç bırakılabilir örneğin !tcp tcp hariç şeklinde, tcp,udp gibi stadart protokoller haricinde switchler ve routerlar tarafından kullanılan diğer protokolleride destekler. desteklemiş olduğu protokol listesini “/etc/protocols” dosyasından bakabilirsiniz.kullanılmayan bir protokol girildiğinde hata döner.

2. -s , –src, –source

bash-3.2# iptables -A INPUT -s 192.168.1.1
bash-3.2#

Source yani kaynak ip adresini belirtmek amacı ile kullanılır. Subnet veya CIDR kullanılabilir ( 192.168.1.1/255.255.255.0 veya CIDR 192.168.1.1/24 ) yine “!” değil manasında kullanılabilir. Hiç bir kaynak adresi belirtilmediğinde default olarak herhangi bir source olarak kabul edilir.

3. -d, –dst, –destination

bash-3.2# iptables -A INPUT -d 192.168.1.1
bash-3.2#

Source’un tersine Hedef adresi veya adreslerini belirtmek için kullanılır. kullanımı –source ile aynıdır.

4. -i, –in-interface

bash-3.2# iptables -A INPUT -i eth0
bash-3.2#

Gelen interface’i belirtmek için kullanılır. Birden çok interface üzerinden ( örneğin wireless ethernet aynı anda yada birden fazla ethernet ) bağlantı sağlayan sistemlerde oldukça kullanışlıdır. gelen interface belirtildiği için sadece INPUT,FORWARD,PREROUTING chain’leri ile birlikte kullanılabilir. “+” karakteri herhangi bir karakter anlamında kullanılabilir. örneğin eth+ şeklinde belirttiğimizde eth0,eth1,eth2 …… şeklinde eth ile başlayan tüm interface’leri ifade eder. değil manasında “!” ile kullanılabilir. !eth0 eth0 hariç tüm interface’ler şeklinde.

5. -o, –out-interface

bash-3.2# iptables -A FORWARD -o eth0
bash-3.2#

Giden interface’i belirtmek için kullanılır. kullanımı “-i” ile aynıdır. sadece OUTPUT,FORWARD,POSTROUTING chain’leri ile birlikte kullanılabilir.

6. -f, –fragment

bash-3.2# iptables -A INPUT -f
bash-3.2#

fragmented ( parçalanmış ) paketleri belirtmek için kullanılır. Bazı durumlarda kablo üzerinden paketler gönderilemeyecek kadar büyük olabilir ( MTU vb sebepler ), bu durumda paketler parçalanarak hedefe gönderilir. özellikle multiplayer oyunlarda fragmented paketler çoktur. yinede fragmented paketler bir çok yerde saldırı amaçlı kullanılabiliyor. örneğin : jolt2 attack bir çok başlangıcı olmayan fragmented paket göndererek işletim sistemini ( hemen hemen her os ) boğarak işlevsiz hale getiren bir saldırıdır. “!f” şeklinde fragmented olmayan paketleri  göstermek için kullanılabilir. connection tracking ve natd kullanılan yapılarda ise linux NETFILTER koduna gelmeden önce tüm fragmente olmuş paketler bir araya getirildiği için -f kullanmak gereksizdir.

TCP MATCHES

Sadece tcp protokolü ile kullanılabilen matchler.

1. –sport, –sourceport

bash-3.2# iptables -A INPUT -p tcp –sport 22
bash-3.2#

tcp paketinin kaynak portunu belirtmek için kullanılır. 0-65535 arasında bir rakam olabilir. kullanım şekli “!” ile değil şeklinde kullanılabilir, 22 yazarak 22 nolu port un kaynak olduğu paketlerin kesilmesi şeklinde olabilir, “:22″ ,  0 dan 22 ye kadar tüm portlar, “22:” , 22 den 65535 e kadar tüm portlar , “22:80″ , 22 den 80 e kadar olan portlar veya bunların ! eklenerek değil şeklinde hariç tutulması şeklindedir. Yine /etc/services dosyasından port yerine isim kullanılabilir örneğin : 80 yerine www gibi. çok büyük rule yapılandırılmasında yüklemelerde ciddi performans sorunları yaşattığı için tavsiye edilmez.

2. –dport, –destinationport

bash-3.2# iptables -A INPUT -p tcp –dport 22
bash-3.2#

Kullanımı sourceport ile aynıdır. tek farkı kaynak portu yerine hedef portunu göstermesidir.

3. –tcp-flags

bash-3.2# iptables -A INPUT -p tcp –dport 22 –tcp-flags SYN,FIN,ACK SYN
bash-3.2#

TCP flagları ve çalışma şeklini iptables connection tracking le beraber ayrıntılı olarak anlatmıştım. bu match tcp flagları belirtmemize yarar.

4. –syn

bash-3.2# iptables -A INPUT -p tcp –dport 22 –syn
bash-3.2#

bir önceki tcp-flags örneğimizdeki “–tcp-flags SYN,FIN,ACK SYN ” ile tamamen aynıdır. iptables içerisinde tutulma sebebi geriye dönük uyumluluk olup –tcp-flags kullanımı tavsiye edilir.

5. –tcp-option

bash-3.2# iptables -A INPUT -p tcp –dport 22 –tcp-option 6
bash-3.2#
TCP optionsları belirtmek için kullanılır. Kesinlikle tavsiye etmiyorum. o yüzden açıklamasına girmeyeceğim. firewall da koyduğunuz her kuralın ikinci bir güvenlik açığına sebebiyet verebileceğine güzel bir örnektir. bir çok DDOS açığı oluşturur örneğin :  TCP Option Matching Denial of Service Vulnerability

UDP MATCHES

UDP –sport, –source-port , –dport , –destination-port mathlerini destekler. kullanımı ve işlevleri TCP dekiler le aynıdır.

bash-3.2# iptables -A INPUT -p udp –dport 53
bash-3.2# iptables -A INPUT -p udp –sport 53
bash-3.2#

ICMP Matches

–icmp-type

bash-3.2# iptables -A INPUT -p icmp –icmp-type 8
bash-3.2#

RFC 792 de belirtilen numerik icmp tiplerini belirtmek için kullanlır. icmp tiplerini daha önceki Connection tracking yazımda belirtmiştim. Numerik yerine “–icmp-type echo-request” şeklinde kullanımıda mümkündür.

Addrtype Match

1. –src-type

bash-3.2# iptables -A INPUT -m addrtype –src-type UNSPEC
bash-3.2#

Layer 3 source adres tipi , BROADCAST,MULTICAST,LOCAL,UNSPEC, ANYCAST gibi layer3 adres tiplerini içerebilir. buradaki örnekte UNSPEC yani sınıflandırılmamış gerçek bir manası olmayan kaynak adresi tipini belirttik.

2. –dst-type

bash-3.2# iptables -A INPUT -m addrtype –dst-type UNICAST
bash-3.2#

addrtype match source un tersine paketin hedef adresini belirtir. “src-type” ile kullanımı aynıdır.

AH/ESP Match

–ahspi

bash-3.2# iptables -A INPUT -p 51 -m ah –ahspi 500
bash-3.2#

IPsec bileşeni olan AH Security Parameter Index ( SPI )’i belirtmek için kullanılır. Konumuz ipsec olmadığı için ayrıntılarına girmeyeceğim. “-p” ile protokol mutlaka belirtilmelidir ( 51 = Authentication Header  IPSEC-AH ) “–ahspi 500″ yerine 500:520 şeklinde 500 den 520 ye kadar şeklinde tanımlanabilir.

–espspi

bash-3.2# iptables -A INPUT -p 50 -m esp –espspi 500
bash-3.2#

Yine IPsec bileşeni olan ESP counterpart Security Parameter Index (SPI) belirtmek için kullanılır. kullanımı AH ile aynıdır.

Comment Match

Comment match iptables kuralları içerisinde açıklama girebilmemiz için vardır. yazmış olduğunuz rule’ların daha anlaşılır olması amacı ile kullanılır.

–comment

bash-3.2# iptables -A INPUT -m comment –comment “Comment Match için örnek rule”
bash-3.2#

Fazla söze gerek olduğunu sanmıyorum. koymuş olduğumuz rule için açıklama girdik. açıklamalar maksimum  256 karakter olabilirler.

Connmark Match

Connmark match, CONNMARK ile işaretlenmiş, paketleri belirtmeye yarar, daha önce de iproute2 ile veya diğer firewall’lar ile haberleşmek için iptables’in paketleri mark ( işaret )’layabildiğini belirtmiştik.Elbetteki connmark match ile paketleri belirtebilmemiz için daha önceden işaretlenmiş olması zorunludur.

–mark

bash-3.2# iptables -A INPUT -m connmark –mark 12 -j ACCEPT
bash-3.2#

Daha önceden “12″ olarak işaretlenmiş olan paketleri belirterek kabul ettik. mark match’in kullanımının ilginç olduğu nokta çoklu match belirtmek için mark numaralarını binary e çevirip 1/1 şeklinde kulllanarak ( –mark 1/1 ) , ilk bit in “1″ olduğu mark ları komple işaretleyebiliriz. yani 33=10001 1= 00001 3= 00011 gibi ikilik sayı sistemine çevrildiğinde, ilk bit’i “1″ e eşit olan tüm işaretlemiş paketleri seçmiş olduk. ( pek bir anlam veremedim sanırım iptables’i yazanlar fanteziye girmişler biraz, fantezi amaçlıda kullanılabilir veya çoklu mark belirtiminde ufak performans avantajları sağlayabilir.)

State Match

State match, stateful firewalling için daha önceki yazımda belirttiğim ip_conntrack modulü ile birleşerek, statefull paket belirtimini sağlar.

–state

bash-3.2# iptables -A INPUT -m state –state RELATED,ESTABLISHED
bash-3.2#
–state match, hangi durumlardaki ( state ) paketin uygun olduğunu belirtmek için kullanırlır. 4 çeşit state vardır bunlar; RELATED,ESTABLISHED,NEW ve INVALID’dir. state’lerin kullanımı için daha önceki States yazımı okumanızı öneririm.

Conntrack Match

Conntrack Match, –state match’e benzemekle beraber ip_conntrack ile takip edilen paketler üzerinde daha derinlemesine belirtimler yapmamızı sağlar.

Conntrack match’i daha iyi anlamak için orjinal source address ,reply source address ve orjinal veya relpy destination adres kavramlarını biraz açıklamak yerinde olacak. ctorigsrc ve ctreplsrc MASQUERADE veya DNAT ( port yönlendirme ) yapıldığında kullanışlı parametrelerdir.şimdi DNAT ile yapılandırılmış birörneğe bakalım.

local host  = 10.0.0.2
NAT router  = 1.2.3.4
remote host = 87.65.43.21

<Dışa giden bağlantı>
ctorigsrc = 10.0.0.2
ctorigdst = 87.65.43.21
ctreplsrc = 87.65.43.21
ctrepldst = 1.2.3.4

<Gelen bağlantı>
ctorigsrc = 87.65.43.21
ctorigdst = 1.2.3.4
ctreplsrc = 10.0.0.2
ctrepldst = 87.65.43.21

10.0.0.2 linux router’in lokal ip adresi , 1.2.3.4 internet ip adresi , 87.65.43.21 ise servise ulaşan başka bir internet ip adresi. 10.0.0.2 den dışarı ulaştığımızda ctorigdst == ctreplsrc yani bağlantı dışra giden , ctorigdst != ctreplsrc olduğunda ise bağlantı içeriye gelen bir bağlantı oluyor. Sisteminizde NAT yoksa conntrack içerisinde bunları göremezsiniz.

1. –cstate

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctstate RELATED
bash-3.2#
–state match ile oldukça benzerlik götserir. conntrack tarafından takip edilen paketlerin state’lerini belirtmemize yarar örneğimizde RELATED durumdaki tcp paketleri belirttik. “–cstate” ile kullanabileceğimiz state’ler

INVALID paketin bilinen bir bağlantı ile alakası yok.

NEW paketin yeni başlatılmış bir bağlantıyı ifade eder.( 3 way handshake tamamlanmamış )

ESTABLISHED iki yönde gerçekleştirilip tamamlanmış bir bağlantıyı ifade eder.

RELATED başka bir bağlantı tarafından oluşturulmuş bağlantı örneğin ftp icmp error

SNAT paket header’da kaynak adresinin değiştirildiğini gösterir.

DNAT paket header’da hedef adresin değiştirildiğini gösterir.

NONE bu satırdan sonra yazacağım state lerin hiç birine uymadığını gösterir.

EXPECTED bir helper tarafından beklenen bağlantı ftp helper vb.

SEEN_REPLY iki taraftan haberleşme meydana gelip bağlantının henüz ESTABLISHED olmadığını gösterir.

ASSURED tamamen gerçekleşmiş bağlantı. ( erken expire olmayacak )

2. –ctorigsrc

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctorigsrc 192.168.0.0/24
bash-3.2#
conntrack içerisinde takip edilen bağlantılarda source ip adresini belirtmek için kullanılır. buradaki örnekte olduğu gibi CIDR kullanılarak subnet belirtilebilir.

3. –ctorigdst

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctorigdst 192.168.0.0/24
bash-3.2#

bir önceki –ctorigsrc ile aynı olup farkı destination ip veya subnet belirtilmesidir.

4. –ctreplsrc

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctreplsrc 192.168.0.0/24
bash-3.2#

Reply ( cevap veren veya beklenen ) kaynak adresini belirtmek için kullanılır. kullanımı –ctorigsrc ile aynıdır.

5. –ctreplsrc

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctrepldst 192.168.0.0/24
bash-3.2#

Reply destination ( hedef ) adresini belirtmek için kullanılır.

6. –ctstatus

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctstatus ASSURED
bash-3.2#

conntrack içerisinde bağlantının durumunu belirtmek için kullanılır. Durumlar ASSURED,NONE,EXPECTED,SEEN_REPPLY olabilir.

7. –ctexpire

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctexpire 100
bash-3.2#

conntrack içerisinde takip edilen paketin expire süresini belirtmek için kullanılır.

8- –ctproto

bash-3.2# iptables -A INPUT -p tcp -m conntrack –ctexpire 100 –ctproto tcp
bash-3.2#

/etc/protocols” içerisinde belirtilen protokolleri belirtmek için kullanılır, “-p” ile protokol belirtmekten farkı conntrack table içerisinde bulunanları belirtmek için kullanılır “-p” conntrack girdisine bakmaz

9- –ctdir

paketin akış yönünü belirtmek için kullanılır verilebilecek değerler ; ORIGINAL,REPLY’dır.

DSCP Match

DSCP ( RFC 2638 Differentiated Services Code Point ), alanındaki bilgileri belirtmek için kullanılır. konumuz bu olmadığı için DSCP’nin ayrıntısına burada çok girmek istemiyorum.

–dscp

bash-3.2# iptables -A INPUT -p tcp -m dscp –dscp 32
bash-3.2#
Decimal veya hexedecimal olarak DSCP değerini belirtmemize yarar, Hexedecimal olarak belirtmek için değerin başına “0x” koymalıyız.

–dscp-class

bash-3.2# iptables -A INPUT -p tcp -m dscp –dscp-class BE
bash-3.2#

DSCP sınıfını belirtmek için kullanılır. değer olarak tüm DSCP snıfları kullanılabilir ( BE,EF,AFxx,CSx ) bu classlar bir çok farklı RFC de tanımlandığı için tam bir referans veremiyorum.–dscp ve –dscp-class kesinlikle tek kural içerisinde beraber kullanılmamalıdır.

ECN Match

ECN nedir ? sorusuna sanırım biraz daha ayrıntılı bakmanın zamanı geldi, RED ile düşürülecek paketleri işaretlemek için kullanılır diye daha öncekısaca değinmiştik. ECN RFC 2481 ile belirtilmiş DS field içerisinde iki bit ile belirtilir. ECN bitlerin manasına kısaca bakalım

00 ECN değil, ECN yetenekli bir bağlantı olmadığını gösterir

01 ECN1

10 ECN0

11 CE Congestion Expired

ECE Host un ECN yapıp yapamadığını gösteren ECN Echo bit dir.

CWR : Congestion Window Received ECE bit’i işaretlenmiş bir TCP paketi belirtmek için kullanılan tek bit.

nasıl çalıştıklarına kısaca bakacak olursak 00 , peket red için işaretlenmemiş, , “01″ sıkışıklığın meydana geldiği ve bu paketin düşürüleceği, “10″ bu paketin düşürülmeyeceği, “11″ sıkışıklığın sona erdiğini göstermek için kullanılır.

şimdi Match’lerimize geri dönelim.

1- –ecn

bash-3.2# iptables -A INPUT -p tcp -m ecn –ecn-tcp-cwr
bash-3.2#

CWR in 1 olduğunu belirtmek için kullanılır. “!” ile her zamanki gibi kullanılabilir.

2- –ecn-tcp-ece

bash-3.2# iptables -A INPUT -p tcp -m ecn –ecn-tcp-ece
bash-3.2#

ECE nin “1″ olarak işaretlendiğini belirtmek için kullanılır.

2- –ecn-ip-ect

bash-3.2# iptables -A INPUT -p tcp -m ecn –ecn-ip-ect 1
bash-3.2#

ECN bit lerini desimal olarak belirtmeye yara ( 00=0 , 01=1,10=2,11=3 )

Limit Match

1- –limit

bash-3.2# iptables -A INPUT -m limit –limit 3/hour
bash-3.2#
belirtilen zaman aralığında limit koymak için kullanılır. burada saatte 3 limit koyduk zaman hour=saat,minute=dakika,second=saniye,day=gün olarak belirtilebilir. belirtilen limit iptables kural içeriğine göre farklı amaçlarla kullanılabilir örneğin: log limiti, bağlantı limiti vb.bu koyulan limit ortalama limittir.

2- –limit-burst

bash-3.2# iptables -A INPUT -m limit –limit 3/min –limit-burst 6
bash-3.2#

Limit Burst anlaşılması ilk başta biraz karışık gibi görünsede gayet basit. –limit ile dakikada 3 limit belirtiyoruz. sonra Burst yani istek aşımı belirtip dakikadaki limit isteği 3 den fazla gelirse 6 ya kadar izin ver diyoruz, peki limit ile limit-burst arasındaki fark nedir? ortalamamız dakikada 3, anlık 6 olabilir. yani bir dakika içinde 6 bağlantıya kadar kabul edip 7 inci bağlantı bu match e uymayacaktır. 7 inci bağlantının gelebilmesi için 1 dakikanın geçip ortalama bağlantının 3 olduğu garanti edilmelidir. dakikada 3 bağlantı limiti koyduğumuz için 1 dakika = 60 saniye her 20 saniyede bir yeni bir limit boşalacaktır. Böylece ani sıkışmalarda daha sonraki zaman aralıklarından ödünç alma yoluyla bize bir tampon limit oluşturma imkanı sağlar.

Hashlimit Match

Hashlimit match’e kısaca Limit match in daha gelişmişi diyebiliriz. ipt_hashlimit modulünü kullanır, ip_conntrack’a göre çok daha az da olsa sisteminizden ram ve cpu kaynaklarını tükettiğini göz önünde bulundurmalısınız.

1- –hashlimit

bash-3.2# iptables -A INPUT -p tcp –dst 192.168.0.3 -m hashlimit –hashlimit 1000/sec –hashlimit-mode  dstip,dstport –hashlimit-name hosts
bash-3.2#
Kısaca Hostun saniyede 1000 paket alabileceğini belirttik. –limit gibi –hashlimit ‘de hour=saat,minute=dakika,second=saniye,day=gün olarak belirtilebilir. –hashlimit in tüm hashlimit match’ler ile kullanılması zaruridir.

2- –hashlimit-mode

Yukarıdaki örnekte kullandığımız için yeniden örnek kullanmıyorum. –hasjlimit-mode hangi değerlerin hashlimit için geçerli olacağını belirtmek için kullanılır. kullanılabilecek değerler, dstip ( Destinaion ip address ), srcipi ( source ip adress ), srcport ( source port address ) ve dstport ( destination port adres ) ‘dir örnekte olduğu gibi  “,” ile ayılarak birden fazla mode beraber kullanılabilir. dikkatinizi çekmek istediğim nokta dstport değerinin verilmediğidir. bu durumda her port için bu kural ayrı ayrı belirlenmiş olur mesela burada ip adresi belirtmemiş olsaydık her bir ip adresinin 1000 paket/saniye limiti ayrı ayrı olacaktı. –hashlimit-mode’un tüm hashlimit match’ler ile kullanılması zaruridir.

3- –hashlimit-name

Yine önceki örneğimizde yer aldığı için yeniden örnek vermiyorum. Koymuş olduğunuz hash-limit e isim vermeye yarar, bu isimdeki bağlantıları “cat /proc/net/ipt_hashlimit/hosts” komutu ile görebilirsiniz. ssh,kaka_adamlar gibi ayrı hash-limit ler oluşturabilirsiniz. bu opsiyonun –hash-limit ile kullanılması zorunludur.

4. –hashlimit-burst

bash-3.2# iptables -A INPUT -p tcp –dst 192.168.0.3 -m hashlimit –hashlimit 1000 –hashlimit-mode dstip,dstport –hashlimit-name hosts –hashlimit-burst 2000
bash-3.2#
Kullanım şekli ve amacı –limit-burst ile aynıdır.

5- –hashlimit-htable-size

bash-3.2# iptables -A INPUT -p tcp –dst 192.168.0.3 -m hashlimit –hashlimit 1000 –hashlimit-mode  dstip,dstport –hashlimit-name hosts –hashlimit-htable-size 500
bash-3.2#
Makimum kullanılabilecek bucket sayısı, yukarıdaki örneği yorumlayacak olursak en fazla 500 port bağlantısı açılabilir.

6- –hashlimit-htable-max

bash-3.2# iptables -A INPUT -p tcp –dst 192.168.0.3 -m hashlimit –hashlimit 1000 –hashlimit-mode  dstip,dstport –hashlimit-name hosts –hashlimit-htable-max 500
bash-3.2#

hashlimit-htable-size ile maksimum açılabilecek port sayısını belirtmiştik. bunun yanında örneğin buradaki name=hosts olduğundan “cat /proc/net/ipt_hashlimit/hosts” dediğimizde dosya içerisinde sadece açık portları değil, aynı zamanda inactive ( aktif olamayan ) bağlantıların bilgilerininde tutulduğunu görürüz ( expire olana kadar tutulur ip_conntrack gibi ) , –hashlimit-table-max bu dosya içerisideki maksimum girdi adedini belirlememize yarar.

7- –hashlimit-htable-gcinterval

bash-3.2# iptables -A INPUT -p tcp –dst 192.168.0.3 -m hashlimit –hashlimit 1000 –hashlimit-mode dstip,dstport –hashlimit-name hosts –hashlimit-htable-gcinterval 1000
bash-3.2#

Garbage interval, Gereksiz süprüntüleri temizleme aralığı gibi çevirilebilir sanırım. değeri milisaniyedir. yaptığı işlem “/proc/net/ipt_hashlimit/” içerisindeki dosyalarda bulunan gereksiz girdilerin ( örneğin inactive ) ne kadar sürede bir temizlenmesi gereken girdilerin ne kadar aralıkla temizlenmesi gerektiğini belirtir. dikkat edilecek nokta, çok düşük bir değer verildiğinde cpu ve ram kullanımına yol açağı, çok yüksek bir değer verildiğinde ise hashlimit table’in dolmasına sebebiyet vereceğidir.

8- –hashlimit-htable-expire

bash-3.2# iptables -A INPUT -p tcp –dst 192.168.0.3 -m hashlimit –hashlimit 1000 –hashlimit-mode dstip,dstport –hashlimit-name hosts –hashlimit-htable-expire 1000
bash-3.2#

Hashlimit table içerisinde bulunan girdinin ne kadar süre ile kullanılmadığında sona ereceğini ve gcinterval tarafından silinmek için bekleyeceğini belirtmek için kullanılır. değeri milisaniye olarak girilir örneğin burada 1000ms = 1sn olarak girilmiştir. genel olarak gcinterval den daha büyük bir değer girilmesi beklenir.

9- –hashlimit-upto

–hashlimit ile kullanım şekli aynı olup girilen değerden yüksek bağlantıları belirtmek için kullanılır.

10- -hashlimit-above

–hashlimit-upto’nun tersine girilen değerden daha düşük bağlantı adedini belirtmek için kullanılır.

11- –hashlimit-srcmask

Kaynak adreslerini gruplamak için kullanılır. Bir bağlantı sağlandığında kaynak adresi belirtilen CIDR değerine ( 0-32 ) göre gruplanır. –hashlimit-srcmask 24 değeri verildiğinde bağlanan ip adresinin 255.255.255.0 subnetmask inde bulunan tüm ip”ler limite dahil olur. Belirtilmediği durumda 0 kabul edilir.

12- –hashlimit-dstmask

–hashlimit-srcmask ile kullanımı aynı olup hedef ip adreslerini gruplar.

MAC Match

–mac-source

bash-3.2# iptables -A INPUT -m mac –mac-source 00:00:00:00:00:01
bash-3.2#
Gelen paketin kaynak MAC adresini belirtmek için kullanılır. sadece PREROUTING,INPUT ve FORWARD chainleri ile birlikte kullanılabilir. ( Route edilmiş bir paketin Source mac adresi değişmiş olacağı için normal olarak diğer chainler ile kullanılamaz. )

Helper Match

–helper

bash-3.2# iptables -A INPUT -p tcp -m helper –helper ftp-21
bash-3.2#

ip_conntrack helper’ları belirtmek için kullanılır irc,ftp vb.

IP Range Match

IP Rannge Match, –source,–destination matchler deki gibi tek bir kaybak yada hedef yerine çoklu kaynak ve hedef belirtimini sağlar.

1- –src-range

bash-3.2# iptables -A INPUT -p tcp -m iprange –src-range 192.168.1.13-192.168.2.19
bash-3.2#

IP kaynak adreslerini belirtmek için kullanılır bu örnekde 19.168.1.13 adresinden 19.168.2.19 a kadar olan tüm IP adreslerini belirttik.

2- –dst-range

bash-3.2# iptables -A INPUT -p tcp -m iprange –dst-range 192.168.1.13-192.168.2.19
bash-3.2#
IP Hedef adreslerini belirtmek için kullanılır. Yukardaki örnek ile aynı olup kaynak adresler yerine hedef adresleri belirtilmiştir.

Multiport Match

Bir çok port veya port alanlarını belirtmek için kullanılırlar.

1- –source-port

bash-3.2# iptables -A INPUT -p tcp -m multiport –source-port 22,53,80,110,70:80
bash-3.2#

Bir çok kaynak portunu belirtmek için kullanılır. farklı portlar “,” ile ayrılıp en fazla “,” ile ayrılmış 15 girdi girilebilir. belirli bir port aralığını belirtmek için “70:80″ örneğinde 70 den 80 e kadarolan port adresleri belirtildiği  gibi “:” şeklinde belirtilir.

2 –destination-port

bash-3.2# iptables -A INPUT -p tcp -m multiport –destination-port 22,53,80,110,200:210
bash-3.2#

Birçek hedef port’u belirtmek için kullanılır. kullanımım şekli –source-port ile aynıdır.

3- –port

bash-3.2# iptables -A INPUT -p tcp -m multiport –port 22,53,80,110
bash-3.2#

Hedef ve Kaynak portunu aynı anda belirtmek için kullanılır. kullanım şekli ve limiti –source-port ile aynıdır. bu match in uyması için kaynak ve hedef port aynı olmak zorundadır.

Length Match

–length

bash-3.2# iptables -A INPUT -p tcp -m length –length 1400:1500
bash-3.2#

Paketin kaç byte büyüklüğünde olduğunu belirtmek amacı ile kullanılır. değeri byte’dır. burada 1400-1500 byte arası büyüklükteki paketler belirtilmiştir.

Mark Match

bash-3.2# iptables -t mangle -A INPUT -m mark –mark 1
bash-3.2#

Daha önceden iptables tarafından Mark’lanmış ( işaretlenmiş ) paketleri belirtmek için kullanılır. iptables 32 bit sistemlerde “4294967296″ adet mark yapabilir.

Owner Match

Çalışıan bir proses’in ( proğram ) sahibini belirtmek için kullanılır. yaratılan bir process dışarıya bağlanmak istediğinde iptables ile kural tanımlamamıza olanak sağlar. Dışarıdan gelen paketlerin kullanıcı bilgisini alma ihtmalimiz olmadığı için sadece OUTPUT ve POSTROUTING chain ile kullanılabilir.

1- –uid-owner

bash-3.2# iptables -A OUTPUT -m owner –uid-owner 500
bash-3.2#

User ID ( kullanıcı ) belirtmek için kullanılır. kullanıcı id olarak numerik veya direk isim verilebilir örn : root,alper,hhtpd vs.. numerik verildiğinde 500-600 gibi belirli bir uid aralığı tanımlanabilir.

2- –gid-owner

bash-3.2# iptables -A OUTPUT -m owner –gid-owner 0
bash-3.2#

Grup ID belirtmek için kullanılır. yine numerik yerine isim kullanılabilir.

Packet Type Match

–pkg-type

bash-3.2# iptables -A OUTPUT -m pkttype –pkt-type unicast
bash-3.2#

Paket tipinin unicast,multicast veya broadcast olduğunu belirtmek için kullanılır.

Realm Match

–realm

bash-3.2# iptables -A OUTPUT -m realm –realm 4
bash-3.2#

Routing realm belirtmek için kullanılır direk isim veya buradaki gibi numerik kullanılabilir. ( /etc/iproute2/rt_realms )

Tcpmss Match

–mss

bash-3.2# iptables -A INPUT -p tcp –tcp-flags SYN,ACK,RST SYN -m tcpmss –mss 2000:2500
bash-3.2#

Maksimum Segment Size nedir ? sorusuna kısaca değinelim. TCP paketlerinde 20 byte ipv4 de 40 byte ipv6 da yer tutar source ve destination *2 ekleyerek  MTU ( Maksimum Transmission Unit ) =1492 olduğunda 1492-40 = 1450 MSS değerimiz elde edilir. (mtu 1492  adsl içindir ). bu değerden daha büyük tcp paketleri fragmante olarak ( parçalanarak ) iletilirler. bir TCP bağlantının MSS inin nekadar olduğunu belirtmek için kullanılır.

TOS Match

–tos

bash-3.2# iptables -A INPUT -p tcp -m tos –tos 0×16
bash-3.2#

Tos field nedemek ? daha önce TC ile fifo yazımda belirtmiştim. bu match TOS field daki değerleri belirtmek için kullanılır. numerik yerine isim de kullanılabilir bunlar :

iptables -m tos -h komutu ile görebileceğimiz üzere ;

[!] –tos symbol          Match TOS field (IPv4 only) by symbol
Accepted symbolic names for value are:
(0×10) 16 Minimize-Delay
(0×08)  8 Maximize-Throughput
(0×04)  4 Maximize-Reliability
(0×02)  2 Minimize-Cost
(0×00)  0 Normal-Service
Şeklinde dir.

TTL Match

1- –ttl-eq

bash-3.2# iptables -A OUTPUT -m ttl –ttl-eq 60
bash-3.2#

TTL değerinin tam olarak kaç olduğunu belirtmek için kullanılır. veya “!” ile kaç olmayacağını

2- –ttl-gt

bash-3.2# iptables -A OUTPUT -m ttl –ttl-gt 60
bash-3.2#

Belirtilen değerden daha yüksek TTL değerlerini belirtmek için kullanılır. buradaki örnekte 60 dan büyük ttl değerleri belirtilmiş.

3- –ttl-lt

bash-3.2# iptables -A OUTPUT -m ttl –ttl-lt 60
bash-3.2#

Belirtilen değerden daha düşük TTL değerlerini belirtmek için kullanılır.

Recent Match

Recent Match, Paketlerin ne kadar süre önce kullanıldığı ve kaç defa kullanıldığı gibi bilgileri bellirtmemize yarayan Match’dir. örneğin : dakikada 3 den fazla ssh bağlantısı yapılmaya çalışıldığını belirtmek gibi.

Recent Match, çoğu kişi tarafından tam anlaşılmayan, bazı durumlarda çok önemli bazı durumlarda ise sisteme ciddi bir yük ve yavaşlık getiren bir match olmasıdır. Recent match “ipt_recent” modulünü kullanır. “/proc/net/ipt_recent” içerisinde dosyalar oluşturup bilgileri buraya yazarak takip eder. örnek bir çıktı ;

src=10.70.20.1 ttl: 64 last_seen: 83912663 oldest_pkt: 3 83879026, 83895619, 83912663

src : isteği yapan kaynak adresi

ttl : gelen paketin TTL değeri

last_seen = paket en son görüldüğü zaman

oldest_pkt :

83879026 = en eski paketin zamanı ve bundan sonra paketlerin sırasıyla görüldüğü zamanlar.

buradaki zaman  = uptime saniye / jiffie dir.

/proc/net/ipt_recent içerisindeki listelerin yönetimi :

echo xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT‘ DEFAULT listesine xx ile belirtilen adresi ekler.
echo -xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT‘ xx ile belirtilen adresi DEFAULT listesinden çıkarır
echo clear > /proc/net/ipt_recent/DEFAULT‘ DEFAULT isimli listeyi temizler.

Modulün kabul ettiği parametreler :

ip_list_tot=100 ; Tabloda kaç adet adresin hatırlanacağı.
ip_pkt_list_tot=20 ; Her adres için kaç paketin hatırlanacağı geçerli olan 20 dir.
ip_list_hash_size=0 ; Hash tablo büyüklüğü “0″ ip_list_tot a göre otamatik hesaplanması içindir buradaki değeri 512 ye eşittir.
ip_list_perms=0644 ; /proc/net/ipt_recent/*  içerisindeki dosyaların izinlerinin ne olduğunu belirtmek için.
debug=0 ;

1- –name

/proc/net/ipt_recent/ içerisinde hangi dosyaya yazılacağını belrtmek için kullanılır. Herhangi bir isim verilmezse DEFAULT dosyasına yazılır.

2- –set

bash-3.2# iptables -A INPUT -m recent –set –name SSH
bash-3.2# ls /proc/net/ipt_recent/
SSH  examplelist
bash-3.2#

Bu parametre paketin source adresini listeye ekler. Eğer hali hazırda listede kaynak adresi varsa günceller.

3- –rcheck

bash-3.2# iptables -A OUTPUT -m recent –name examplelist –rcheck
bash-3.2#

rcheck kaynak adresinin hali hazırda listede olup olmadığını kontrol eder.

4- –update

bash-3.2# iptables -A OUTPUT -m recent –name examplelist –update
bash-3.2#

–set ile aynı işi yapmakla beraber hali hazırda listede kaynak adresi yoksa eklemez.

5- –remove

bash-3.2# iptables -A INPUT -m recent –name example –remove
bash-3.2#

kaynak adresinin listede olup olmadığını kontrol eder. hali hazırda listede varsa listeden siler.

6- –seconds

bash-3.2# iptables -A INPUT -m recent –name example –rcheck –seconds 60
bash-3.2#

sadece –rcehck ve –update ile beraber kullanılır. belirtilen saniyeler içerisinde kaynak adresinin kullanılıp kullanılmadığını kontrol eder. örneğin “–seconds 60″  60 saniye içerisinde kullanılıp kullanılmadığını kontrol etmek amacı ile kullanılır.

7- –hitcount

bash-3.2# iptables -A INPUT -m recent –name example –rcheck –hitcount 20
bash-3.2#

Kısaca kaynak adresinin kaç kere kullanıldığını kontrol etmek için kullanılır.

8- –rttl

bash-3.2# iptables -A INPUT -m recent –name example –rcheck –rttl
bash-3.2#

–rttl kaynak adresinin listede olup olmadığını ve, eğer listede ise yeni paketin ve eski paketin TTL değerlerinin uyup uymadığını kontrol eder.

9- –rsource

bash-3.2# iptables -A INPUT -m recent –set –name example –rsource
bash-3.2#

Kaynak adresinin listeye yazılması için kullanılır. Default’tur yani belirtilmediğinde iptables –rsource var kabul eder.

10- –rdest

bash-3.2# iptables -A INPUT -m recent –set –name example –rdest
bash-3.2#

Destination ( hedef ) adres ve portu listeye yazmak için kullanılır.

Recent match’in diğer Match lerden daha farklı bir yaklaşımı olduğu için tam anlaşılmadığının farkındayım, iptables yazımın sonunda verecek olduğum örneklerle çok daha iyi anlaşılacaktır.

Connbytes Match

Connbytes bir paketin ( bağlantının ) veya birden fazla bağlantının oluşturduğu veri akışının byte olarak ölçülerek büyüklüğünü belirtmek için kullanılır. mesela 300 mbyte dan fazla paket transferi yapan bir bağlantının download olduğunu analiz etmek gibi. çok dikkat edilmesi gereken nokta; Connbytes sayaçları 64 bit dir. maksimum değeri 0xffff0000 byte yani 3.99 gbyte dir. yani daha yüksek değerler için connbytes kullanılamaz !

bash-3.2#  iptables -A INPUT -m connbytes –connbytes 10000:100000 –connbytes-dir both –connbytes-mode bytes
bash-3.2#

1- –connbytes from[:to]

Yukardaki örnekde’de görüldüğü gibi belirtilen değere göre paket veya byte olarak büyüklüğü ifade eder bu örnekde 10000 byte ile 10000 byte arası verilmiş “10000:”
10000 ve daha büyük, “:10000″ 10000 ve daha küçük şeklinde kullanılabilir. “! 10000:” şeklinde 10000 ve daha büyük olmayan şekilde belirtilebilir.

2- –connbytes-dir {original|reply|both}

Hangi paketin göz önüne alınacağını belirtmek için kullanılır. ( hangi yön )

3- –connbytes-mode {packets|bytes|avgpkt}

bytes : değerlerin byte olarak gösterildiğini, packets: değerlerin paket olarak gösterildiğini, avgpkt; bir paketin ortalama kaç byte olacağını belirtmek için kullanılır.

Connlimit Match

Connlimit Match –limit match le benzerlik gösterir. paralel bağlantıları belirtmemize yarar. örneğin http server imize bir ip adresinden veya network bloğundan kaç adet http bağlantısının aynı anda yapılabileceğini belirtmek gibi.

–conlimit-above

bash-3.2#  iptables -A INPUT -p tcp –syn –dport 23 -m connlimit –connlimit-above 2 -j REJECT
bash-3.2#

Belirtilen değerden daha yüksek bağlantının aynı anda olduğunu belirtmek için kullanılır. Yukarıdaki örneğimizde aynı anda 2 den fazla telnet bağlantısının bir ip adresinden yapılmasını engelledik.

–connlimit-mask

bash-3.2#  iptables -A INPUT -p tcp –syn –dport 23 -m connlimit –connlimit-above 2 –connlimit-mask 24 -j REJECT
bash-3.2#

CIDR mask belirtmek için kullanılır. yukarıdaki örnekde herhangi bir 24 bit network’den telnet bağlantısını 2 ile sınırlandırdık. ( 192.168.0.1 ip adresinden 1 bağlantı kurulursa 192.168.0.1 netmask 255.255.255.0 network ü için komple limitimiz 2 olur. )

DCCP Match

DCCP RFC 4340 ile belirtilmiş, Datagram Congestion Control Protocol ( Mesaj tabanlı ulaşım katmanı protokü) dür. Konumuzun dışında kaldığı için şimdilik ayrıntısına girmeyeceğim.

–dccp-types

DCCP paket tiplerini belirtmek için kullanılır. farklı tipler “,” ile ayrılarak belirtilebilir. Kullanılabilecek DCCP MAsk’leri ; EQUEST RESPONSE DATA ACK DATAACK CLOSEREQ CLOSE RESET SYNC SYNCACK INVALID

PHSYDEV Match

–phsydev linux bridge için geçerli olan bir match’dir. Sadece Bridge le beraber kullanılır ve Transparent bridging firewall’i enable eder.Sadece Bridged network’ün geçerli olduğu durumlarda kullanılır.

1- –physdev-in

bash-3.2# iptables -A FORWARD -p tcp –dport 22 -m physdev –physdev-in eth1 –physdev-out eth0 -j ACCEPT
bash-3.2#

Hangi bridge interface i üzerinden paketin alındığını belirtmek için kullanılır. Sadece INPUT,FORWARD,PREROUTING chain’ler ile beraber kullanılabilir. interface isminin sonuna “+” eklendiğinde örneğin “eth+” dendiğinde eth* şeklinde ismi eth ile başlayan tüm interface’leri ifade eder.

2- phsydev-out

–physdev-in in aksine giden interface’i ifade eder. Kullanımı aynıdır, Sadece FORWARD,OUTPUT,POSTROUTING chainler ile beraber kullanılabilir.

3- –physdev-is-in

Paketin herhangi bir Bridge interface tarafından alınıp alınmadığını belirtmek için kullanılır ( interface ismi değil )

4- –phsy-is-out

Paketin herhangi bir bridge interface üzerinden gidip gitmeyeceğini belirtmek içn kullanılır.

5- –physdev-is-bridged

bash-3.2# iptables -A FORWARD -p tcp -m physdev –physdev-is-bridged -j ACCEPT
bash-3.2#

Paketin Bridge yapılıp yapılmadığını belirtmek için kullanılır. belirtilen paket bridge yapılmıştır route edilmemiştir. Sadece FORWARD ve POSTROUTING chainler ile kullanılabilir. örnekte bridge yapılmış tcp paketlerini belirttik.

Policy Match

Bu match Ipsec tarafından kullanılan policy’leri belirtmek için kullanılır. Konumuz ipsec olmadığı için fazla ayrıntılarına girmeyeceğim. ipsec konusuna yabancı olmayan arkadaşların kolayca anlayabileceğini düşünüyorum.

1- –dir {in|out}

Yazılan policy match’in decapsulate yada encapsulate edileceğini belirtmek için kullanılır. in ( decapsulation ) PREROUTING,INPUT ve FORWARD chain’de kullanılabilir. out ( Encapsulation ) POSTROUTING,OUTPUT ve FORWARD chain’de kullanılabilir.

2- –pol {none|ipsec}

Paketin ipsec ile işlenip işlenmeyeceğini belirtir.

3- –strict

girilen policy nin tam Match sağlayıp sağlamadığını kontrol etmek içn kullanılır.

3- –reqid id

reqid belirtmek için kullanılır ( setkey ile ipsec için belirtilmişse )

4- –spi spi

SA nin SPI değerini belirtmek için kullanılır.

5- –proto {ah|esp|ipcomp}

Paketin hangi protokolle Encapsule edildiğini belirtmek için kullanılır.

6- –mode {tunnel|transport}

Encapsulation modu

7- –tunnel-src addr[/mask]

Tunnel mode SA için end point ( tunelin nerede sonlanacağı source tarafı) sadece –mode tunnel ile beraber kullanılabilir.

8- –tunnel-dst addr[/mask]

Tunnel mode SA için end point hedefini belirtir. ( tunelin nerede sonlanacağı destination tarafı) sadece –mode tunnel ile beraber kullanılabilir.

9- -next

bir sonraki policy elementini tayin etmek için kullanılır sadece –strict ile beraber kullanılabilir.

örnek :

iptables -A FORWARD -m policy –dir out –pol ipsec –mode tunnel –tunnel-src 10.1.2.0/24 –tunnel-dst 10.1.1.0/24 -j DROP
iptables -A FORWARD -m policy –dir in  –pol ipsec  –mode tunnel –tunnel-dst 10.1.2.0/24 –tunnel-src 10.1.1.0/24 -j DROP
iptables -A FORWARD -m policy –dir in –pol ipsec –mode tunnel –tunnel-src 10.1.2.0/24 –tunnel-dst 10.1.1.0/24 -j DROP
iptables -A FORWARD -m policy –dir out  –pol ipsec  –mode tunnel –tunnel-dst 10.1.2.0/24 –tunnel-src 10.1.1.0/24 -j DROP

Elimde ipsec yapısı bulunmadığı ( ve bu yazı hali hazırda çok uzun sürdüğü ) için örnekleri direk olarak uygulayamadım. Örnekler komut diziminde yardımcı olacaktır.

Quota Match

iptables ile transfer kotaları tanımlamamıza yarar, iptables’in çalıştığı makina devamlı açık olmalı ve firewall kuralları resetlenmemelidir aksi takdirde kota sayaçları sıfırlanır.

–quota

bash-3.2# iptables -A INPUT -p tcp -m quota –quota 2147483648 -j ACCEPT
bash-3.2#

byte olarak kota belirlememizi sağlar. örneğimizde 2GB tcp bağlantılar için kota tanımladık. kota durumları iptables -v -L ile görüntülenebilir.

bash-3.2# iptables -v -L INPUT
Chain INPUT (policy ACCEPT 5432 packets, 3037K bytes)
pkts bytes target     prot opt in     out     source               destination
313  129K ACCEPT     tcp  –  any    any     anywhere             anywhere            quota: 2147483648 bytes
bash-3.2#

129 Kbytes alışveriş yapıldığı görülüyor.

Statistic Match

Statistic match ( istatistik ), daha önceki iptables sürümlerinde NTH ve random match lerin birleşimidir. ikisini ayrı ayrı “–mode” opsiyonu ile birlikte kullanabilirsiniz. NTH ve Random eski kullanımları için patch-o-matic ile yüklenmelidirler. Statistic match randomize işlemleri gerçekleştirmek için kullanılır. genellikle loadbalance gibi amaçlarla kullanım alanı bulur.

1- –mode

İlgili rule için mod’u temsil eder “nth” veya “random”

2- –probability

1 pakete kuralın rasgele denk gelme ihtimali ( sadece random mode ile çalışır ). değeri 0 ila 1 arasındadır. 1 %100 ihtimaline denk gelir 0.5 = %50

3- –every

Sadece nth modla çalışır. her nth paketten her birini ifade eder örneğin –every 3 her 3 paketten manasına gelir.

4- –packet

Başlangıç sayaç değeri ( 0 < değer < (every değeri -1) olarak belirtilmiş iptables man’inda. every ile belirtilen değerden kaç’ı ? şeklinde yorumlanabilir örneğin “–every 3 –packet 1″ her 3 paketten 1 ini.

örnekler :

Statistic match en çok load balancing için kullanılıyor.

Örnek 1 :

iproute2 ile load balance yapılmış 2 isp ( ipadresleri 10.0.0.1 ve 192.168.0.1 oalrak kabul edilmiştir. ) örneğin adsl bağlantıları arasında load balance. bu yapıda gelen paketlerden 0,2,4,6… gibi sayaç saymaya başladığında paketlerin çift olanları ilk isp’ye tek olanlarıda ikinci isp ye gidecektir.

bash-3.2# iptables -t nat -A POSTROUTING -m statistic –mode nth –every 2 –packet 0 -j SNAT –to-source 10.0.0.1
bash-3.2# iptables -t nat -A POSTROUTING -m statistic –mode nth –every 2 –packet 1 -j SNAT –to-source 192.168.0.1
bash-3.2#

Örnek 2 :

Yukarıdaki örneğin random mode ile uygulaması

bash-3.2# iptables -t nat -A POSTROUTING -m statistic –mode random –probability 0.5 -j SNAT –to-source 10.0.0.1
bash-3.2# iptables -t nat -A POSTROUTING -m statistic –mode random –probability 0.5 -j SNAT –to-source 192.168.0.1
bash-3.2#

Örnek 3 :

Herbir 2 icmp paketinden 1 inin düşürülmesi ( every 2 packet 1 DROP )

bash-3.2# iptables -A INPUT -p icmp  -m statistic –mode nth –every 2 –packet 1 -j DROP
bash-3.2#
Sonuç :

— 10.70.20.3 ping statistics —
22 packets transmitted, 10 packets received, 54.5% packet loss
round-trip min/avg/max/stddev = 0.854/1.377/2.559/0.513 ms

[root@gariban /home/alper]#

String Match

Paket string’leri belirtmeye yarar. örneğin command.exe, veya hotmail.com yahut irc de nickinizin geçtiği paketi düşürmek gibi işemlerde kullanılabilir. Gerçekten kullanımında çok dikkat edilmesi gereken match. öncelikle CPU kullanımı çok yüksektir. gerçek bir IDS in yerini asla tutmaz IDS önleme sistemleri kolayca geçebilir. dolayısıyla kesin bir güvenilirliği yoktur . “exe” nin yasaklanmasının “msexell” in erişimini de yasaklayacağı için içerisinde msexcell kelimesinin geçtiği bir site açılmayacaktır ( http için kullanıldığında ), ne yaptığınızı bilmiyorsanız veya kesinlikle ihtiyacınız yoksa asla kullanmayın !

1- –algo

Paket math stratejisini seçmek için kullanılır . (bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)

2- –from ofset

Paketin neresinden itibaren bakılacağını belirtir. ( default 0 )

3- –to ofset

paketin neresinde aramanın sonlanacağını belirtir ( default paket büyüklüğü )

4- –string pattern

Match edecek kelimeyi belirtir. örneğin “–string google” içerisinde google geçen paketlerin belirtiminde kullanılır.

4- –hex-string pattern

Stringle aynıdır değeri hex olarak girmek için kullanılır.

örnekler :

bash-3.2# iptables -A INPUT -p tcp -m string –string “google” –algo kmp -j DROP
bash-3.2#

Herhangi bir tcp paketinde google kelimesini arar. ve droplar. örneğin irc de google kelimesinin kullanılması veya http de.

  • Multiple string

bash-3.2# iptables -A INPUT -p tcp -m string –string “google” –algo kmp -m string –string “yahoo” –algo kmp -j DROP
bash-3.2#
aynı anda hem yahoo ve google kelimesinin  geçtiği paketleri işaret eder.

Time Match

Time Match, zamana bağlı veya belirlenen zaman aralığında iptables kurallarını çalıştırmak için kullanılan match dir.

1- –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

2- –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

datestart başlangıç ve datestop bitiş olmak üzere kuralın hangi tarihlerde çalışacağını belirtmek için kullanılır. time formatı ISO 8601 “T” formatında olmalıdır. örneğin : 2009-05-21T00:00:00 , 2009 yılı, Mayıs ayı, Ayın 21′i , saat 00:00:00′i işaret eder. herhangi bir datestart değeri verilmezse default “1970-01-01T00:00:00″ kabul edilir. datestop değeri verilmezse “2038-01-19T04:17:07″ default değeri kabul edilir.

3- –timestart hh:mm[:ss]

4- –timestop hh:mm[:ss]

timestart başlangıç, timestop bitiş saatini belirtir. saat aralıkları 00:00:00 ile 23:59:59 arasında verilmelidir. saniyeler gerektiğinde “18:00″ gibi göz ardı edilebilir.

5- –monthdays day[,day...]

Ayın hangi gününde kuralın çalışıcağını belirtmek için kullanılır. Ayın 1 inde 7 sinde şeklinde belirtmek için “–monthdays 1,7″ şeklinde kullanılır. 31 gibi tarihler girildiğinde ayın o gününü içermeyen aylarda ( örneğin şubat ) kural Match etmez herhangi bir hata alınmaz.

6- –weekdays

Haftanın hangi günlerinde Match edeceğini belirtmek için kullanılır. İngilizce günlerin kısaltılması şeklindedir. Mon, Tue, Wed, Thu, Fri, Sat, Sun, veya ilk iki harfleri, istenirse haftanın günü rakam olarak da kullanılabilir. pazartesi =1 pazar =7 “–weekdays 1,7″ şeklinde.

7- –utc

Kuralların UTC’ye göre çalışması için.

8-  –localtz

Kuralların lokal saate göre çalışması için kullanılır ( lokal zaman defaulttur. )

örnekler :

bash-3.2# iptables -A OUTPUT -o eth0  -m time –weekdays Sa,Su -j DROP
bash-3.2#
eth0 interface’i üzerinden Saturday ve Sıunday ( Cumartesi ve Pazar ) giden paketleri engelledik.

bash-3.2# iptables -A OUTPUT -o eth0  -m time –weekdays Fr –monthdays 22,23,24,25,26,27,28 -j DROP
bash-3.2#

Aynı kural ayın son haftası cuma günleri için belirledik.

Rateest

Rateest match tek başına anlaşılması güç olduğu için rateest target ile beraber ayrı bir yazımda anlatacağım.

u32 Match

u32 match, tcp header ve payload gibi bir çok değeri belirtebildğimiz bir match dir. u32 match’i daha iyi anlaşılabilmesi için ayrı bir  yazımda yazmayı tercih ediyorum.

iptables -5- Tables & Chains

9 May, 2009 (02:29) | iptables | By: alper

iptables belirli bir tablo ( table ) ve zincir ( chain ) yapısıyla gelir. Sistemimize giren bir paketin hangi sıra ve hiyerarşi ile  işlem göreceğine, yada yazmış olduğumuz kuralları amaçlarına göre bu tablolara yerleştirmek efektif bir iptables kural dizisi yazmak için son derece önemlidir. konuyu daha iyi kavramak için öncelikle tablolara ( tables ) göz atalım.

Mangle Table

Mangle’in ingilizce olarak kelime manalarından bir tanesi bozmak olsada tam olarak buradaki kullanımının karşılığını bulamadım.Mangle table iptablesda paketlerin bazı değerlerini değiştirmek için kullanılır, bunlar :

  • TOS
  • TTL
  • MARK
  • SECMARK
  • CONNSECMARK

1. TOS :

TOS nedir ? sorusunun cevabını, TC ile Fifo yazımda değinmiştim. Mangle table içerisinde gerekli görüldüğünde paketlerin TOS field’larının içerikleri değiştirilebilir. Örneğin başka bir router’i bilgilendirmek, Routing parametrelerini değiştirmek veya iproute2 paketini bilgilendirmek gibi.

Örnek :

bash-3.2# iptables -A PREROUTING -t mangle -p tcp –dport 22 -j TOS –set-tos Minimize-Delay
bash-3.2#

Örnekte ssh için TOS Düşük gecikme için işaretlenmiş oldu.

2. TTL

TTL nedir ? “Time To Live” yaşam süresi Kaynaktan çıkan internet paketleri belirli bir TTL değeri ile oluşturulurlar. Hedefe ulaşana kadar üzerinden geçilen her Router bu değeri bir azaltarak  sonraki noktaya iletir. TTL Sifir’a eşit olduğunda TTL’in 0 olduğu router paketin kaynağına ICMP Unreachable döndürerek bağlantının kapatılmasını sağlar. ve paketi daha ileri noktalara ulaştırmaz. Örneğin network router’ımızın tamamen görünmez olmasını sağlamak istediğimizde TTL değerlerini “–ttl-inc 1″  parametresini kullarak bir düşürdüğümüz TTL değerini geri yükseltebiliriz.

3. MARK

iproute2 paketi ile haberleşmek için kullanılır.

4. SECMARK

SELinux ve benzeri yapıları haberdar etmek için kullanılır. tek bir paketin SElinux için işaretlenmesine yarar.

5. CONNSECMARK

SECMARK ile kullanıcı amacı aynıdır farkı, komple bağlantıların işaretlenmesi için kullanılmasıdır. konumuz SELinux olmadığı için bunların ayrıntılarına girmeyeceğim.

NAT Table :

İsminden kullanım amacı gayet net anlaşılan bir tablo. Network Adress Transilation’için kullanılır. Kullanılabilecekler :

  • DNAT
  • SNAT
  • MASQUERADE
  • REDIRECT

1. DNAT

DNAT ” Destination Network Address Transilation” Hedefe dayalı NAT, genellikle local networkde verilen hizmeti internete açmak gibi amaçlarla kullanılır. DNAT’in çalıştığı firewall a gelen istekler isteğin geldiği ip adresi, isteğin yapıldığı protokol port gibi bilgilere dayanarak başka bir ip adresine gönderilir. Kısacası pkaet header’da destination adres değiştirilerek yeniden yazılır.

2. SNAT

SNAT ” Source Network Address Transilation” Kaynak NAT, Paket header’da DNAT in yaptığının tersine Destination adresi değil source adresi değiştirir.

3. MASQUERADE

Masquerade kullanımı SNAT’a benzerlik taşır.

En büyük farkı transilate edilecek olan ip adresini otamatik olarak kontrol etmesidir ki buda bize ppp gibi dinamik ip adresi ile çalışan interface’ler üzerinden nat yapmamızı sağlar. daha basit yaklaşacak olursak evimizde bulunan ADSL bağlantımızı lokal istemcilerimize MASQUERADE sayesinde paylaştırırız.

4. REDIRECT ( paketin yolunu değiştirmek )

Redirect ( yeniden yönlendirme ) tam olarak gelen paketi, iptables olan makinada başka bir porta yönlendirmek için kullanılır. paketin Source ve Destination parametrelerini değiştirmez. örneğin herhangi bir adrese yapılan http ( TCP 80 ) isteğini Kendi üzerinde bulunan veya diğer bir makina üzerinde bulunan squid proxy için 3128 nolu porta göndererek transparent proxy yapılandırmak gibi.

RAW Table :

RAW ( işlenmemiş ham ) table, temel olarak tek bir amaç için kullanılır. NOTRACK opsiyonu ile beraber connection tracking ( ip_conntrack ) tarafından bir paketin dokunulmaması, takip edilmemesi. Daha önceden’de gördüğümüz üzere linux connection tracking ile gerçekten sistem kaynaklarını tüketebiliyor. gerek duymadığımız veya sisteme büyük yük getiren paketleri sınıflandırarak bu işlemin dışarısında tutabilmemiz için oluşturulmuştur.2.6 kernelin ilk sürümlerinde ve daha önceki kernel sürümlerinde mevcut değildir.

FILTER Table :

Filter ( filitre ) tablosu paketler üzerinde Drop,Accept gibi filtre şlemlerini uygulayabileceğimiz ve işaretleme için filitre uygulayabileceğimiz bir tablodur.

Şimdi Chains konusuna yeniden göz atalım. Chains yani zincirler iptables kuralları arasında grupları temsil eder, örneğin default olarak iptables ile beraber gelen 3 tane chain ( grup ) vardır. INPUT bilgisayara gelen ler için tanımladığımız kuralları , FORWARD bilgisayarımız üzerinden başka bir kaynağa yönlendiren kuralları. OUTPUT ise bilgisayarımızdan çıkıp başka yerlere giden bağlantılar için koyduğumuz kuralları temsil eder. Demiştik. Peki Netfilter üzerinde bir paketin yolculuğu nasıl oluyor ve kurallarımızı neye göre yazmalıyız. öncelikle paketlerin iptables üzerinde akış diyagramına bakalım.

tables1

Şeklimizi biraz açıklayalım. RAW,MANGLE,NAT,FILTER tablolarının ne işe yaradıklarına değinmiştik. interface’imize gelen bir paket öncelikle PREROUTING chain e gelir. paketin destination adresi değiştirilecekse burada yapılır. örneğin NAT. daha sonra Routing kararı paket hedefi local host ise input, başka bir hedef ise FORWARD chain’e gönderilir.  bundan sonrasını daha iyi anlamak için değişik senaryolar üzerine gidelim.

örnek1 : paket hedefi local host ( linux router in kendisi )

2

İnterface’imiz üzerine gelen paket ( mesela ethernet ) her ne durumda olursa olsun PREROUTING zinciri üzerinden geçmek zorunda kalıyor. daha sonra ROUTING kararı hedefin local process yani linux üzerinde bulunan bir ip adresi olduğu yönünde olduğu için INPUT zincir ine yönlendirilerek işleniyor. örneğin linux üzerinde çalışan apache web server’e gelen istekler iptables üzerinde bu yolu izler. Yapılan işlemleri biraz daha yakından inceleyecek olursak :

  1. RAW PREROUTING : connection tracking module’ün bu paketi izleyip izlemiyeceğine karar verebileceğimiz yer.
  2. MANGLE PREROUTING : gelen paketin işlenmesi için gerekli değerlerin değiştirilmesi ( TOS vb )
  3. NAT PREROUTING : şayet paket NAT gibi bir işleme tabi tutulacaksa işlenmesi.
  4. ROUTING Kararı : paket in local işlem için INPUT zincir ine yönlendirilmesi.
  5. MANGLE INPUT : Mangle işleminin sadece local paketler için gerçekleştirilmesi
  6. FILTER INPUT : Drop deny Accept gibi kuralları local e gelen paketler için uyguladığımız yer. burada gelen interface ve hangi yönden geldiğinin önemi yoktur.
  7. LOCAL İŞLEM : server veya client proğramı örneğin apache web server e ulaştırılması ve işlenmesi.

örnek2 : kaynak biz hedef başka adres :

3

Local bir process tarafından üretilen paketin ( istemci veya server ) iptables üzerinde işlenme sırası.

  1. LOKAL İŞLEM : Server veya Client paketi üretiyor.
  2. ROUTING kararı : Hangi source adresin kullanılacağı, hangi çıkış interface’inin kullanılacağı, gibi bilgilerin işlendiği yer
  3. RAW OUTPUT : ürettiğimiz paketin connection tracking tarafından işlenmemesi gerektiğini belirttiğimiz yer.
  4. MANGLE OUTPUT : paketler de Mangle işlemini yaptığımız yer. bazı yan etkileri olduğu için burada kullanılması tavsiye edilmiyor.
  5. NAT OUTPUT : Lokal proğram tarafından üretilen paketin NAT yapıldığı yer.
  6. FILTER OUTPUT : Drop Deny Accept gibi işlemler.
  7. ROUTING kararı : burası local üretilen paketler için işlevsizdir ( yok kabul edilir )
  8. MANGLE POSTROUTING :  Firewall imizi paket terketmeden önce Mangle yaptığımız yer.
  9. NAT POSTROUTING : SNAT ” Source Network Address Transilation”‘in gerçekleştiği yer. dikkat eilecek konu : burada filter yapılmaması, bazı paketler default drop olduğu halde buradan geçebiliyor.
  10. Çıkış interface’i örneğin ethernet

örnek3 : FORWARDED paketler. ( kaynak ve hedef firewall in kendisi değil )

4

  1. RAW PREROUTING : connection tracking module’ün bu paketi izleyip izlemiyeceğine karar verebileceğimiz yer.
  2. MANGLE PREROUTING : gelen paketin şlenmesi için gerekli değerlerin değiştirilmesi ( TOS vb )
  3. NAT PREROUTING : DNAT işleminin uygulandığı yer.
  4. ROUTING Kararı : paket in forward edilmesi için FORWARD zincirine yönlendirilmesi.
  5. MANGLE FORWARD : Son routing kararı verilmeden önce yapılması istenen mangle işlemleri için.
  6. FILTER FORWARD : forwarded paketler için filter kurallarımızı uyguladığımız yer. dikkat edilmesi gereken nokta tek bir yöne giden paketlerin değil tüm forward edilmiş paketlerin buradan geçtiği. kuralları yazarken dikkat edilip göz önüne alınması gerekiyor.
  7. MAGLE POSTROUTING : Firewall imizi paket terketmeden önce Mangle yaptığımız yer.
  8. NAT POSTROUTING : SNAT ” Source Network Address Transilation”‘in gerçekleştiği yer. dikkat edilecek konu : burada filter yapılmaması, bazı paketler default drop olduğu halde buradan geçebiliyor. MASQUAREDE’de burada gerçekleştirilir.
  9. Çıkış interface’i örneğin ethernet.




iptables -4- States & Connection Tracking

28 April, 2009 (07:51) | iptables | By: alper

Statefull firewall ne demek daha önce değinmiştik. şimdi iptables’ile bunun nasıl gerçekleştirildiğine daha yakından bakalım.

Statefull firewaling için linux State machine dediğimiz olaydan daha çok tracking machine olarak çalışır ( iz sürme makinası ), Sıksık ikisinin manası birbiri ile karıştırılsada aslında farklıdır. Yazıyı okuyup nasıl çalıştığı hakkında daha iyi bilgi edindiğinizde bunun önemini daha iyi anlayacağınızı ümit ediyorum.

.

Connection Tracking :


Linuxda connection tracking bazı özel uygulamalar haric ( irc, ftp vb ), ip_conntrack modülü ile sağlanır. hemen modüle yakından göz atalım.

bash-3.2# modprobe ip_conntrack
bash-3.2#
cat /proc/net/ip_conntrack dediğimizde şu şekilde bir çıktı alırız.

bash-3.2# cat /proc/net/ip_conntrack
tcp      6 98 TIME_WAIT src=10.70.20.3 dst=78.129.231.111 sport=60842 dport=80 packets=9 bytes=3980 src=78.129.231.111 dst=10.70.20.3 sport=80 dport=60842 packets=8 bytes=1154 [ASSURED] mark=0 secmark=0 use=1
tcp      6 38 TIME_WAIT src=10.70.20.3 dst=78.129.231.111 sport=60841 dport=80 packets=9 bytes=3804 src=78.129.231.111 dst=10.70.20.3 sport=80 dport=60841 packets=8 bytes=1154 [ASSURED] mark=0 secmark=0 use=1
tcp      6 431756 ESTABLISHED src=10.70.20.3 dst=93.94.250.210 sport=46845 dport=80 packets=10 bytes=1258 src=93.94.250.210 dst=10.70.20.3 sport=80 dport=46845 packets=8 bytes=10356 [ASSURED] mark=0 secmark=0 use=1
tcp      6 291 ESTABLISHED src=213.219.249.66 dst=10.70.20.3 sport=6667 dport=38699 packets=419 bytes=153150 src=10.70.20.3 dst=213.219.249.66 sport=38699 dport=6667 packets=459 bytes=29964 [ASSURED] mark=0 secmark=0 use=1
bash-3.2#

Biraz karışık gibi görünsede aslında oldukça basit, en alttaki freenode bağlantımızı alıp yakından inceleyelim.

tcp      6 291 ESTABLISHED src=213.219.249.66 dst=10.70.20.3 sport=6667 dport=38699 packets=419 bytes=153150 src=10.70.20.3 dst=213.219.249.66 sport=38699 dport=6667 packets=459 bytes=29964 [ASSURED] mark=0 secmark=0 use=1

Girdimiz bize ne diyor ?

  • Bir protokolümüz var ve bu TCP dir.
  • 6 yine TCP protokolüne  işaret edip tcp yerine decimal code olarak işaret edilmiş.
  • Bu conntrack girdisi ne kadar süreyle kalmalı ( yaşamalı ) 291 sn eğer linux üzerinden söz konusu bağlantı ile ilgili hiç bir trafik geçmezse azalarak 0 a ulaştığında bu girdi silinir. (CLOSED )
  • ESTABLISHED TCP bağlantının gerçekleştirildiğini ve iki nokta arasında data akışı olduğunu gösteriyor ( daha sonra ayrıntılarına gireceğiz. )
  • src : paketi gönderen kaynak adresi, dikkat edilmesi gereken konu freenode server’a irc için bağlantı isteğini ilk ben göndermeme rağmen, kaynak freenode hedef benim local ip adresim görünüyor
  • dst : paketin gideceği hedef adres benim local ip adresim.
  • sport : bağlantı yapan kaynak adresdeki kaynak port numarası yani freenode üzerinde irc server’inden istek geliyor.
  • dport : hedef tcp portu
  • packets : 459 bytes 1 tcp paketinin boyutu
  • bytes : bu bağlantı için gelen byte miktarı
  • Buradan sonrası yukarıdakilerle aynı farkı ise tcp connection iki taraflı olduğu için busefer bizden freenode a giden bağlantının bilgilerini gösteriyor.
  • mark=0 secmark=0 use=1 şu an için bizi ilgilendirmiyor.
  • ASSURED bağlantının iki taraftanda yapılıp gerçekleştiğini belirtiyor. İstek yapılıp cevap dönmemiş olsaydı UNREPLIED olarak işaretlenecekti.

iptables ile statefull firewalling sanıldığından daha kompleks bir konudur. Eğer webde biraz araştırma yapacak olursanız forumların bunun la ilgili yaşanan problemlerle dolup taştığını gözlemlersiniz. Sorun linux da herhangi bir eksiklik olmasından değl, konunun tam olarak anlaşılmamasından dolayı çıkmaktadır. bu yüzden öncelikle ip_conntrack modülünün yapılandırılmasına daha yakından göz atalım.

/proc/sys/net/ipv4/netfilter/ip_conntrack_max

Aynı anda kaç adet connection tracking yapabileceğimizi belirtir. ” cat /proc/net/ip_conntrack | wc -l ” diyerek anlık kaç bağlantı olduğunu görebilirsiniz.

cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max ” izin verilen maximum girdiyi gösterir. Aynı çıktıya sysctl ile bakmak için ” sysctl -n net.ipv4.netfilter.ip_conntrack_max ” komutunu kullanabilirsiniz. Ne kadara izin verilmesi gerektiğinin gerçekten bir ölçüsü yok, resferans olmamak kayıdı ile normal bir web kullanıcısını 50 yi geçmediğini, torrent kullanıcısının 250 ye erişebildiğini söyleyebilirim. Eğer bir web server imiz varsa her bir kullanıcının 1 adet girdi işgal edeceğini belirtmeye gerek yok sanırım. söz konusu limit dolduğunda “ip_conntrack: table full, dropping packet.” hatası alınır.

Connection tracking RAM ve CPU harcamasında hiç te iktisatlı değildir. Düşük limit vermek paketlerimizin drop olmasına yol açarken yüksek limit vermekte sistem kaynaklarımızın bitmesine sebebiyet verebilir. 1 gb ram için bu değer “net.ipv4.netfilter.ip_conntrack_max = 65536″ olarak görülebilir. Peki 1 gb ram’imiz yoksa ? connection tracking kernel’de çalıştığı için swap kullanamaz. Bu değeri’de elimizde bulunan boş ram miktarına göre optimize etmeliyiz. Table dolduğunda yeni paketler droplanmakla beraber daha önceden yapılmış bağlantılar işlerine devam edeceklerdir. Söz konusu sorun özellikle şirketlerde firma tarafından tavsiye edilen, makimum client adedinden daha fazlasının bağlanmış olduğu linux tabanlı ADSL modem/router larda yada networkde kaynakları tüketen bir virus olduğunda aktif bağlantıların ( irc download rdp vb. ) işlerine devam edebildiği halde yeni bir bağlantıya izin vermemesi şeklinde görülür. örneğin yeni bir websayfası açıldığında internet bağlantınız yokmuş gibi sayfa görüntülenemiyor hatası alırsınız ama hali hazırda devam eden işlemleriniz kesintiye uğramaz.

ip_conntrack_max değerinin ram’e göre hesaplama formülü :

CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (x / 32)

Buradaki X değeri CPU architecture gösterir. 32bit veya 64 bit gibi
örneğin 1gb ram için CONTRACK değeri 65536 32 bit sistemler için 64 bit sistemler için ise 131072 dir.( firewall sistemleri 64 bit üzerine kurmak için jiffie hariç ikinci bir sebep )

echo “yenideğer” > /proc/sys/net/ipv4/netfilter/ip_conntrack_max diyerek yeni değeri girebilirsiniz. yada sysctl kullanarak : sysctl net.ipv4.netfilter.ip_conntrack_max=65536 gibi. Bu değeri /etc/sysctl.conf içerisine girerek her açılışta aktif olmasını sağlayabilirsiniz.

.

Kullanıcı Tarafındaki State’ler :


Connection tracking tablolarındaki state’ler ; kullanılan protokole bağlı olarak bir çok değer içerebilir. bunun yanında –state parametresi ile iptables’kullanabileceğimiz ana state ( durum)’lar mevcuttur. bunlar.

NEW :

Örneğin tcp bağlantıda SYN isteği gönderilip herhangi bir data geri dönmemişse NEW şeklinde bir state alırız. Ne yazıkki durum her zaman bu şekilde değildir. Bazı durumlarda, SYN olmasada state table a yeni girmiş paketler NEW olarak adlandırılabilirler. Diğer firewallarla yapılan bağlantılar kaybolduğunda, Bağlantı timeout olduğu halde oturumun kapatılmadığı gibi durumları tesbit etmek için kullanılabilir.

ESTABLISHED :

En basit anlatımıyla Bir host diğer bir host a bir paket gönderip diğer taraf ona cevap verdiğinde paketin State table’da durumu NEW olmaktan çıkarak ESTABLISHED durumuna geçer. protokole göre değişik şartlar gerekebilir. örneğin : ICMP reply mesajları yeterlidir.

RELATED :

Hali hazırda State table içerisinde ESTABLISHED olarak bilinen bir bağlantı varsa, Server tarafından ikinci bir bağlantı yapılmaya çalışılıp kernel tarafından bunun söz konusu ESTABLISHED bağlantı ile alakalı olduğu anlaşılırsa RELATED state durumu söz konusu olur. basitleştirmek için örnek verecek olursak : dcc için irc modülü yüklendiğinde kernel DCC isteği geldiğinde bunun irc bağlantısı için olduğunu çözümleyerek RELATED olarak işaretlemektedir. ( bu konuya daha sonra ayrıntılı değineceğiz Kompleks bağlantılar )

INVALID :

Bu Bilinen diğer State kavramlarına giren paketleri belirtmek için kullanılır. genellikle sistem ram i tükendiğinde veya, bilinmeyen bir ICMP error mesajı dönüldüğü gibi sebeplerden oluşur. genel olarak bu durumdaki paketlerin droplanması iyi bir yöntemdir.

UNTRACKED :

iptables tarafından -j NOTRACK olarak işaretlenmiş paketlerdir. bu durumda paketlerin Statelerinin izlenemeyeceğini göz ardı etmeyiniz. ( Statefull firewaling ve nat helpers kullanılamaz bu pakette )

.

TCP Bağlantılar :


Bir TCP bağlantısı her zaman için 3 way handshaking  ( 3 yollu el sıkışması ) ile oluşur. Önce bir host diğerine SYN isteği gönderir. İstek gönderilen host SYN/ACK ile geri döner, son olarakta ilk isteği yapan host ACK göndererek bağlantı kurulmuş olur. Linux connection tracking ile buna biraz daha yakından bakalım.

Kullanıcı tarafındaki stateler’de de gördüğümüz gibi linux connection tracking kullanıcı bakış açısıyla gerçekten TCP bağlantıları bu şekilde takip etmez. Host SYN isteği gönderdiğinde kullanıcı için bu NEW karşı taraf SYN/ACK gönderdiğinde ise ESTABLISHED bağlantı olarak adlandırılır ( işaretlenir )

tcp1

Bu resim gerçektende TCP connection tracking’in nasıl çalıştığını basit ve hoş bir şekilde anlatıyor. Şimdi ” cat /proc/net/ip_conntrack ” çıktısında görülecek olan çıktılara göz atalım. Host un SYN paketi gönderip henüz cevap almadığı durumda aşağıdaki gibi bir çıktı alırız.

tcp     6 117 SYN_SENT src=192.168.1.5 dst=192.168.1.35 sport=1031 \
dport=23 [UNREPLIED] src=192.168.1.35 dst=192.168.1.5 sport=23 \
dport=1031 use=1

Gördüğünüz üzere, SYN_SENT flag’i atanmış durumda, henüz bir cevap gelmediği içinde UNREPLIED olarak görünüyor. Şimdi SYN gönderilen Host dan SYN/ACK geldiği duruma göz atalım.

tcp     6 57 SYN_RECV src=192.168.1.5 dst=192.168.1.35 sport=1031 \
dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 \
use=1

SYN_RECV , bize SYN paketimizin karşıya doğru olarak ulaştırılıp,SYN/ACK doğru olarak yeniden döndüğünü gösteriyor, yalnız 3 way handshaking hala tamamlanmadığı için ESTABLISHED duruma geçmedi,

tcp     6 431999 ESTABLISHED src=192.168.1.5 dst=192.168.1.35 \
sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 \
sport=23 dport=1031 [ASSURED] use=1

Ve sonunda, ACK paketi döndürülerek, bağlantının gerçekleştiğini ve 3 way handshake’in tamamlandığını ESTABLISHED flag’indan anlıyoruz. Bağlantının gerçekleştiği ASSURED flag i alarak temin edilmiş oluyor.

Peki TCP bağlantımız sonlanırken ne olur ? yine 1 resim kullanımı anlamamız için  en kısa yol olacaktır.

tcp2

Resimde gayet net olarak görüldüğü gibi normal şartlar altında sadece son ACK paketi gidene kadar bağlantı hala ESTABLISHED kalıyor. Normal şartlar harici bir bağlantının bitirildiği durumlarda mevcuttur. örneğin TCP/RST gönderildiğinde bağlantı anında sonlanacak yani CLOSED durumuna geçecektir. CLOSED’ dan sonra contrack içerisinde bağlantı TIME_WAIT flag’i alır. TIME_WAIT  sisteme pakette olan herhangi bir gecikmeye karşı, işini tamamlaması için bir buffer amacı ile konulmuştur. default olarak genel linux sürümlerinde süresi 2 dakikadır.

TCP RST paketi geldiğinde bağlantı 10 saniye içerisinde kapatılır. bununla ilgili değerlere bakmak ve değiştirebilmek için Sistemimizde bulunan timeout değerlerine bakalım :

contrack timeouts :

ESTABLISHED

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
432000
bash-3.2#
432000 saniye = 5 gün

SYN_SENT

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
120
bash-3.2#

SYN_RECV

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_recv
60
bash-3.2#

FIN_WAIT

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
120
bash-3.2#

TIME_WAIT

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_time_wait
120
bash-3.2#

CLOSE

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close
10
bash-3.2#

CLOSE_WAIT

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait
60
bash-3.2#

LAST_ACK

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_last_ack
30
bash-3.2#

yukardaki değerleri /proc içerisinden değiştirmeniz mümkün olduğu gibi sysctl ile de ulaşmak mümkündür ( Kişisel tercihim sysctl kullanılması yönünde  )

sysctl -a | grep tcp_time

conntrack’in tcp flaglarına userland statelerde bakmaması genel bir dez avatajdır. örneğin iptables ile NEW flag’ina izin verdiğinizde ilk gelen bağlantı bir syn paketi olmasa bile NEW olarak algılanacaktır. bununla ilgili iptables kuralları ile durumu kontrol atlına alabileceğiniz gibi, firewall harici bir çözüm daha vardır ;

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_loose
1
bash-3.2#

söz konusu değeri proc içerisinden veya sysctl ile 0 değerine aldığınızda, SYN flag’i almamış tüm tcp paketleri kernel tarafından düşürülecektir. tcp_window_tracking extension paketi daha önce patch-o-matic ile beraber eklenmesi gereksede güncel bir çok linux sürümlerinde default gelmektedir.

.

UDP Bağlantılar :


UDP bağlantılar yapıları itibari ile statefull bağlantılar değillerdir. Yinede buna rağmen elde edilen verilere dayanarak linux kerneli bunu gerçekleştirmeye çalışır. Her nekadar basit bir yöntem olsada bir dereceye kadar firewall ların güvenliklerini arttırmakta yeterlidir.

udp

Yukarıda da göreceğiniz gibi yenibir UDP bağlantı yapılmaya çalışıldığında NEW durumuna, karşı taraftan cevap geldiği anlaşıldığında ise basitçe ESTABLISHED durumuna geçer. paket header’larında bununla ilgili bir girdi olmadığı için mantıksal olarak yapılır. UDP paket ilk gönderildiğinde ( istek yapıldığında ) conntrack içerisinde aşağıdaki gibi bir veri elde ederiz.

udp     17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 \
[UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 \
dport=137 use=1
görüldüğü üzere UNREPLIED olarak işaretlenmiş. karşı taraftan ilk cevap geldiğinde ise :

udp     17 170 src=192.168.1.2 dst=192.168.1.5 sport=137 \
dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 \
dport=137 [ASSURED] use=1
Conntrack paketi ASURED olarak işaretliyor. ikisi arasındaki temel farklar, UNREPLIED durumundaki paket için timeout süresi 20 ms, ASURED durumundaki ise 180 ms ( default )’dir. ESTABLISHED yazısı gelmesede UNREPLIED in silinmesi established bağlantı kurulduğuna işaret eder.

UDP paketlerde oturum kapatmak için TCP de bulunan FIN ve RST gibi kavramlar olmadığı için, ESTABLISHED ve UNREPLIED paketler için timeout süreleri atanmıştır ve başka bir parametre içermezler. Bu süreçler zarfında herhangi bir paket iletişimi olmazsa conntrack sonlandırılır.

UDP Time out süreleri için sysctl değişkenleri :

net.netfilter.nf_conntrack_udp_timeout = 30
net.netfilter.nf_conntrack_udp_timeout_stream = 180

stream ESTABLISHED için, diğeri ise UNREPLIED içindir. aynı şekilde /proc altındanda veya sysctl ile bu değişkenler tanımlanabilir.

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout
30
bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_udp_timeout_stream
180
bash-3.2#

.

ICMP bağlantılar :


ICMP protokolü kontrol amaçlı bir protokol olduğu için asla ESTABLISHED bir bağlantıya ihtiyaç duymaz. Bu yüzden statefull bir paket değildir. Yine UDP’de olduğu gibi netfilter mantık yoluyla ICMP paketlerini track eder.

icmp1

Resimde de görüldüğü üzere, Server üzerinden ICMP echo isteği ( ping ) istemciye gönderiliyor. Bu durumda conntrack paketi UNREPLIED olarak işaretler. echo reply geri döndüğünde ise bağlantı ESTABLISHED duruma geçer.  şimdi UNREPLIED için girdimize bakalım.

icmp     1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 \
id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 \
type=0 code=0 id=33029 use=1

Değişkenler şimdiye kadar gördüklerimizle aynı sanırım kolaylıkla çözümleyebilirsiniz. Burada fazladan eklenmiş olan iki adet alan mevcut. code ve id code standart ICMP kodlarına tekamül eder. type=8 echo isteğini gösteriyor.

ICMP kodları.

Type Name Reference
—- ————————- ———
0 Echo Reply [RFC792]
1 Unassigned [JBP]
2 Unassigned [JBP]
3 Destination Unreachable [RFC792]
4 Source Quench [RFC792]
5 Redirect [RFC792]
6 Alternate Host Address [JBP]
7 Unassigned [JBP]
8 Echo [RFC792]
9 Router Advertisement [RFC1256]
10 Router Solicitation [RFC1256]
11 Time Exceeded [RFC792]
12 Parameter Problem [RFC792]
13 Timestamp [RFC792]
14 Timestamp Reply [RFC792]
15 Information Request [RFC792]
16 Information Reply [RFC792]
17 Address Mask Request [RFC950]
18 Address Mask Reply [RFC950]
19 Reserved (for Security) [Solo]
20-29 Reserved (for Robustness Experiment) [ZSu]
30 Traceroute [RFC1393]
31 Datagram Conversion Error [RFC1475]
32 Mobile Host Redirect [David Johnson]
33 IPv6 Where-Are-You [Bill Simpson]
34 IPv6 I-Am-Here [Bill Simpson]
35 Mobile Registration Request [Bill Simpson]
36 Mobile Registration Reply [Bill Simpson]
37 Domain Name Request [RFC1788]
38 Domain Name Reply [RFC1788]
39 SKIP [Markson]
40 Photuris [RFC2521]
41 ICMP messages utilized by experimental [RFC4065]
mobility protocols such as Seamoby
42-255 Reserved [JBP]

ICMP kodlarının ayrıntılarına burada daha fazla girmek istemiyorum. Sanırım yukarıdaki tablo yeterli referans olur. ICMP ID alanı ise, tüm ICMP paketlerinin içerisinde, ne zaman gönderildiği,alıcının nezaman aldığı parametrelerine bağlı olarak doldurulur. Bu şekilde alıcının doğru icmp paketine cevap verdiği doğrulanmış olur. a bilgisayarından b bilgisayarına aynı anda 2 adet icmp echo isteği gönderdiğimizde TCP gibi port kavramı olmadığı için ID field olmadan bu paketlerin birbirinden ayrılması imkansız olurdu. Pakete ICMP REPLIED mesajı geldiğinde ise ESTABLISHED duruma geçer.

ICMP nin temel kullanımı oldukça basit olsada diğer bir kullanım yeri daha vardır.TCP veya UDP bağlantı kurmaya çalıştığımızda karşı tarafta herhangi bir şekilde paketin ulaşamaması durumunda HOST veya router paketin akibeti hakkında ICMP cevabı döner örneğin host-unrechable ( host ulaşılamaz ).

icmp2

Resimden de anlaşılacağı üzere. istemcimiz bir SYN isteği göndererek server üzerinde bir TCP hizmeti almak istiyor. söz konusu network ulaşılamadığı için server ICMP NET Unreach mesajı geri gönderiyor. Söz konusu mesajı alan istemci Abort ederek oturumu sonlandırıyor. bu durumda söz konusu ICMP paketi için conntrack girdisi RELATED olarak işaretlenir.

icmp3

Benzer bir durum yukardaki resimde görüldüğü üzere UDP içinde geçerlidir. UDP kendisi Statefull bir protokol olmasada Server üzerinde firewall veya farklı bir yönetimsel engel ile karşılaşılıp server ICMP Net Prohibited ( yasaklanmış) mesajı dönebilir. bu durumdada ICMP paketi RELATED olarak işaretlenerek client üzerinde UDP oturumu sonlandırılır.

ICMP için timeout parametresi /proc altında :

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_icmp_timeout
30
bash-3.2#

yani 30 saniye sysctl ile ise :

bash-3.2# sysctl -n net.ipv4.netfilter.ip_conntrack_icmp_timeout
30
bash-3.2#

Şeklindedir.

.

Varsayılan bağlantılar :


Bazen bir paketin herhangi bir sınıfa conntrack tarafından sınıflandırılamadığı durumlarda default connections ( var sayılan bağlantılar ) için geçerli ayarlar dikkate alınır. kullanılan protokole ( örneğin ETBLT, MUX and EGP. ) ve link e göre ayarlama gerektiği durumlar olabilir.

proc değeri :

bash-3.2# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_generic_timeout
600
bash-3.2#
yeni kernellerde ( 2.6.29 örneğin ) daha eskilerde ise “/proc/sys/net/ipv4/netfilter/ip_ct_generic_timeout” olarak rastlanabilir.

sysctl ile ise :

bash-3.2# sysctl -n net.ipv4.netfilter.ip_conntrack_generic_timeout
600
bash-3.2#

Yani 10 dakika

.

Kompleks bağlantılar :


Bazı bağlantıların takibi oldukça kompleksdir. Örneğin ftp bağlantıları, ftp client’i ilk önce ftp control session olarak bilinen bir bağlantı kurar (TCP Port 21 ), buraya kadar yukarıda gördüğümüz standart TCP bağlantı ile aynıdır. Daha sonra ftp iki türlü yapılıyor olabilir aktif veya pasif ftp. Aktif ftp bağlantısı yapıldığında client bağlandıktan sonra server’a yeni bir port ve ip adresi bildirir. ftp client söz konusu portu açar ve server in bu portdan yeni bir bağlantı kurması için beklemeye başlar. söz konusu açılan port 1024-65535 arasında  rasgele seçilir. FTP client in istemiş olduğu data bu port üzerinden server in sağladığı bağlantı üzerinden gönderilir. Bu durumda firewall’in yeni oluşturulacak bağlantı portları hakkında bilgisi yoktur. Söz konusu bilgiler paket header içerisinde değil payload data ( server e gönderilen bilgi ) içerisinde bulunur. Normal şartlar altında server’in yeni oluşturmak istediği TCP bağlantı firewall tarafından engellenecektir. FTP connection tracking modülü söz konusu port ve ip bilgilerini data içerisinden alarak Server üzerinden gelen paketleri RELATED olarak işaretleyerek bu durumun önüne geçer.

ftp1

Resimde görüldüğü gibi FTP için server in gönderdiği SYN isteği RELATED olarak işaretlendi. takibinde SYN/ACK oluşması ile ESTABLISHED durumuna geçti.

Pasif FTP bağlantılarda ise tersi bir durum söz konusudur. Client FTP bağlantısını sağlayıp pasive mode’a geçtikten sonra Data aktarımları 20 nolu port ( FTP-DATA port ) üzerinden gerçekleştirilir.Data aktarımları için 20 nolu port üzerinden yapılan bağlantılar yine RELATED olarak işaretlenir.

ftp2

Linux altında şekilde olduğu gibi bir yapı oluşturabilmek için ftp connection tracking modulü olan ftp conntrack modülünü yüklememiz gerekir.

bash-3.2# modprobe ip_conntrack_ftp
bash-3.2#

Elbette Bu şekilde kompleks bağlantı sadece FTP için geçerli değildir. söz konusu conntrack modullerinden sisteminizde hangilerine sahip olduğuna şu şekilde bakabilirsiniz.

bash-3.2# cat /proc/config.gz | gunzip | grep CONNTRACK
CONFIG_NF_CONNTRACK=m
CONFIG_NF_CONNTRACK_MARK=y
CONFIG_NF_CONNTRACK_SECMARK=y
CONFIG_NF_CONNTRACK_EVENTS=y
CONFIG_NF_CONNTRACK_AMANDA=m
CONFIG_NF_CONNTRACK_FTP=m
CONFIG_NF_CONNTRACK_H323=m
CONFIG_NF_CONNTRACK_IRC=m
CONFIG_NF_CONNTRACK_NETBIOS_NS=m
CONFIG_NF_CONNTRACK_PPTP=m
CONFIG_NF_CONNTRACK_SANE=m
CONFIG_NF_CONNTRACK_SIP=m
CONFIG_NF_CONNTRACK_TFTP=m
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
CONFIG_NF_CONNTRACK_IPV4=m
CONFIG_NF_CONNTRACK_PROC_COMPAT=y
CONFIG_NF_CONNTRACK_IPV6=m
bash-3.2#

Kompleks bağlantılar sadece statefull firewalling için değil aynı zamanda NATD arkasında çalışan clientler için de geçerlidir. söz konusu istemcilerin sağlıklı çalışmaları için NETFILTER natd modulleride içerir.

bash-3.2# cat /proc/config.gz | gunzip | grep CONFIG_NF_NAT_
CONFIG_NF_NAT_NEEDED=y
CONFIG_NF_NAT_SNMP_BASIC=m
CONFIG_NF_NAT_PROTO_DCCP=m
CONFIG_NF_NAT_PROTO_GRE=m
CONFIG_NF_NAT_PROTO_UDPLITE=m
CONFIG_NF_NAT_PROTO_SCTP=m
CONFIG_NF_NAT_FTP=m
CONFIG_NF_NAT_IRC=m
CONFIG_NF_NAT_TFTP=m
CONFIG_NF_NAT_AMANDA=m
CONFIG_NF_NAT_PPTP=m
CONFIG_NF_NAT_H323=m
CONFIG_NF_NAT_SIP=m
bash-3.2#

Linux dağıtımınızda ihtiyacç duyduğunuz bir conntrack modülü mevcut değilse patch-o-matic ile kurabilirsiniz.

Optimizasyon :

Yazımızın başındada belirttiğimiz gibi conntrack gerçekten cpu ve ram canavarı haline dönüşebilir. İyi bir firewall planlamasında, Bağlantı izleme ve Statefull firewalling özelliklerine ihtiyaç duymadığımız, yada elimizdeki hardware’in kaldıramayacağı ölçüde yük getiren hizmetleri NOTRACK olarak işaretlemeliyiz. NOTRACK kullanımına daha sonraki yazılarımda ayrıntılı olarak değineceğim.

iptables -3- iptables temel komutları.

25 April, 2009 (23:43) | iptables | By: alper

iptables genel kullanımı :


iptables [-t table] command [match] [target/jump]


iptables komutunun en temel kullanımı yukarda görüldüğü şekildedir.

-t table :

“-t table” kullanılarak default table harici başka bir table’a eklemek için kullanılır. kullanılması zaruri bir parametre değildir. table belirtilmediği müddetçe rule default table a eklenir. “-t table” kural içerisinde hernangi bir yere konulabilir, kural başlangıcına konulmak zorunda değildir.

command :

command ( komut ) herzaman en başa  gelmelidir. sadece “-t table” kullanıldığında table parametresinden sonra kullanılabilir. command iptables ‘a ne yapacağını söyledeğimiz yerdir örneğin : kural ekle, kural sil gibi.

match :

kernel’e kural için geçerli olan ip paketinin karakteristiği hakkında bilgi vermek için kullanılır örneğin : şu ip adresinden gelen, şu protokol, şu port vb gibi.

target :

paketler için gerekli şartlar sağlandığında match gibi kurallar tuttuğunda kernel’e söz konusu paket ile ne yapacağını söylemek amacı ile kullanılır. örneğin : paketi başka bir hain e yönlendir, paketi göz ardı et, başka bir kaynağa yönlendir gibi.

Commands ( Komutlar ) :


Şimdi iptables ile kullanabileceğimiz komutlara bir göz atalım ;

-A –append

iptables -A INPUT

Bu komut belirtilen zincir’in en sonuna belirtilen kuralı ekler. Başka bir deyişle daha sonra bir kural daha eklenmediği müddetçe bu kural zincir içerisinde en son paketin kontrol edileceği yer olur.

-D –delete

iptables -D INPUT –dport 80 -j DROP, iptables -D INPUT 1

Bir zincirdeki belirtilen kuralı siler. İki türlü kullanımı vardır , Silmek istediğiniz kuralı aynen belirterek silebilirsiniz veya kurallar eklenirken tüm kurallara 1 den başlayarak bir numara verilir söz konusu rule numarası belirtilerek’de silinebilir.

-R –replace

iptables -R INPUT 1 -s 192.168.0.1 -j DROP

Yer değiştirmek. daha önceden girilmiş olan bir kuralı silmek yerine yenisi ile değiştirmek amacı ile kullanılır. kullanımı -D ile aynı olup farkı silmek yerine yeni eklediğiniz kural ile yerdeğiştirmesidir. yukarıdaki örnekde INPUT içerisindeki 1 nolu kuralı yer değiştiriyor.

-I –insert

iptables -I INPUT 1 –dport 80 -j ACCEPT

Belirtilen zincirde belirtilen kural sıralamasında araya bir kural eklemek için kullanılır. örneğin yeni bir kural eklemek istiyoruz. daha önceden eklediğimiz bir yada bir kaç kural söz konusu paket için farklı işlemleri daha önceden gerçekleştirdiği için bu kural kullanılmaz duruma düşüyorsa söz konusu kurallardan önce bu kuralı araya girmemiz gerekebilir. daha basit anlatımıyla 192.168.1.1 den gelen tüm paketleri drop eden bir kuralımız varsa sonradan ekleyeceğimiz bu ip adresinden gelen http isteklerine izin veren kural tamamen işlevsiz olacaktır. söz konusu drop kuralından öncesine rule numarası girerek “insert” ederiz.

-L –list

iptables -L INPUT

Belirtilen tablo veya zincirdeki kuralları listeler.  örneğimizde INPUT zinciri içerisindeki tüm kuralları listeliyoruz. Çıktı sonuçları opsiyonlara göre değişebilir -n -v gibi opsiyonlar kullanılabilir. ( opsiyonlara az sonra değineceğim )

-F –flush

iptables -F INPUT

Bir zincir’in içerisindeki tüm kuralları silmek için kullanılır. Söz konusu zincir içerisindeki kuralların hepsini silmek istediğimizde tek tek -D komutu kullanmaktan hızlı olduğu için eklenmiştir. zincir belirtilmediği takdirde belirli tabloların içerisindeki tüm kuralları siler.örneğimizde INPUT zinciri içerisindeki tüm kuralları siliyor.

-Z –zero

iptables -Z INPUT

iptables kuralları sayaçlara sahiptir. Bu sayaçlar söz konusu kural ile eşleşmiş olan paketler hakkında bilgileri içerir. herhangi bir amaç için bu sayaç bilgilerini resetlemek istediğinizde -Z kullanılır. -Z sayaçların değerlerini göstermeden sildiği için genelde -L ile beraber kullanılır. Belirli bir kuralın veya komple bir zincirin içerisindeki kuralların sayaçlarını sıfırlamak için kullanılabilir.

-N –new-chain

iptables -N izinliler

Yeni bir chain eklemek için kullanılır ( bir önceki yazımda görmüştük )

-X –delete-chain

iptables -X izinliler

Belirtilen zinciri silmek için kullanılır.  Bu komutun kullanılması için , söz konusu zincir içerisinde herhangi bir kuralın bulunmaması gerekmektedir. Herhangi bir zincir adı belirtilmediğinde belirli tablo içerisindeki tüm zincirleri siler. -X şeklinde değişik bir parametrenin kullanılma sebebini coder daha iyi tüm harflerin daha önceden başka amaçlar için kullanılması olarak belirtmiş. rneğimizde izinliler zinciri siliniyor.

-P –policy

iptables -P INPUT DROP

Daha önceki yazımda policy nedemek görmüştük. -P parametresi ile belirtilen zincir ierisinde paket herhangi bir kurala uymazsa pakete nasıl davranılacağını belirtmek için kullanılır. Buradaki örnekte INPUT zincirinde herhangi bir kural tarafından işlenmeyen paketin default olarak drop edileceği belirtiliyor.

-E –rename-chain

iptables -E izinliler izinsizler

Belirtilen zincir isminin yeni bir isimle değiştirilmesi için kullanılır. izinliler zincirinin izinsizler olarak yeniden adlandırılması gibi.

Opsiyonlar :


opsiyon : -v –verbose

Beraber kullanılabileceği komutlar : –list, –append, –insert, –delete, –replace

İlgili komutlarla beraber daha ayrıntılı çıktı almak için kullanılır. örneğin –list ile birlikte kullanıldığında, kuralin ilgili olduğu interface adresini , rule opsiyonlarını, TOS marklari da gösterir. aynı zamanda byte ve paket sayaçlarını da gösterir. sayaçlar -K X1000 -M X1000000 -G X1000000000 gibi değerlerle görünebilir. bunu engellemek için -x opsiyonu ile beraber kullanarak tam sonuçlar alınabilir.

opsiyon : -x –exact

Beraber kullanılabileceği komutlar : –list

verbose çıktının kısaltmalar halinde değil tam değerini görmek için kullanılır.

opsiyon : -n –numeric

Beraber kullanılabileceği komutlar :–list

list ile beraber kullanılır sadece, söz konusu görüntülenen kuraldaki değerlerin numara olarak görüntülenmesi amacı ile kullanılır örneğin hostname yerine ip adresi www yerine tcp 80 şeklinde görünmesi gibi. söz konusu değerler şayet numeric değerlere değiştirilebiliyorsa numeric olarak gösterilir. örneğin çözümlenemeyen dns adresleri isim olarak görünmeye devam edecektir.

opsiyon : –line-numbers

Beraber kullanılabileceği komutlar : –list

Sadece –list ile beraber kullanılan bu opsiyon kuraları listelerken başlarına Satır numaraları verir. Söz konusu satır numaraları kural numarasına eşittir. insert komutu ile yeni bir kural ekleneceği zaman kuralın hangi numara ile ekleneceğini belirlemek gibi amaçlarla kullanılır.

opsiyon : -c –set-counters

Beraber kullanılabileceği komutlar : –insert, –append, –replace

Yeni bir kural oluştururken yada yapılandırırken kuralın sayaçlarını modifiye etmek için kullanılır. örneğin : –set-counters 20 4000 şeklinde kullanarak paket counter’i 20 ye ve byte counter’ını 4000′e ayarlayabiliriz.

opsiyon : –modprobe

Beraber kullanılabileceği komutlar : Hepsi

iptables kuralı herhangi bir modüle gerek duyarsa yüklemek amacıyla kullanılır.  Tüm komutlarla beraber kullanılabilir.

iptables ile kullanılan komut ve opsiyonları kısaca görmüş olduk.

iptables -2- Terimler

24 April, 2009 (05:04) | iptables | By: alper

iptables terimleri :

iptables ile ilgili yazılı dökümanları daha iyi anlamak için ipfilter’ile kullanılan terimlere  daha yakından bakmamız yerinde olur.

Drop/Deny :

Bir paket için Drop veya Deny terimi kullanıldığında söz konusu paket basitçe yok olur. istemciye herhangi bir cevap gönderilmez. paket firewall da sonlanmış olur.

Reject :

Reject Deny/Drop ile aynı şekilde davranır, farkı istemciye paketin göz ardı edildiği veya düşürüldüğüne dair  bir cevap döner. Nomal şartlarda paketin neden geri çevirildiğine dair bilgi ekleyebilsekte. iptables default olarak bunu desteklemez. otamatik olarak üretilen cevap geri gönderilir.

Not : Drop kullanımı geriye bir paket göndermediği için çok daha avantajlı gibi görünsede özellikle host’un DDOS için koruması olmadığı durumlarda bir çok zarar meydana getirebilir. örneğin router arkasında paketleri droplamak routing table’in overload olarak cevap veremez hale düşmesine kısacası aldığımız tedbirin kendimize zarar vermesine sebebiyet verebilir. Alınan her tedbirin yeni bir potansiyel tehdit sahası oluşturduğunu göz ardı etmeyiniz.Drop kesinlikle bir çare olsaydı ipfilter ekibi reject gibi bir terim eklemeye gerek duymazlardı !

State :

Statefull firewall’ing için kullanılır. bir önceki yazımda statfull firewall’ları görmüştük. state ilgili bağlantıların kayıtlarını tutar..

Chain :

Chain ingilizcem manasında olduğu gibi tamamen zincir mantığı ile çalışır. bir zincir içerisindeki kurallar sırasıyla ilgili paket üzerinde uygulanır. Zincirler iyi bir firewall yapılandırmasında belirli amaçlar için düzenlenirler. örneğin : Belirli bir host veya ip grubu hakkında kurallar düzenlemek veya belirli bir uygulama hakkında kurallar düzenlemek için. Zincirlerin çalışma şeklini sanırım aşağıdaki resimden daha net anlayabilirsiniz.

chains

Table :

Tablolar belirli amaçlara göre üretilmiştir. Netfilter 4 adet default table içerir raw, nat mangle ve filter.  bu tabloların ayrıntılarına daha sonra değineceğim. bir tablo içerisinde bir yada daha fazla chain içerebilir.

Match :

Paket header’ina bakılarak söz konusu paketin belirli şartlara uyup uymadığını anlamak için kullanılır. örneğin filter içerisinde -source match kullanılarak paketin belirli bir ip den gelip gelmediğine bakılabilir.

Target :

Bir iptables kuralında söz konusu paket için belirli Match şartları uyuyorsa ( belirli bir ip den gelen gibi ) o paket ile ne yapacağımızı belirtebilmemiz için kullanılır. örneğin başka bir chain e yönlendirmek veya nat yapmak gibi.

Rule :

Rule yani kural, bir Match veya target için eklediğiniz her bir kurala denilsede iptables tek bir kural içerisinde bir çok match ve target tanımlamayı mümkün kılar. kısaca iptables içerisinde tanımladığımız her bir kural demek daha uygun olur sanırım.

Ruleset :

Bir table’in içerdiği tüm kuralların oluşturduğu gruba denir.

Jump :

Jump (sıçramak) mana olarak ve yaptığı iş olarak target ile aynısını yapsada sadece chain ler için geçerlidir. yukardaki resimdeki gibi bir yapı oluşturmak istediğimizde farklı bir chain’i göstermek için jump kullanılabilir. jump başka bir hedef ip göstermk için kullanılamaz.

Accept :

Paketi kabul etmek için kullanılır. kısaca Drop/Deny yada reject etmeyip bir paketin kabulü için kullanılır.

Policy :

Politika kural. Firewall larda default policiy şayet bir paket hiç bir kurala uymuyorsa ne yapacağını belirtmek için kullanılır. örneğin Default policy drop olan bir firewall da hiç bir kurala match olmayan bir paket göz ardı edilecektir.

Connection tracking :

Baplantı izleme, statefull firewall larda kullanılır. iptables ile beraber kullanıldığında çok daha fazla cpu ve ram kullanacağını göz ardı etmemek gerekir. yaklaşık olarak şu şekilde bilgi içerir.

tcp      6 299 ESTABLISHED src=10.70.20.3 dst=86.65.39.15 sport=43426 dport=6667 packets=8 bytes=566 src=86.65.39.15 dst=10.70.20.3 sport=6667 dport=43426 packets=5 bytes=2834 [ASSURED] mark=0 secmark=0 use=1

Connection tracking’in ram ve cpu maliyetlerini göz ardı etmeyiniz. 128 mb ram ayırarak 8192 adet aktif ipv4 bağlantı izleyebileceğinizi belirtmek sanırım iyi bir referans olur.

De-Militarized Zone (DMZ) nedir ?

DMZ’ler genellikle internetten ( yada farklı network kaynaklarından ) ulaşılan server’lerimizi korumak ve aynı zamanda local networklerimizde oluşabilecek virus veya spam gibi tehditlerden söz konusu server’leri korumak için oluşturulan networklerdir. internetten bulduğum aşağıdaki resim sanırım sözden daha güzel açıklıyor.

dmz

iptables -1- iptables’a giriş

23 April, 2009 (01:18) | iptables | By: alper

Firewall Nedir ?


Firewall ( Ateş duvarı ), Internet ve local ağ trafiğinin , kontrol ve denetlemesini yapan yazılımlardır ( hardware firewall’lar olsada içlerinde bir yazılım olmak zorunda olduğunu unutmayın ) . Firewall sayesinde Internet ve local ağ üzerinden belirli portlar, yada belirli ip adresi veya ip gruplarının erişimini engelleyebiliriz. Sanırım iptables ile ilgili bir yazı okumaya karar veren kişi firewall nedemek konusunda hali hazırda fikir sahibidir o yüzden fazla uzatmayacağım :)

Packet filtering firewall :

Bildiğimiz en basit haliyle firewall’dir, istek yapan kişinin ip adresine, port adresine veya gidecek olduğu hedefin port ip adresine yada komple bir ip blok’u için kurallar tanımlamamızı sağlarlar.

örneğin :

1.1.1.1 ip adresinden 80 nolu TCP portu üzerinden erişimi engellemek bu tür bir firewall uygulamasıdır. en yeteneksiz ve basit firewall’dir. bunun yanında en az cpu ve ram ihtiyacı duyan firewall yapısıdırda. diğer firewall yapılarıyla birlikte kulanıldığında kesin olarak bildiğimiz erişimleri bu şekilde denetleyerek engellemek firewall üzerinde cpu ve ram avantajı yaratacaktır. ( etkin bir saldırı veya yanlış yapılandırmada en güçlü firewall cihaz yada yazılımlarının yetersiz kalacağını göz ardı etmeyiniz )

Aplication level firewall : Uygulama Seviyesi firewall

Bu firewall lar Sadece port veya ip yani temel ağ bilgilerine bakmazlar. http://alper.web.tr adresine ulaşmak istediğinizde hedef http://alper.web.tr port 80 ulaşım serbest demek yerine, web sayfasını ziyaret etmek için browserinizin koyduğu içeriği analiz ederek http bilgisisnin olup olmadığınıda kontrol eder.

Statefull firewall :

Statefull firewall yukarıdaki Packet filtering firewall ile aynı mantıkla çalışır, farkı örneğin TCP bağlantıdaki 3 way handshaking dediğimiz olayı kontrol edebilirsiniz. 3 way handshaking de  a makinasından b makinası syn paketi daha sonra b den a‘ ya syn/ack ve yeninden b ye ack paketi gelerek bağlantı kurulmuş olur. Statefull firewall in çalışma şekli genel olarak , istenilen şartlar ( 3way handshaking gibi ) yerine getirildiğinde sadece o bağlantıya özel bir kural eklenerek iletişim sağlanır. herhangi bir saldırı anında saldırganın devamlı olarak syn paketi göndererek sisteminize zarar vermesi bu şekilde önlenmiş olur. Söz konusu eklenen kurallar ram’de yer işgal etsede Aplication lvl firewall lar kadar sistem kaynağı tüketmezler.

Firewall’lar tüm bu özelliklerinin yanında hala bir ip paketinin gerçekten kötü amaçlı olup olmadığını analiz edemezler. Bunları sağlamak için IPS/IDS denilen yazılımlar kullanılırki şu an için bunlara çok fazla giremeyeceğim. günümüzde UTM denilen , ( Unified Threat Management ) firewall,antivirüs, antispam, ids/ips, vpn,router,gibi özellikleri içerisinde barındıran   yazılımsal ve donanımsal firewallar  çıkmıştır. ilk çıktıkları tarihlerde çok başarılı olamasalarda günümüzde oldukça etkin şekilde kullanılıyorlar. Statefull firewall Checkpoint firması tarafından bulunmuş ve standart halini almıştır.

Netfilter nedir ?

Linux kernelinde ( 2.3 ve sonrasında ) , Standart firewalling işlemlerini  ( filtering nat mangle ) yapan kısımdır.

iptables nedir ?

Linux Netfilter için kullanıcı arayüzüdür en basit anlatımıyla.

iptables gerçektende bize standart firewall ihtiyaçlarını fazlasıyla sağlamaktadır.  iptables yukarda saydığımız tüm özellikleri Extensions ( genişleme paketleri )sayesinde sağlayabilir. Linux sistem içerisinde bulunan diğer proğramlarla etkileşimli olarak çalışması için yapılandırılabilir. özellikle iptroute2 paketi ile beraber kullanıldığında routing ve QOS özellikleriyle birlikte paralı bir çok firewall ürününün özelliklerinden fazlasını sağlar.Snort gibi yazılımlarla beraber kullanarak IPS ve IDS gibi özellikleri elde etmeyi mümkün kılar. Günümüzde hemen hemen tüm linux sürümlerinde iptables ve iproute2 paketleri hazır gelmektedir. ( en azından paket yöneticinizle ekleyebilirsiniz ), Bu ilk yazımda iptables oldukça geniş bir konu olduğu için sadece temel bir kaç şeye değineceğim.

iptables ile kuralları görüntülemek :

bash-3.2# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
bash-3.2#

açıklaması :

iptables -L komutu ile daha önceden girilmiş iptables kurallarını görüntüleyebilirsiniz. eğer natd kuralları tanımlı ise görmek için iptables -t nat -L kullanılır.

Chains nedir ?

Chains yani zincirler iptables kuralları arasında grupları temsil eder, örneğin default olarak iptables ile beraber gelen 3 tane chain ( grup ) vardır. INPUT bilgisayara gelen ler için tanımladığımız kuralları , FORWARD bilgisayarımız üzerinden başka bir kaynağa yönlendiren kuralları. OUTPUT ise bilgisayarımızdan çıkıp başka yerlere giden bağlantılar için koyduğumuz kuralları temsil eder. ( nat ve raw a daha sonra değineceğim )

Yeni bir Chain nasıl oluşturulur?

kendi firewall kurallarımızın içerisinde olduğu yeni bir chain ( grup) nasıl oluştururuz ?

bash-3.2# iptables -N yenibirchain
bash-3.2# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain yenibirchain (0 references)
target     prot opt source               destination
bash-3.2#

‘iptables -N ‘ diyerek yeni bir chain oluşturabilriz oluşturduğumuz chainleri silmek istediğimizde -X yada –delete kullanabiliriz.

Not : Aynı isimde ikinci bir chain oluşturulamaz !

Oluşturmuş oldğumuz bir chain’i silmek :

bash-3.2# iptables -X yenibirchain
bash-3.2# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
bash-3.2#

Chain’lerin oluşturulması sanırım anlaşıldı, ( iptables kullanmış olduk :) )  bu gruplar ilerde düzenleyecek olduğunuz kompleks firewall yapılarında yönetimi önemli ölçüde kolaylaştırmaktadır. söz konusu örneklerde bu daha iyi anlaşılacaktır. Burada iptables kullanımını bir yazı ile anlatıp geçmeyi düşünüyordum ama internet okadar çok iptables dökümanı ile doluki ne gönlüm razı oluyor nede bir tane daha yazmaya gerek var. Diğer yazılarımı sabırlı olarak okuyacaklara iptables’i etkili şekilde kullanmaları için yardımcı olabileceğimi sanıyorum. iptables hakkında çok geniş bilgiye ihtiyaç duymayıp basitçe kullanmak isteyen arkadaşlara Enver Altın ( Skyblue ) tarafından yazılmış dökümanı tavsiye ederim.