Python Python'da Network Scanner Uygulaması Geliştirme

Ağ güvenliği ve yönetimi, Bilgi Teknolojisi ve Siber Güvenlik alanlarında en kritik unsurlardan biridir. Ağdaki cihazların durumunu bilmek, hangi cihazların açık olduğunu, hangi portların kullanıldığını anlamak, güvenlik açısından hayati öneme sahiptir. Bu makalede, Python kullanarak basit bir network scanner (ağ tarayıcı) uygulaması geliştireceğiz. Bu uygulama, bir ağdaki IP adreslerini ve açık portları tarayarak hangi cihazların aktif olduğunu belirleyebilecektir.

1. Gerekli Kütüphaneler

Network scanner uygulamamızı geliştirmek için Python’un standart kütüphanelerinden socket, ipaddress ve concurrent.futures modüllerini kullanacağız. Bu modüller, ağ işlemleri yapmak, IP adreslerini yönetmek ve işlemleri paralel olarak yürütmek için gereklidir.

  • socket: Ağ üzerinden veri iletişimi sağlayan temel bir modüldür. TCP/IP gibi protokolleri kullanarak bağlantılar kurmanızı sağlar.
  • ipaddress: IPv4 ve IPv6 adresleriyle çalışmak için kullanılan modüldür. Belirli bir IP aralığındaki adreslerle kolayca işlem yapmamızı sağlar.
  • concurrent.futures: İşlemleri paralel olarak yürütmemizi sağlayan modüldür. Bu sayede, birden fazla IP adresini ve portu aynı anda tarayabiliriz.

2. Uygulamanın Yapısı

Uygulamanın işleyişi oldukça basittir:

  1. IP Adresi Tarama: Belirli bir IP adresindeki açık portları bulmak.
  2. Ağ Tarama: Belirli bir ağdaki tüm IP adreslerini taramak.
Kodun tamamını aşağıda detaylandıracağız.
Python:
import socket
import ipaddress
from concurrent.futures import ThreadPoolExecutor

def scan_port(ip, port):
    """Belirtilen IP adresindeki belirli bir portun açık olup olmadığını kontrol eder."""
    scanner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    scanner.settimeout(1)
    try:
        scanner.connect((ip, port))
        return True
    except:
        return False
    finally:
        scanner.close()

def scan_ip(ip):
    """Belirtilen IP adresindeki 1'den 1024'e kadar olan portları tarar ve açık portları listeler."""
    print(f"Scanning IP: {ip}")
    open_ports = []
    for port in range(1, 1025):
        if scan_port(ip, port):
            open_ports.append(port)
    if open_ports:
        print(f"Open ports on {ip}: {open_ports}")
    else:
        print(f"No open ports on {ip}")

def network_scanner(network):
    """Belirtilen IP ağı aralığındaki her IP adresi için tarama işlemini gerçekleştirir."""
    network = ipaddress.ip_network(network, strict=False)
    with ThreadPoolExecutor(max_workers=10) as executor:
        for ip in network.hosts():
            executor.submit(scan_ip, str(ip))

if __name__ == "__main__":
    # Tarama yapmak istediğiniz ağ bloğunu belirtin (örneğin "192.168.1.0/24")
    network_scanner("192.168.1.0/24")

3. Kodun Detaylı Açıklaması

3.1. Port Tarama Fonksiyonu:

Bu fonksiyon, belirli bir IP adresindeki belirli bir portun açık olup olmadığını kontrol eder. Bunun için bir socket objesi oluşturur ve TCP bağlantısı kurmaya çalışır.
  • Bağlantı başarılı olursa: Portun açık olduğu anlaşılır ve True döner.
  • Bağlantı başarısız olursa: Portun kapalı olduğu kabul edilir ve False döner.
Python:
def scan_port(ip, port):
    scanner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    scanner.settimeout(1)
    try:
        scanner.connect((ip, port))
        return True
    except:
        return False
    finally:
        scanner.close()

3.2. IP Tarama Fonksiyonu

Bu fonksiyon, belirtilen bir IP adresi üzerinde 1'den 1024'e kadar olan portları tarar. Her port için scan_port fonksiyonunu çağırır ve açık portları bir listeye ekler. Tarama tamamlandığında, açık portlar listelenir.
Python:
def scan_ip(ip):
    print(f"Scanning IP: {ip}")
    open_ports = []
    for port in range(1, 1025):
        if scan_port(ip, port):
            open_ports.append(port)
    if open_ports:
        print(f"Open ports on {ip}: {open_ports}")
    else:
        print(f"No open ports on {ip}")

3.3. Ağ Tarama Fonksiyonu

Bu fonksiyon, belirli bir ağ bloğundaki tüm IP adreslerini tarar. ipaddress.ip_network fonksiyonu ile ağ bloğunu oluşturur ve ThreadPoolExecutor kullanarak paralel tarama işlemi yapar. Böylece tarama işlemi çok daha hızlı tamamlanır.
Python:
def network_scanner(network):
    network = ipaddress.ip_network(network, strict=False)
    with ThreadPoolExecutor(max_workers=10) as executor:
        for ip in network.hosts():
            executor.submit(scan_ip, str(ip))

3.4. Ana Fonksiyon

Bu bölüm, script çalıştırıldığında hangi ağ bloğunun taranacağını belirler. Örnekte, 192.168.1.0/24 ağ bloğu taranmaktadır. Bu bloğu kendi ağınıza göre değiştirebilirsiniz.
Python:
if __name__ == "__main__":
    # Tarama yapmak istediğiniz ağ bloğunu belirtin (örneğin "192.168.1.0/24")
    network_scanner("192.168.1.0/24")

4. Uygulamanın Çalıştırılması

Uygulamayı çalıştırmak için:
  1. Kodunuzu bir Python dosyasına kaydedin (network_scanner.py gibi).
  2. Terminal veya komut satırından şu komutla çalıştırın:
Bash:
python network_scanner.py

5. Gelişmiş Özellikler ve İyileştirmeler

Bu temel uygulamayı daha da geliştirmek için şunları ekleyebilirsiniz:
  • Port Aralığını Genişletme: 1024'ten büyük portları da tarayabilirsiniz.
  • Çıktıyı Dosyaya Kaydetme: Tarama sonuçlarını bir dosyaya yazdırabilirsiniz.
  • Hız Optimizasyonu: Daha fazla thread kullanarak tarama hızını artırabilirsiniz.
  • OS Detection: Açık portlara bağlı olarak işletim sistemi tespiti ekleyebilirsiniz.

6. Sonuç

Python ile basit bir network scanner uygulaması geliştirerek, ağınızdaki cihazları ve açık portları tespit edebilirsiniz. Bu tür araçlar, ağ güvenliğinizi güçlendirmek için önemli bir adımdır. Uygulamanın temel yapısını anladıktan sonra, ihtiyaçlarınıza göre özelleştirebilir ve genişletebilirsiniz.
 
Geri
Üst