- Versione: 3.2
NetworkScan è uno script Python avanzato che effettua una scansione periodica della rete locale, identifica i dispositivi connessi (inclusi quelli IoT silenziosi), e salva le informazioni in un database MySQL e in un file CSV.
- Scansione di una o più reti locali specificate
- Rilevamento di dispositivi attivi tramite:
- Ping
- Scansione porte comuni (80, 443, 8080)
- ARP (anche con
scapyper precisione)
- Salvataggio dei dispositivi trovati in un database MySQL
- Generazione automatica di un file CSV giornaliero nella cartella
report/ - Aggiornamento dinamico del database se il dispositivo cambia IP o rete
- Supporto multi-interfaccia (
eth0,wlan0, ecc.) - Aggiunta automatica del dispositivo locale allo scan
- Compatibile con Raspberry Pi, server Linux, Ubuntu
NetworkScan è stato testato con Raspberry Pi 4 con Ubuntu Server.
Se si intende eseguire lo script all'interno di un container LXC su Proxmox, è necessario configurare il container come Privileged (Opzione "Unprivileged container" deselezionata in fase di creazione o modificata nel config).
Questo è dovuto al fatto che scapy e altri strumenti di rete utilizzati richiedono l'accesso ai raw socket e la capacità di manipolare le interfacce di rete, permessi che normalmente sono bloccati in un container non privilegiato.
Inoltre, assicurarsi che l'interfaccia di rete del container sia configurata correttamente e che possa "vedere" il resto della rete che si intende scansionare.
La tabella 'Scan' è così composta:
- Nome : VARCHAR(255)
- IP : VARCHAR(15)
- MAC_ADDRESS : VARCHAR(17) PRIMARY KEY -> In quanto univoca per ogni dispositivo
- Last_Online : DATETIME
- Proprietario : VARCHAR(255)
- Rete : VARCHAR(50)
- VPN : Boolean -> Di default è false
- Open_Ports : TEXT -> Lista delle porte aperte separate da virgola (es. "80,443,8080")
- Python 3.7+
- Permessi di root (necessari per
scapy,arp, accesso raw socket)
Occorre installare i seguenti pacchetti:
sudo apt update
sudo apt install -y \
python3 \
python3-pip \
python3-venv \
python3-mysqldb \
net-tools \
zip \
unzip \
mysql-client \
iputils-ping \
openssh-clientSe usi il virtualenv, puoi anche aggiungere:
pip install mysql-connector-python netifacesInstalla le dipendenze con:
pip install -r requirements.txtmysql-connector-python netifaces scapy
All’inizio dello script puoi configurare:
RETI = {
"Network": "192.168.1.",
}
INTERFACCE_CONSIDERATE = ["eth0", "wlan0"]
DB_CONFIG = {
'user': 'user',
'password': 'password',
'host': 'localhost',
'database': 'DB'
}Per avviarlo ogni due ore occorre
- Eseguire il crontab da sudo
sudo crontab -e- Incollare la seguente riga:
0 */2 * * * /bin/bash -c 'echo "[📅] $(date "+%Y-%m-%d %H:%M:%S") Avvio scansione" >> /path/network_scan.log && /venv/bin/python /path/networkscan.py >> /path/network_scan.log 2>&1'Questa permette di essere eseguito ogni due ore a partire da mezzanotte.
É presente uno script dove occorre modificare solo il path. Occorre renderlo eseguibile tramite il comando:
chmod +x /home/mauromarzocca/Project/Python/Scan/launch_scan.shInserire nel crontab
sudo crontab -eLa seguente riga:
0 */2 * * * /home/mauromarzocca/Project/Python/Scan/launch_scan.shLo script deve essere eseguito come root:
sudo python3 network_scanner.pyOppure se sei in un ambiente virtuale:
sudo /path/to/venv/bin/python network_scanner.py- 🗃️ Database: tabella scan nel database NetworkScan, con:
- Nome, IP, MAC_ADDRESS, Last_Online, Proprietario, Rete, VPN
- 📄 CSV: file generato in report/networkscan_.csv, sovrascritto ogni giorno.
- Lo script usa scapy per scansioni ARP precise. Alcuni dispositivi silenziosi (es. prese smart) vengono rilevati solo così.
- l campo VPN è booleano ed è inizialmente FALSE. Puoi aggiornarlo manualmente nel DB.
- Aggiornare un nome e proprietario in MySQL:
UPDATE scan
SET Nome = 'Echo Dot Soggiorno',
Proprietario = 'Utente'
WHERE IP = '192.168.1.X';- Cancellare un dispositivo
DELETE FROM scan WHERE IP = '192.168.1.X';Si consiglia di non lanciare lo script più volte consecutivamente, poichè potrebbe verificarsi il seguente errore:
328081 Segmentation fault (core dumped)Poichè un output imprevisto da comandi di sistema (es. arp, ping) può non essere gestito bene da re.search() o da subprocess.check_output(), soprattutto se si lavora in più thread.
- Versione 1.0 : Build Iniziale
- Versione 1.1 : Introdotta pulizia dei file CSV più vecchi di 90 giorni
- Versione 1.2 : Introdotta pulizia dal DB dei dispositivi più vecchi di 90 giorni
- Versione 1.3 : Introdotto script di Backup
- Versione 1.4 : Introdotto script di Restore
- Versione 1.5 : Miglioramenti Generali
- Versione 1.6 : Ottimizzazione del Codice
- Versione 1.7 : Migliorato il riconoscimento dei dispositivi IoT
- Versione 1.8 : Migliorato CSV
- Versione 1.8.1 : Migliorata Documentazione
- Versione 1.8.2 : Creazione dell'icona
- Versione 1.9 : Creazione di uno script per automatizzare lo scan.
- Versione 1.9.1 : Miglioramenti Generali
- Versione 2.0 : Revisione e Ottimizzazione del codice
- Versione 2.1 : Ottimizzazione del codice
- Versione 2.1.1 : Migliorato lo script di Backup
- Versione 2.2 : Miglioramento generale del codice
- Versione 2.2.1 : Migliorato lo script di Launch
- Versione 3.0 : Rielaborazione della Build, ottimizzazzione del codice e miglioramento della gestione del backup e del Database.
- Versione 3.1 : Miglioramento della gestione del backup.
- Versione 3.2 : Miglioramento nella gestione del DB.
Mauro Marzocca
⸻
Per dubbi, problemi o suggerimenti, apri una issue o contattami!