Bloccare il malware a livello DNS con BIND9 + RPZ
Il firewall blocca gli IP. L'IDS ispeziona i pacchetti. Però quasi tutto il malware contatta il proprio server usando nomi di dominio, non IP diretti. Un blocco a livello DNS ferma la connessione prima ancora che parta: il client risolve il dominio malevolo, riceve NXDOMAIN e il payload non viene mai scaricato.
È quello che fanno le Response Policy Zone (RPZ) in BIND9. Questa guida spiega come configurarle da zero su Debian/Ubuntu, con l'aggiornamento automatico dei threat feed.
Cos'è RPZ?
RPZ è una funzione di BIND9 che permette di sovrascrivere le risposte DNS per domini specifici. Quando un client interroga un dominio presente nella blocklist, BIND restituisce NXDOMAIN (o un redirect) al posto dell'IP reale.
In pratica è un firewall a livello DNS:
- Blocklist: server C2 di malware, domini di phishing, reti pubblicitarie
- Whitelist: annullano i falsi positivi (passthru)
- Voci personalizzate: bloccano domini specifici per la tua rete
RPZ è trasparente: sui client non serve configurare nulla. Se la macchina usa il tuo server DNS, è protetta.
Configurazione manuale
Installare BIND9
apt install bind9 bind9-utils
Creare il file della zona RPZ
$TTL 300
@ IN SOA localhost. admin.localhost. (
2025010101 3600 600 604800 300
)
@ IN NS localhost.
; Blocca domini malware noti
malware-domain.com CNAME .
evil-tracker.net CNAME .
phishing-bank.com CNAME .
; Whitelist (passthru): annulla i falsi positivi della blocklist
good-domain.com CNAME rpz-passthru.
CNAME . significa NXDOMAIN: per i tuoi client il dominio smette di esistere.
Configurare BIND per usare RPZ
Aggiungi a /etc/bind/named.conf.options:
options {
directory "/var/cache/bind";
forwarders {
1.1.1.1;
9.9.9.9;
};
dnssec-validation auto;
listen-on { any; };
allow-query { localhost; 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; };
response-policy {
zone "rpz.local" policy given;
};
};
Provarlo
systemctl restart bind9
dig @127.0.0.1 malware-domain.com
Risultato atteso: NXDOMAIN. Il dominio è bloccato.
La parte difficile: i threat feed
Una blocklist statica dopo una settimana non serve più. Servono feed automatici aggiornati ogni giorno. Quelli gratuiti validi sono:
| Feed | Cosa blocca | Licenza |
|---|---|---|
| abuse.ch URLhaus | URL di distribuzione malware | CC BY |
| Hagezi Multi | Pubblicità, tracciamento, malware | GPL-3.0 |
| OISD Big | Lista completa pubblicità/malware | Pubblica |
Convertire i feed nel formato RPZ
Quasi tutti i feed sono semplici liste di domini. Bisogna convertirli nel formato di zona RPZ, gestire i numeri seriali, ricaricare BIND e mantenere le whitelist per i falsi positivi. Diventa complicato in fretta.
#!/bin/bash
# update-rpz.sh: scarica i feed e ricostruisce la zona RPZ
curl -sL "https://urlhaus.abuse.ch/downloads/rpz/" -o /tmp/urlhaus.rpz
curl -sL "https://big.oisd.nl/domainswild2" -o /tmp/oisd.txt
# Crea l'intestazione della zona
cat > /etc/bind/db.rpz.feeds << EOF
\$TTL 300
@ IN SOA localhost. admin.localhost. (
$(date +%Y%m%d%H) 3600 600 604800 300
)
@ IN NS localhost.
EOF
# Aggiunge i feed, converte il formato, rimuove i duplicati...
# Poi ricarica BIND
rndc reload
Gestire le whitelist
I feed avranno falsi positivi. Quando un dominio legittimo viene bloccato, va aggiunto a una zona whitelist con priorità più alta:
response-policy {
zone "rpz.whitelist" policy passthru; // prima la whitelist!
zone "rpz.local" policy given; // blocchi personalizzati
zone "rpz.feeds" policy given; // feed automatici
};
L'ordine conta: la whitelist ha la precedenza su tutto.
Il problema dell'RPZ manuale
Configurarlo bene richiede tempo:
- Il formato dei file di zona è fragile (manca il seriale = errore silenzioso)
- Gli URL dei feed cambiano, i feed vanno offline, i formati sono diversi
- La whitelist si gestisce a mano
- Non si vede cosa viene bloccato
- L'interazione tra DNSSEC e RPZ va configurata con attenzione
- Aggiungi una VPN? Serve l'integrazione DDNS con chiavi TSIG corrette
Il modo automatico: NetForge DNS Sicuro
NetForge genera la configurazione completa di BIND9 + RPZ con un clic:
- Scegli i threat feed (URLhaus, Hagezi, OISD)
- Aggiungi i domini personalizzati in blacklist/whitelist
- Configura i forwarder (Cloudflare, Quad9)
- Attiva il DDNS per l'integrazione con la VPN (facoltativo)
- Clicca Genera
Ottieni:
named.confcompleto con le zone RPZ- File di zona per whitelist, blocchi personalizzati e feed
- Script
update-rpz.shcon la voce di cron - Script di installazione
setup-bind.sh - Chiave TSIG per aggiornamenti DDNS sicuri
Tutto viene generato come file da scaricare: li copi sul server e li esegui. Nessun agent, nessun demone, nessuna connessione verso l'esterno.
Integrazione VPN + DNS
Se usi OpenVPN o WireGuard, NetForge genera gli hook di evento che registrano in automatico i client VPN nella tua zona DNS. I client VPN ricevono un nome DNS, sono filtrati dagli stessi feed RPZ e compaiono nello stesso query log di BIND.
Monitorare cosa blocca RPZ
BIND registra le azioni RPZ nel query log. Analizzalo per vedere cosa sta bloccando il tuo DNS:
grep "rpz" /var/log/named/query.log \
| awk '{print $NF}' | sort | uniq -c | sort -rn | head -20
Prova NetForge
Configurazione completa di BIND9 + RPZ con un clic. Threat feed, whitelist, integrazione VPN.
Scopri NetForge