Že več let doma uporabljam lastne DNS strežnike (Pi-hole), ki mi omogočajo blokiranje določenih domen. To je koristno predvsem iz vidika blokiranja oglasov, zlonamernih strani in telemetrije. Na žalost sem se skozi leta naučil, da nekatere naprave ne spoštujejo nastavitev DNS strežnikov, ki jih dobijo od DHCP strežnika. Take naprave (običajno so to televizorji, igralne konzole, ...) imajo običajno statično nastavljene DNS strežnike, pogosto prav z namenom, da jih ni mogoče spreminjati. To ni dobro, saj je običajno ravno pri teh napravah najbolj pomembno, da blokiramo oglase in telemetrijo. Več o tem si lahko preberete v članku Your Smart TV is probably ignoring your PiHole, obsežna diskusija na to temo pa je potekala tudi na Pi-hole forumu.
Vedno več je tudi naprav, ki uporabljajo DoH (DNS over HTTPS) in se na ta način izognejo lokalnim DNS strežnikom. Takšne DNS zahtevke pa je precej težje preusmeriti na lokalne DNS strežnike. Morda se tega lotim kdaj drugič. Tokrat se bom osredotočil na naprave, ki imajo statično nastavljene DNS strežnike in uporabljajo klasičen DNS na vratih 53.
Za takšne naprave na srečo obstaja (dokaj enostavna) rešitev. Pogoj je le, da imamo usmerjevalnik ali požarni zid, ki nam to omogoča. Jaz uporabljam Mikrotik usmerjevalnik, na katerem je preusmerjanje DNS prometa zelo enostavno. Za preusmeritev vseh DNS paketov, ki niso usmerjeni na moje DNS strežnike uporabljam spodnji dve pravili:
1 ;;; DNS redirect (TCP)
chain=dstnat action=dst-nat to-addresses=10.10.1.4/31 to-ports=53 protocol=tcp src-address=10.10.2.0/24
dst-address-list=!dns-servers dst-port=53 log=no log-prefix=""
2 ;;; DNS redirect (UDP)
chain=dstnat action=dst-nat to-addresses=10.10.1.4/31 to-ports=53 protocol=udp src-address=10.10.2.0/24
dst-address-list=!dns-servers dst-port=53 log=no log-prefix=""
Pravili (eno za TCP in drugo za UDP promet) preusmerita ves lokalni (src-address=10.10.2.0/24) DNS (dst-port=53) promet, ki ni usmerjen proti mojim DNS strežnikom (dst-address-list=!dns-servers), proti mojim DNS strežnikom (to-addresses=10.10.1.4/31). Na ta način zagotovim, da tudi naprave, ki imajo statične DNS strežnike, uporabljajo moje lokalne.
Kljub preusmeritvi na lastne DNS strežnike pa iz strani naprave, ki pošilja DNS promet, še vedno izgleda, kot da dobi odgovor od svojega statično nastavljenega strežnika. Primer:
$ dig google.com @8.8.8.8
; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> google.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8185
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 190 IN A 142.251.39.46
;; Query time: 0 msec
;; SERVER: 8.8.8.8#53(8.8.8.8) (UDP)
;; WHEN: Sat May 31 10:54:21 CEST 2025
;; MSG SIZE rcvd: 55
V tem primeru je DNS odgovor poslal moj DNS strežnik (zelo očitno, saj je Query time 0 milisekund), vendar pa zaradi uporabe destination NAT pravila še vedno izgleda, kot da je odgovoril strežnik 8.8.8.8.