Network - Python - Scripting

Python: come calcolare una subnet di rete

In un precedente articolo, abbiamo analizzato i concetti di subnetting di una rete. Calcolare l’indirizzo di broadcast, la wildcard mask o il range di host utilizzabili richiede attenzione, specialmente quando si lavora con maschere non standard.

Vediamo come automatizzare questo processo creando uno script Python che genera un report completo e formattato come tabella, partendo da un semplice parametro CIDR sfruttando la libreria standard ipaddress.

Lo script: da CIDR a “tabella”

L’obiettivo è passare una subnet come parametro (es: 192.168.1.0/24) e ottenere un output tabellare direttamente nel terminale che riporti i dati della subnet (indirizzo di broadcast, wildcard mask, range di host utilizzabili, …)

import ipaddress
import sys

def calcola_subnet_tabella(indirizzo_cidr):
    try:
        # strict=False gestisce input come 192.168.1.10/24
        rete = ipaddress.ip_network(indirizzo_cidr, strict=False)
        host_utilizzabili = list(rete.hosts())

        # Dati da visualizzare
        dati = [
            ("Indirizzo CIDR", str(rete)),
            ("Netmask", str(rete.netmask)),
            ("Wildcard Mask", str(rete.hostmask)),
            ("Indirizzo Rete", str(rete.network_address)),
            ("Broadcast", str(rete.broadcast_address)),
            ("Primo Host", str(host_utilizzabili[0]) if host_utilizzabili else "N/A"),
            ("Ultimo Host", str(host_utilizzabili[-1]) if host_utilizzabili else "N/A"),
            ("Totale Host", str(max(0, rete.num_addresses - 2)))
        ]

        # Formattazione Tabella
        print(f"\nReport Sottorete: {indirizzo_cidr}")
        print("+" + "-"*20 + "+" + "-"*25 + "+")
        print(f"| {'Parametro':<18} | {'Valore':<23} |")
        print("+" + "-"*20 + "+" + "-"*25 + "+")

        for label, valore in dati:
            print(f"| {label:<18} | {valore:<23} |")

        print("+" + "-"*20 + "+" + "-"*25 + "+")

    except ValueError as e:
        print(f"Errore: '{indirizzo_cidr}' non è valido. ({e})")

if __name__ == "__main__":
    if len(sys.argv) > 1:
        calcola_subnet_tabella(sys.argv[1])
    else:
        print("Utilizzo: python SubnetCalculator.py <indirizzo/maschera>")

La sintassi dello script è molto semplice

$ python SubnetCalculator.py 207.234.189.123/23

Report Sottorete: 207.234.189.123/23
+--------------------+-------------------------+
| Parametro          | Valore                  |
+--------------------+-------------------------+
| Indirizzo CIDR     | 207.234.188.0/23        |
| Netmask            | 255.255.254.0           |
| Wildcard Mask      | 0.0.1.255               |
| Indirizzo Rete     | 207.234.188.0           |
| Broadcast          | 207.234.189.255         |
| Primo Host         | 207.234.188.1           |
| Ultimo Host        | 207.234.189.254         |
| Totale Host        | 510                     |
+--------------------+-------------------------+