MikroTik DNS e Pi-hole
In questa sezione vedremo come gestire il DNS locale tramite router MikroTik ed il sistema operativo RouterOs, attivando il redirect delle richieste DNS.
Inoltre vedremo anche come configurare il router per poter a sua volta delegare ad un Raspberry PI (progetto Pi-hole) la funzione di DNS affinché possa filtrare e bloccare tutte le sezioni pubblicitarie (AD blocking) e i siti di tracciamento.

Lo scopo di questa trattazione non è quella di descrivere come installare un Raspberry Pi ed il software Pi-hole; a tal proposito si rimanda ad uno dei tanti tutorial per l’installazione del software.
In questo caso ci focalizzeremo maggiormente su come configurare il router per delegare la funzione DNS al Raspberry PI e riprenderne il controllo qualora il Pi-hole fosse fuori servizio, evitando che la nostra rete locale rimanga senza un DNS.
DNS locale
Perché pensare di attivare un DNS locale mediante il router stesso, quando potremmo appoggiarci ai tanti DNS mondiali presenti (Google, Cloudflare, OpenDNS, etc) ?
Nel caso in cui gestissimo una rete locale di medio/grandi dimensioni potrebbe essere comodo centralizzare la funzione del DNS in modo da velocizzare i tempi di risposta alle richieste verso il DNS da parte dei client della LAN. Attivando il DNS locale, beneficeremmo della sua funzione di cache locale, ovvero del fatto che ogni richiesta effettuata da un client, per conoscere l’indirizzo del sito richiesto, non dovrebbe essere gestita dal DNS remoto, bensì il responso sarebbe già presente in questa cache, velocizzando l’intero processo nei confronti del client.
Infatti quando un client deve raggiungere un qualunque server su Internet, per prima cosa contatta il DNS per richiedere quale sia l’indirizzo IP del server da raggiungere. Il DNS può fornire direttamente la risposta, oppure può contattare a sua volta un DNS gerarchicamente più idoneo per gestire il dominio richiesto. Tutto questo porta ad aumentare i tempi in cui il nostro client riuscirà ad ottenere la risposta e conseguentemente i tempi effettivi per accedere al server richiesto.
Viceversa attivando un DNS locale, solo la prima volta che un client effettuerà una richiesta essa verrà delegata dal nostro DNS ad uno di più alto livello gerarchico; una volta ottenuta la risposta essa verrà salvata nella cache locale e pertanto per ogni successiva richiesta dello stesso server anche da parte di altri clients, questi riceveranno la risposta direttamente dal nostro DNS che consulterà la cache locale. Il tutto si traduce in tempi minori per ottenere l’indirizzo IP associato al server richiesto.
Chiaramente nel momento in cui attiveremo un DNS locale in grado di rispondere alle richieste esterne, dovremo proteggerlo mediante Firewall per evitare che il nostro DNS possa diventare la fonte di attacchi informatici basati sull’amplificazione delle richieste DNS verso un host vittima.
Pertanto un rimedio da applicare sarà quello di evitare che il nostro DNS risponda a qualunque richiesta proveniente dall’interfaccia WAN; il nostro DNS dovrà rispondere solo ai clients presenti in LAN.
A tal proposito imposteremo le regole del firewall per non consentire il traffico in ingresso dalla WAN verso la porta TCP e UDP 53, relativa al servizio DNS.
/ip firewall raw
add action=drop chain=prerouting dst-port=53 protocol=udp
add action=drop chain=rerouting dst-port=53 protocol=tcp
Instradare il traffico DNS verso Pi-hole
Volendo potenziare il DNS locale, permettendo sia di sfruttare le potenzialità del Pi-hole, per filtrare i domini malevoli o contenenti pubblicità e tracciatori, sia per creare una ridondanza in caso di malfunzionamento del Raspberry PI viene configurato il router in modo da ridirigere il traffico DNS al Pi-hole quando disponibile, per poi riprenderne il controllo negli altri casi.
Per riuscire ad ottenere questo risultato definiremo come DNS principale il router MikroTik in modo che tutti i clients della LAN punteranno ad esso. Per fare ciò imposteremo tramite il DHCP che l’IP del router sia anche il DNS della rete locale.
Inoltre attiveremo anche un Raspberry PI con il software Pi-hole in modo da proteggere i clients della LAN dai vari siti che portano a pubblicità o tracciatori di traffico.
Affinché ogni client della rete che punterà al DNS locale possa essere ridiretto verso il Pi-hole, imposteremo sul router delle regole di NAT per effettuare tale re-direzione.
Inoltre per permettere che tale traffico venga ridiretto solo quando il Pi-hole sarà funzionante, eseguiremo uno script di verifica che abiliti le regole di NAT solo in quel caso.
A titolo di esempio consideriamo la LAN 192.168.1.X e che l’IP del Raspberry PI sia 192.168.1.254, questo script ci permette di verificare se Pi-hole è attivo e funzionante.
:local piholedown [/ip firewall nat get value-name=disabled [find comment="piholeNAT1"]]
:local piholeDNS "192.168.1.254"
:local testDomain "www.google.com"
:if ($piholedown = false) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip firewall nat disable [find comment="piholeNAT1"]
/ip firewall nat disable [find comment="piholeNAT2"]
/ip firewall nat disable [find comment="piholeNAT3"]
/ip firewall nat disable [find comment="piholeNAT4"]
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip firewall nat enable [find comment="piholeNAT1"]
/ip firewall nat enable [find comment="piholeNAT2"]
/ip firewall nat enable [find comment="piholeNAT3"]
/ip firewall nat enable [find comment="piholeNAT4"]
} on-error={}
}
In questo script viene utilizzato il sito di google.com per capire se il Pi-hole è funzionante; sulla base di queste verranno attivate o disattivate le regole di NAT necessarie per il redirect su Pi-hole. A tal proposito le regole vengono individuate tramite un testo predefinito nel commento delle quattro regole necessarie.
A seguire vengono mostrate le regole di NAT, considerando come IP del router 192.168.1.240.
/ip firewall nat
add action=dst-nat chain=dstnat comment=piholeNAT1 dst-address=!192.168.1.254 dst-port=53 in-interface=LAN protocol=udp src-address=!192.168.1.254 to-addresses=\
192.168.1.254
add action=dst-nat chain=dstnat comment=piholeNAT2 dst-address=!192.168.1.254 dst-port=53 in-interface=LAN protocol=tcp src-address=!192.168.1.254 to-addresses=\
192.168.1.254
add action=masquerade chain=srcnat comment=piholeNAT3 dst-address=192.168.1.254 dst-port=53 protocol=udp src-address=192.168.1.0/24
add action=masquerade chain=srcnat comment=piholeNAT4 dst-address=192.168.1.254 dst-port=53 protocol=tcp src-address=192.168.1.0/24