Egyszerű hálózati forgalom elemző
A célom az volt, hogy legyen egy egyszerű saját hálózati elemző programom, hogy jobban megértsem a hálózati forgalom és adatelemzést.
A projekt Pythonban készült, tanulási céllal, dokumentációk, szakmai fórumok és AI-alapú eszközök bevonásával. A generált kódot átnéztem, módosítottam és a saját igényeimre szabtam.
A fejlesztés során a saját VPS szerverem forgalmát elemeztem, ami lehetőséget adott valós környezetben történő tesztelésre és finomhangolásra. Meglepő volt látni, milyen mennyiségű gyanús próbálkozás ér egy átlagos, publikusan elérhető szervert.
A szkript a pcap-analyzer-lite.py nevet kapta. Funkcionálisan egyszerű, de a célját betölti: tanulás, kísérletezés és a hálózati események jobb megértése.
Leírás
Ez a Python script egy .pcap fájlban található hálózati forgalmat elemez, és összesíti a legfontosabb információkat:
- forrás IP-címek és azok gyakorisága;
- IP protokollok (TCP, UDP, ICMP, stb.) megjelenési aránya;
- leggyakoribb TCP és UDP célportok;
- valamint az egyes forrás IP-címek geolokációs helye (város, ország).
A geolokációhoz a MaxMind GeoLite2 adatbázist használja.
# file: pcap-analyzer-lite.py
# scapy.all.rdpcap a Scapy egy hálózati csomagkezelő könyvtár. Az rdpcap() függvény segítségével beolvasható egy .pcap fájl, és visszaadja a benne lévő összes csomagot.
#collections.Counter: egy speciális szótár, amely számlálja, hogy hányszor fordul elő egy adott elem.
from scapy.all import rdpcap, TCP, UDP, IP
from collections import Counter
import geoip2.database
# Beállítás: GeoIP adatbázis elérési útja
import os
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
GEOIP_DB_PATH = os.path.join(SCRIPT_DIR, "data", "GeoLite2-City.mmdb")
PCAP_FILE_PATH = os.path.join(SCRIPT_DIR, "data", "sample-traffic-analysis-exercise.pcap")
# Protokoll számok és rövidített nevek leképezése
proto_names = {
1: "ICMP",
6: "TCP",
17: "UDP",
2: "IGMP",
# ide jöhetnek még protokollok, pl. 2: "IGMP", 89: "OSPF" stb.
}
app_proto_names = {
80: "HTTP",
443: "HTTPS",
53: "DNS",
123: "NTP",
25: "SMTP",
110: "POP3",
143: "IMAP",
22: "SSH",
21: "FTP",
20: "FTP (data)",
23: "Telnet",
3306: "MySQL",
3389: "RDP",
8080: "HTTP-alt",
# ... lehet bővíteni még igény szerint
}
DETAILED_APP_PROTO = True # vagy False, ha nem kell a részletes lista
# Beolvassa a megadott .pcap fájlt, és eltárolja a benne lévő összes hálózati csomagot a packets változóban. Ez egy listaszerű objektum lesz, amiben minden elem egy hálózati csomag.
packets = rdpcap(PCAP_FILE_PATH)
# Számlálók inicializálása
# ip_counter: ebben a szótárban számolja meg, hogy melyik forrás IP-cím hányszor fordul elő.
# proto_counter: itt számolja, hogy melyik IP-szintű protokoll (pl. TCP, UDP, ICMP) hányszor jelenik meg.
ip_counter = Counter()
proto_counter = Counter()
port_counter = Counter()
# GeoIP olvasó inicializálása
geo_reader = geoip2.database.Reader(GEOIP_DB_PATH)
ip_locations = {}
# Csomagok feldolgozása
# pkt.haslayer("IP"): csak azokat a csomagokat vizsgálja, amelyek IP réteget tartalmaznak.
# pkt["IP"].src: lekéri a forrás IP-címet.
# pkt["IP"].proto: lekéri az IP protokoll számát (például 6 = TCP, 17 = UDP, 1 = ICMP).
# Ezeket a számlálókat frissíti minden IP csomagra.
for pkt in packets:
if IP in pkt:
ip = pkt[IP].src
ip_counter[ip] += 1
proto = pkt[IP].proto
proto_counter[proto] += 1
# Portok vizsgálata
if TCP in pkt:
port_counter[pkt[TCP].dport] += 1
elif UDP in pkt:
port_counter[pkt[UDP].dport] += 1
# Geolokáció csak egyszer per IP
if ip not in ip_locations:
try:
response = geo_reader.city(ip)
city = response.city.name or "Ismeretlen város"
country = response.country.name or "Ismeretlen ország"
ip_locations[ip] = f"{city}, {country}"
except:
ip_locations[ip] = "Nem található"
geo_reader.close()
# Top forrás IP-k és geolokációk
print("\n Top forrás IP-k és helyük:")
for ip, count in ip_counter.most_common(5):
location = ip_locations.get(ip, "N/A")
print(f"{ip} ({location}): {count} csomag")
# Protokoll eloszlás kiírása
print("\n Protokoll eloszlás:")
for proto_num, count in proto_counter.items():
proto_name = proto_names.get(proto_num, f"UNKNOWN({proto_num})")
print(f"{proto_name}: {count} csomag")
print("\n Leggyakoribb TCP/UDP célportok és alkalmazásréteg protokollok:")
for port, count in port_counter.most_common(10):
proto_name = app_proto_names.get(port, "Ismeretlen")
print(f"Port {port} ({proto_name}): {count} csomag")
A szkript használata:
- töltsd le a GeoLite2-City.mmdb adatbázist a MaxMind oldaláról és tedd a data/ mappába;
- helyezz el egy .pcap fájlt a data/ mappában (pl. sample-traffic-analysis-exercise.pcap);
- futtasd a scriptet Python 3 környezetben:
python3 pcap-analyzer-lite.py; - nézd meg az eredményeket a konzolon.
A futtatás utáni eredmények:
📊 Top forrás IP-k és helyük:
172.16.4.205 (Nem található): 13357 csomag
185.243.115.84 (Frankfurt am Main, Germany): 8571 csomag
166.62.111.64 (Ismeretlen város, United States): 5677 csomag
172.16.4.4 (Nem található): 457 csomag
31.13.70.52 (Los Angeles, United States): 218 csomag
📦 Protokoll eloszlás:
UDP: 190 csomag
IGMP: 8 csomag
TCP: 29011 csomag
🔢 Leggyakoribb TCP/UDP célportok és alkalmazásréteg protokollok:
Port 80 (HTTP): 12293 csomag
Port 49249 (Ismeretlen): 8571 csomag
Port 49201 (Ismeretlen): 1522 csomag
Port 49200 (Ismeretlen): 1051 csomag
Port 49198 (Ismeretlen): 940 csomag
Port 49190 (Ismeretlen): 848 csomag
Port 49202 (Ismeretlen): 697 csomag
Port 49199 (Ismeretlen): 616 csomag
Port 443 (HTTPS): 540 csomag
Port 49223 (Ismeretlen): 163 csomag
Követelmények:
- Python 3.x
- Scapy (pip install scapy)
- geoip2 (pip install geoip2)
- GeoLite2 City adatbázis (MaxMind)
Mit tanulhatok ezzel a projekttel?
- alapvető hálózati protokollok kezelése Pythonban (IP, TCP, UDP, ICMP);
- .pcap fájlok feldolgozása Scapy-vel;
- egyszerű statisztikák készítése Python Counter osztállyal;
- IP címek geolokációja MaxMind adatbázissal;
- Python scripting gyakorlása, hibakezelés és kimenet formázás.
Jövőbeli fejlesztési lehetőségek
- Forrásportok és egyéb IP réteg attribútumok elemzése.
- Protokollszűrés vagy időalapú elemzés.
- Részletesebb alkalmazásréteg elemzés pl. HTTP, DNS.
- Interaktív vagy webes megjelenítés.
Használt eszközök / könyvtárak
| Eszköz / Könyvtár | Funkció |
|---|---|
Ubuntu Linux |
Operációs rendszer |
tshark |
Forgalom rögzítése .pcap fájlba |
Scapy |
PCAP beolvasása és elemzése |
geoip2 + GeoLite2 |
IP geolokáció (város, ország) |
venv |
Python környezet izolálása |
fish shell |
Alternatív shell, aktiválás módosult |