Blog
Python ile Gerçek Zamanlı Ağ Trafik Analizi Nasıl Yapılır?
Python, ağ trafiğini gerçek zamanlı olarak izlemek ve anlamlı bilgiler çıkarmak isteyen güvenlik araştırmacıları ve sistem yöneticileri için en erişilebilir araçlardan biridir. Ağ trafiği analizi yaparak şüpheli bağlantıları tespit etmek, bant genişliği kullanımını anlamak veya güvenlik olaylarına hızlı müdahale etmek mümkündür. Bu makalede, Python ekosistemindeki temel kütüphaneleri kullanarak canlı ağ trafiğini nasıl yakalayıp işleyeceğinizi adım adım ele alacağız.
Temel Kütüphaneler ve Altyapı
Ağ trafiği analizi için Python’da en yaygın kullanılan kütüphane Scapy‘dir. Scapy, paketleri oluşturma, gönderme, yakalama ve ayrıştırma işlemlerini tek bir çatı altında sunan etkileşimli bir araçtır. Paket seviyesinde çalışmak isteyenler için vazgeçilmezdir.
Scapy’nin yanı sıra daha üst seviyede analizler için dpkt veya impacket gibi kütüphaneler de tercih edilebilir. dpkt, özellikle yakalanan trafiğin hızlı ayrıştırılması gerektiğinde daha hafif bir alternatif sunar. impacket ise Microsoft protokolleriyle çalışan ortamlarda SMB, MSRPC gibi protokollerin incelenmesinde uzmanlaşmıştır.
Gerçek zamanlı görselleştirme veya daha gelişmiş iş akışları için PyShark (Wireshark’ın TShark arka ucunu Python’dan çağıran bir sarmalayıcı) veya psutil (sistem ve ağ arayüz istatistikleri için) değerlendirilebilir. psutil doğrudan paket yakalamaz, ancak ağ arayüzlerinin kullanım istatistiklerini izlemek için kullanışlıdır.
Paket yakalama işlemi genellikle işletim sistemi düzeyinde ayrıcalıklar gerektirir. Linux ve macOS’te root yetkisi, Windows’ta ise Npcap/WinPcap sürücüsünün kurulu olması ve yönetici hakları gerekir. Bu kısıtlamalar, üretim ortamlarında çalışırken dikkate alınmalıdır.
Canlı Paket Yakalama ve Filtreleme
Scapy ile canlı paket yakalamanın en temel yolu sniff() fonksiyonudur. Bu fonksiyon, belirtilen ağ arayüzünden geçen tüm paketleri dinler ve her paket için tanımlanan bir geri çağırım (callback) fonksiyonunu çalıştırır.
from scapy.all import sniff
def paket_isleyici(paket):
print(paket.summary())
sniff(iface="eth0", prn=paket_isleyici, store=0)
store=0 parametresi kritik öneme sahiptir. Bu parametre olmadan Scapy, yakalanan tüm paketleri bellekte tutar ve yüksek trafikli ortamlarda sistem kaynaklarını hızla tüketir. Gerçek zamanlı analiz senaryolarında paketleri işleyip atmak, biriktirmek yerine her zaman tercih edilmelidir.
Trafik hacmini azaltmak için BPF (Berkeley Packet Filter) sözdizimi ile filtreleme uygulanabilir. Filtreleme, kernel düzeyinde çalışarak gereksiz paketlerin kullanıcı alanına ulaşmasını engeller:
sniff(iface="eth0", filter="tcp port 80", prn=paket_isleyici, store=0)
Bu yaklaşım, özellikle HTTP trafiğini izlemek veya belirli bir port üzerinden şüpheli aktivite araştırmak için kullanışlıdır. Daha karmaşık filtreler yazarak belirli IP blokları, protokol kombinasyonları veya bayrak setleri (örneğin SYN flood tespiti için tcp[tcpflags] & tcp-syn != 0) hedeflenebilir.
Paket İçeriğinin Ayrıştırılması
Yakalanan paketin ham baytları tek başına anlamlı değildir. Scapy’nin katmanlı yapısı, paketin protokol başlıklarına otomatik olarak ayrıştırılmasını sağlar. Bir IP paketinin içindeki TCP segmentine, ardından HTTP verisine erişmek için katman dizinlemesi kullanılır:
def detayli_analiz(paket):
if paket.haslayer("IP"):
src_ip = paket["IP"].src
dst_ip = paket["IP"].dst
protokol = paket["IP"].proto
if paket.haslayer("TCP"):
src_port = paket["TCP"].sport
dst_port = paket["TCP"].dport
bayraklar = paket["TCP"].flags
print(f"{src_ip}:{src_port} -> {dst_ip}:{dst_port} | Bayraklar: {bayraklar}")
Bu yapı, güvenlik analizlerinde sıkça kullanılan bazı temel tespitleri mümkün kılar. Örneğin, SYN bayrağı setli ancak ACK bayrağı setli olmayan paketler, bir TCP üç yönlü el sıkışmasının ilk aşamasını temsil eder. Belirli bir eşik değerinin üzerinde bu tür paket gelirse, bir SYN flood saldırısından şüphelenilebilir.
Uygulama katmanı verilerine erişmek için Raw katmanı kontrol edilir. Ancak modern ağlarda çoğu trafik TLS ile şifrelendiğinden, bu katmandaki veriler genellikle okunabilir metin değil şifreli baytlar içerir. Şifresiz HTTP, DNS sorguları veya eski protokoller bu açıdan daha zengin analiz imkanı sunar.
Akıllı Tespit ve Uyarı Mekanizmaları
Ham paket yakalamanın ötesine geçmek için durum bilgisi taşıyan (stateful) analizler geliştirilebilir. Basit bir örnek, belirli bir IP adresinden gelen bağlantı sayısını zaman pencereleri içinde izlemektir:
from collections import defaultdict
import time
baglanti_sayaci = defaultdict(lambda: {"sayac": 0, "son_zaman": time.time()})
esik_deger = 100 # 60 saniyede 100 bağlantı
zaman_penceresi = 60
def anomali_tespiti(paket):
if not paket.haslayer("IP"):
return
src_ip = paket["IP"].src
simdiki_zaman = time.time()
if simdiki_zaman - baglanti_sayaci[src_ip]["son_zaman"] > zaman_penceresi:
baglanti_sayaci[src_ip] = {"sayac": 1, "son_zaman": simdiki_zaman}
else:
baglanti_sayaci[src_ip]["sayac"] += 1
if baglanti_sayaci[src_ip]["sayac"] > esik_deger:
print(f"UYARI: {src_ip} adresinden yüksek bağlantı hızı tespit edildi!")
Bu desen, brute-force girişimlerini, port taramalarını veya DDoS katılımını belirtilen eşik değerleriyle ilişkilendirmek için genişletilebilir. Daha sofistike sistemlerde, bağlantı durum makineleri (TCP state machine takibi), protokol anomalileri (örneğin DNS sorgularında olağandışı büyük payload’lar) veya istatistiksel profil çıkarma teknikleri kullanılabilir.
Ağ trafiği analizi bağlamında entropy (entropi) hesaplaması da ilginç bir metriktir. Yüksek entropili payload’lar, sıkıştırılmış veya şifreli veriye işaret edebilir; düşük entropi ise insan tarafından okunabilir metin veya tekrarlayan yapılar anlamına gelebilir. Python’ın math kütüphanesiyle Shannon entropisi hesaplanarak bu tür ayırt edici özellikler otomatikleştirilebilir.
Performans Optimizasyonu ve Pratik Sınırlar
Python yorumlanan bir dil olduğundan, çok yüksek bant genişliğine sahip ağlarda (10 Gbps ve üzeri) paket başına işlem yapmak zorlayıcı olabilir. Bu senaryolarda çeşitli optimizasyon stratejileri devreye girer.
libpcap üzerinde çalışan Scapy, aslında paket yakalama işinin çoğunu C dilinde yazılmış kütüphanelere devreder. Ancak her paket için Python geri çağırım fonksiyonunun çalıştırılması, yüksek paket hızlarında darboğaz oluşturur. Çözüm yollarından biri, paketleri toplu halde işlemektir. Scapy’nin sniff() fonksiyonuna count parametresi verilerek belirli sayıda paket biriktirildikten sonra toplu analiz yapılabilir.
Alternatif olarak, kritik yoldaki işlemleri C uzantılarına taşımak veya asyncio tabanlı asenkron mimariler kullanarak I/O bekleme sürelerini verimli hale getirmek mümkündür. Daha radikal bir yaklaşım ise, Python’ı yalnızca yapılandırma ve sonuç görselleştirme katmanı olarak kullanıp, ağır yükü eBPF (extended Berkeley Packet Filter) tabanlı çözümlere (XDP, tc BPF) devretmektir. Bu yaklaşım, kernel içinde paket işleme imkanı sunar ve kullanıcı alanına yalnızca özet veriler aktarılır.
Günlük pratikte, Python tabanlı ağ trafiği analizi genellikle şu senaryolarda en verimli şekilde çalışır: düşük-orta hacimli trafik segmentleri, hedefli izleme (spesifik bir alt ağ veya servis), prototip geliştirme ve eğitim amaçlı ortamlar. Üretimde tam ağ görünürlüğü gerektiğinde, Python genellikle mevcut ağ izleme altyapısının (Zeek, Suricata, özel donanım) üzerine inşa edilen analitik katman olarak konumlanır.
Güvenlik ve Etik Hususlar
Ağ trafiği analizi güçlü bir yetenektir ve beraberinde önemli sorumluluklar getirir. İzinsiz olarak üçüncü şahıslara ait ağları dinlemek, dünya genelindeki birçok yargı bölgesinde ciddi hukuki yaptırımlara tabidir. Analiz yapılan ağın sahibi olmak, açık izin almak veya yasal yetki çerçevesinde çalışmak zorunludur.
Kendi altyapınızda bile analiz yaparken, yakalanan paketlerde kişisel veri (PII), kimlik bilgileri veya hassas iş verileri bulunabileceğini unutmamak gerekir. Günlük dosyalarının şifrelenmesi, erişim kontrolleri ve veri saklama sürelerinin sınırlandırılması gibi önlemler alınmalıdır. Scapy’nin store=0 kullanımı, bu anlamda birincil savunma hattıdır: paketleri işleyip atmak, depolamak yerine veri sızıntısı riskini minimize eder.
Sıradaki Adımlar
Python ile ağ trafiği analizine başlamak için en iyi yaklaşım, küçük ve odaklı bir senaryo seçmektir. Örneğin, yerel ağınızdaki DNS sorgularını izleyerek alan adı çözümleme davranışlarını anlamaya çalışın. Ardından TCP bayrak analizi ekleyerek bağlantı kurulum kalıplarını gözlemleyin. Her yeni katmanı, öncekini bozmadan ekleyerek sisteminizi iteratif olarak geliştirin.
Daha ileri seviyede, yakaladığınız verileri pandas ile zaman serisi analizine tabi tutabilir, matplotlib veya plotly ile görselleştirebilir ve scikit-learn ile anomali tespiti modelleri eğitebilirsiniz. Python ekosisteminin gücü, ağ güvenliği alanındaki uzmanlıkla birleştiğinde, hem hızlı müdahale imkanı sunan hem de derinlemesine istihbarat üreten sistemler inşa etmek mümkün hale gelir.