• 15-08-2009, 10:39:09
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Merhabalar yaklaşık bir ay önce python programlama diline başladım, PHP bilen biri için python öğrenmek çok basit zaten temelde programlamanın mantığını bildiğiniz zaman geriye sadece öğreneceğiniz dilin yazım kuralları kalıyor.Bir arkadaşımın isteği üzerine python'da bir script yazdım ve dağıtmaya karar verdim.
    Script'in görevi nedir diye soracak olursanız.Sunucuya bağlı olan ip adreslerini ve bu ip adreslerinin kaç bağlantı açtığını gösteriyor ve sizin limitlendirdiğiniz bağlantı sayısını aşan ip adreslerini iptables ile banlıyor.
    Script nasıl çalışıyor?
    Örneklerle anlatacak olursak komut satırına python banla.py 120 yazarak scripti çalıştırırsak 120 den fazla bağlantı açan ip adreslerini banlayabiliriz.
    Eğerki sadece python banla.py yazarsak scriptimiz _limit_=int(100) satırında bulunan 100 değerini kullanacaktır yani 100 den fazla bağlantı açanları banlayacaktır.
    Script ip adresini banlarken neler yapıyor?
    Öncelikle python banla.py 150 gibi bir istekte bulunduk.
    Script 150 den fazla bağlantı açan ip adreslerini buldu daha sonra bunları banlayacak ama öncelikle bir kaç evreden geçmesi gerekecek.
    1.Evre : Scriptimiz öncelikle ip.txt dosyasına bakacaktır banlanacak ip adresi ip.txt dosyasında kayıtlımı diye eğer ip.txt dosyasında kayıtlı ise banlamayacaktır fakat kayıtlı değil ise ikinci evreye geçecektir.(banlanmasını istemediğiniz ip adreslerini ip.txt dosyasına alt alta yazabilirsiniz.Çünkü kimse arama motorlarını banlamak istemez herhalde )
    2.Evre : İkinci Evre nedir diye soracak olursanız ikinci evrede yine arama motorları ile ilgili , scriptimiz ip adresinin nereye ait olduğunu sorgulayacak
    bunu nasıl yapıyor diye soracak olursanız bu adres size yardımcı olacaktır.Ben size yinede basit bir şekilde anlatayım Linux sunuculardaki host komutu ile örnek bir çıktı.
    kral@kral:~/Masaüstü/python$ host 66.249.66.1
    1.66.249.66.in-addr.arpa domain name pointer rawl-66-249-66-1.googlebot.com.
    en son nerede kalmıştık host komutu ile ip adresinin hostname'mini alıyoruz ve beyazliste'mizde varmı diye bakıyoruz eğerki beyaz listemizde kayıtlı ise scriptimiz ip adresini banlamıyor ve o ip adresini ip.txt dosyasına kaydediyor böylelikle bir dahaki sefere 2. evreye gerek kalmadan ip adresi banlanmayacak eğerki beyazlistedede yoksa 3.evreye geçecek
    ( Beyaz listeyi beyazliste=["google.com","yahoo.com","bing.com","live.com","ms n.com","msn.net"] satırından değiştirebilirsiniz.)
    3.Evre :Bu evrede ip adresinin bir zombi olduğuna kanaat getiriyoruz ve ip adresini banlanıyoruz.
    Sıra geldi Kodlara:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import	sys
    import	os
    import urllib
    import subprocess as sub
    import cgi
    import re
    import random
    """
    Kodlama By s4l1h
    http://pehepe.blogspot.com/
    Kullanım:
    python banla.py 100    {Sonuç Olarak 100'den fazla Bağlantı Açanları Banlar }
    python banla.py { Sonuç Olarak _limit_ Olarak Belirlediğiniz Sayıda Bağlantı Açanları Banlar}
    _limit_ sayısını aşağıda ayarlar kısmından değiştirebilirsiniz 21 Numaralı Satır.
    """
    """ Ayarlar.. Settings.."""
    _limit_=int(100) # Eğer Parametre Belirtilmez ise Buradaki Limit kullanılır.
    beyazliste=["google.com","yahoo.com","bing.com","live.com","msn.com","msn.net"]
    #Beyaz Liste sunucuda "host 127.1.1.1" Şeklinde Çıkan sonuçta beyaz listedeki isimler varsa banlamaz.. white host name
    _ip_="ip.txt"# white list iplerin yazılacağı dosya
    """ Diğer Kodlarla Oynamanıza Gerek yoktur..."""
    #Botları Denetle
    def botlar(veri):
    	for i in beyazliste:
    		z=veri.find(i)			
    		if z==-1:
    			return False
    		else:
    			return True
    #Komut Çalıştır.
    def calistir(komut):
    	str_command = urllib.unquote(komut)
    	p = sub.Popen(['/bin/bash', '-c', str_command], 
    	stdout=sub.PIPE, stderr=sub.STDOUT)
    	output = cgi.escape(p.stdout.read())
    	return output
    #Whois
    def whoisle(ip):
    	return calistir("host "+ip)
    #Denetleme 
    def denetle(ip):
    	veri=whoisle(ip)
    	if botlar(veri)==True:
    		return True
    	else:
    		return False
    def dosyadan(ip):
    	try:
    		dosya=open(_ip_)
    	except:
    		return True # Dosya Oluşmamış Olabilir Ozamanda True Değerini Döndürüyoruz..
    	v=dosya.read()
    	dosya.close()
    	z=v.find(ip)
    	if z!=-1:
    		return True
    	return False
    #Arama Motoru Botlarını white liste Ekliyoruz..
    def yaz(ip):
    	try:
    		dosya=open(_ip_,"a")
    	except:
    		print _ip_+' Dosyası Oluşturulamıyor Yada Var Olan Dosya Okunamıyor'
    		sys.exit()
    	v=dosya.read()
    	z=v.find(ip)
    	if z==-1:
    		dosya.write(ip+"\n")
    		dosya.close()
    #Ve Son Olarak ip Adresini Banlıyoruz..
    def bankomut(ip):
    	print "Uygulanan Komut: iptables -A INPUT -s "+ip+" -j DROP"
    	return calistir("iptables -A INPUT -s "+ip+" -j DROP")
    #Banlama İsteği
    def banla(ip):
    	if dosyadan(ip)==True:
    		print ip+' Adresi Beyaz Listede Olduğu İçin Banlanmadı '
    	elif denetle(ip)==True:
    		print ip+' Adresi Arama Motoru İp adresi Olduğu İçin Banlanmadı'
    	else:
    		print ip+" Adresi Banlandı!"		
    		bankomut(ip)
    #Dosya Yoksa Oluşturuyoruz..
    if os.path.exists(_ip_):
    	pass
    else:
    	print _ip_+' Dosyası Oluşturuldu !'
    	f=open(_ip_,"a")
    	f.close()
    #Ana İşlemler...
    komut="netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1"
    veri=calistir(komut)
    desen="([0-9]{1,6}) ([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})"
    veriler = re.compile(desen).findall(veri)
    if veriler == []:
    	print "Hata Oluştu"
    try:
    	print sys.argv[1]+"'den Fazla Bağlantı Açan İp Adresleri ve  Bağlantı Sayıları"
    	mod="filtre"
    except:
    	print "%s 'den Fazla Bağlantı Açan İp Adresleri Ve Bağlantı Sayıları." %_limit_
    	mod="hepsi"
    if mod=="hepsi":
    	x=int(0)
    	for i in veriler:
    		sayi=int(i[0])
    		ip=i[1]+'.'+i[2]+'.'+i[3]+'.'+i[4]
    		if sayi>_limit_:
    			print ip+" İp Adresi Toplam:"+i[0]+" Bağlantı Açmış Durumda"
    			banla(ip)
    			x=x+1
    	print "%s 'den Fazla Bağlantı Açan Toplam %d Adet İp Adresi Bulundu." %(_limit_,x)
    elif mod=="filtre":
    	x=int(0)
    	for i in veriler:
    		ip=i[1]+'.'+i[2]+'.'+i[3]+'.'+i[4]
    		sayi=int(i[0])
    		limit=int(sys.argv[1])
    		if sayi>limit:
    			print "%s İp Adresi Toplam: %d Bağlantı Açmış Durumda" % (ip,sayi)
    			banla(ip)
    			x=x+1
    	if x==0:
    		print "%d'den Fazla Bağlantı Açan İp Adresi Bulunmuyor !" %limit
    	else:
    		print "%d'den Fazla Bağlantı Açan Toplam %d Adet İp Adresi Bulundu." % (limit,x)
    İlerde eklemeyi düşündüğüm özellik banlanan ip adreslerini mail ile yöneticiye haberdar etme.
    Screen Shot için bu adresi ziyaret edebilirsiniz.
  • 15-08-2009, 17:36:20
    #2
    Üyeliği durduruldu
    Eline sağlık dostum süper bişey yapmışsın. kullanacağım bunu
  • 23-08-2009, 02:01:14
    #3
    ellerine sağlık salih
  • 21-01-2010, 15:30:26
    #4
    Ellerine sağlık , bende bu ara python çalışıyorum iyi oldu bu...
  • 23-01-2010, 19:09:32
    #5
    eline sağlık
  • 23-01-2010, 19:11:45
    #6
    Üyeliği durduruldu
    Coşturmuş gene Eline sağlık.
  • 20-05-2010, 18:51:00
    #7
    Teşekkürler