Bloccare il malware a livello DNS con BIND9 + RPZ

DNS 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:

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:

FeedCosa bloccaLicenza
abuse.ch URLhausURL di distribuzione malwareCC BY
Hagezi MultiPubblicità, tracciamento, malwareGPL-3.0
OISD BigLista completa pubblicità/malwarePubblica

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 modo automatico: NetForge DNS Sicuro

NetForge genera la configurazione completa di BIND9 + RPZ con un clic:

  1. Scegli i threat feed (URLhaus, Hagezi, OISD)
  2. Aggiungi i domini personalizzati in blacklist/whitelist
  3. Configura i forwarder (Cloudflare, Quad9)
  4. Attiva il DDNS per l'integrazione con la VPN (facoltativo)
  5. Clicca Genera

Ottieni:

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