Segmentare una rete con OpenWrt: Ufficio, Gestione, SIP, DMZ e telecamere

Configurazione pratica di una rete segmentata con OpenWrt/firewall4: zone, policy default-drop, Ufficio, Gestione, SIP, DMZ, telecamere, regole UCI e diagnostica con fw4, nftables e tcpdump.

Una rete piatta è comoda: ogni dispositivo vede tutto e quasi niente richiede regole particolari. È anche il motivo per cui un problema nato su un oggetto poco affidabile può trasformarsi in un problema dell’intera infrastruttura. Segmentare una rete significa accettare un po’ di complessità in più in cambio di un vantaggio enorme: limitare ciò che un dispositivo può raggiungere anche quando quel dispositivo non è più affidabile.

La VLAN è soltanto il primo pezzo. Se separiamo Ufficio, SIP, Gestione e telecamere ma poi configuriamo il router affinché tutte le reti possano comunicare liberamente, abbiamo ottenuto soprattutto ordine amministrativo, non vera segmentazione. La sicurezza nasce quando il routing attraversa una policy e quella policy descrive esplicitamente i flussi consentiti.

Livello 2, livello 3 e firewall

Una VLAN separa domini Ethernet al livello 2. Due host in VLAN diverse non si parlano direttamente tramite ARP: per raggiungersi devono passare da un router, cioè dal livello 3. È proprio quel passaggio obbligato che ci permette di applicare le policy firewall.

OpenWrt aggiunge un’astrazione molto utile: le zone. Una zona non è necessariamente una singola interfaccia fisica; è un gruppo logico di reti a cui assegniamo comportamenti comuni. Possiamo quindi dire che la zona Gestione accetta connessioni amministrative, la zona CCTV non inoltra traffico verso Ufficio, la zona SIP raggiunge il DNS interno ma non il resto della DMZ.

Default deny: partire da ciò che non deve succedere

Il metodo più semplice da mantenere nel tempo è partire da una policy restrittiva e aggiungere eccezioni comprensibili. Non “Ufficio può andare in SIP”, ma “Ufficio può raggiungere il PBX 10.0.10.100 sulla porta 5061”. La seconda regola racconta già da sola quasi tutta la ragione per cui esiste.

Questo approccio è particolarmente importante per IoT, telefoni e telecamere. Sono apparati che spesso non amministriamo come un server Linux, ricevono firmware con frequenze differenti e possono avere servizi difficili da disabilitare. La segmentazione compensa in parte questa mancanza di controllo restringendo le conseguenze di una compromissione.

Stateful non significa onnisciente

Firewall4 usa nftables ed è stateful: una connessione autorizzata in una direzione può avere traffico di risposta senza dover scrivere una seconda regola speculare. Ma il firewall del router non è l’unico punto di controllo. Un server può avere il proprio firewall locale, un’applicazione può applicare ACL e un servizio SIP può rifiutare una sorgente perfettamente raggiungibile a livello IP.

È proprio ciò che vedremo più avanti nel caso del telefono SIP: i pacchetti attraversavano OpenWrt correttamente, eppure la registrazione falliva. Il problema era un livello più avanti.

Con questi concetti chiari possiamo costruire la topologia e le regole concrete.

Topologia

Ufficio   192.168.1.0/24
DMZ       172.16.0.0/24
SIP       10.0.10.0/24
Gestione  10.0.20.0/24
CCTV      10.0.30.0/24   # esempio

La policy di base è INPUT e FORWARD in DROP per le reti normali; Gestione è la zona privilegiata da cui amministrare le altre.

Fotografare la configurazione

uci export network
uci export firewall
fw4 print
nft list ruleset

fw4 print mostra ciò che OpenWrt genererà; nft list ruleset mostra ciò che è realmente caricato nel kernel.

Creare le zone

uci add firewall zone
uci set firewall.@zone[-1].name='Ufficio'
uci add_list firewall.@zone[-1].network='Ufficio'
uci set firewall.@zone[-1].input='DROP'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='DROP'

uci add firewall zone
uci set firewall.@zone[-1].name='Gestione'
uci add_list firewall.@zone[-1].network='Gestione'
uci set firewall.@zone[-1].input='ACCEPT'
uci set firewall.@zone[-1].output='ACCEPT'
uci set firewall.@zone[-1].forward='ACCEPT'

uci commit firewall
fw4 check
/etc/init.d/firewall restart

Regola puntuale invece di forwarding globale

config rule
        option name 'Ufficio-to-PBX-SIP-TLS'
        option src 'Ufficio'
        option dest 'Sip'
        option dest_ip '10.0.10.100'
        option proto 'tcp'
        option dest_port '5061'
        option target 'ACCEPT'

Non impostiamo src_port: la porta sorgente del client è normalmente effimera.

Servizi specifici in DMZ

config rule
        option name 'SIP-to-DNS'
        option src 'Sip'
        option dest 'Dmz'
        option dest_ip '172.16.0.100'
        option proto 'tcp udp'
        option dest_port '53'
        option target 'ACCEPT'

config rule
        option name 'SIP-to-Web'
        option src 'Sip'
        option dest 'Dmz'
        option dest_ip '172.16.0.200'
        option proto 'tcp'
        option dest_port '80 443'
        option target 'ACCEPT'

Telecamere

Le telecamere devono raggiungere il server di videosorveglianza e, se serve, DNS/NTP. Non hanno motivo di aprire sessioni verso PC e server della LAN.

Caso reale: telefono SIP e 504

Un telefono spostato dalla rete SIP alla rete Ufficio attraversava correttamente OpenWrt. Il REGISTER arrivava al PBX, ma il servizio rispondeva con errore. La causa era la policy INPUT del PBX, che non autorizzava la nuova sorgente.

# Sul router
tcpdump -ni any host 10.0.10.100 and port 5060

# Sul PBX
tcpdump -ni any 'port 5060 or port 5061'

uci show firewall | grep -E 'Ufficio|Sip|5060|5061'
fw4 print | grep -n -E '5060|5061'

Debug sistematico

uci export network
uci export firewall
fw4 check
fw4 print
nft list ruleset
tcpdump -ni any host 192.168.1.50
tcpdump -ni any host 10.0.10.100

Per ogni apertura dovrebbe esistere una frase comprensibile: “Ufficio può raggiungere il PBX su 5061 perché…”. Se non riusciamo più a spiegare la regola, è il momento di rivederla.

Approfondimenti collegati