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:- IP Adresi Tarama: Belirli bir IP adresindeki açık portları bulmak.
- Ağ Tarama: Belirli bir ağdaki tüm IP adreslerini taramak.
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:- Kodunuzu bir Python dosyasına kaydedin (network_scanner.py gibi).
- 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.