
Statické DNS záznamy na pfsense
Dnes si ukážeme ako nastaviť statické DNS záznamy na lokálnom DNS servery pfsense. Cieľom tohto návodu je aby nám fungovali lokálne webové služby aj keď bude nedostupný internet, alebo ak spadne DNS server na internete. Bolo by dosť zvláštne, mať hosting v lokálnej sieti a pri výpadku verejného DNS servera, alebo internetu, nemať dostupné lokálne weby.
Poďme na to pekne od začiatku. Zjednodušená štruktúra siete je na následujúcom obrázku. V obdĺžniku na pravej strane je fyzický stroj Odroid H2 , na ktorom je nainštalovaný Debian resp. Proxmox 6. V KVM je nainštalovaný firewall pfsense. V linuxových kontajneroch LXC fungujú ďalšie stroje (Debian) na ktorých bežia 2 webové servery Apache2 a 1 reverzný proxy server Nginx. Na WAN strane firewallu pfsense mám od ISP verejnú dynamickú IPv4 adresu. Modem je v bridge mode.
Na Apache2 servery mám niekoľko virtualhostov (vhost). Pre tieto vhosts som na verejnom free DNS servery (viď obrázok „Public free dynamic DNS„) zaregistroval domény tretieho radu (konkrétne sa jedná o doménu ddns.info). Už asi 3 týždne je táto doména nedostupná. Od správcu DNS servera mám informácie, že doména bola pozastavená, pretože niektorí klienti ju zneužili na physhingové aktivity. Doba pozastavenia domény nie je známa. Vzhľadom k tomu, že doména tretieho radu je zdarma a bez akýchkoľvek garancií dostupnosti, tak si budem musieť počkať. Na webových serveroch využívam free DNS služby od viacerých spoločností. Väčšina z nich funguje výborne, ale ddns.info je momentálne nedostupná (nefunguje mi napr. súkromný cloud a dokuwiki). Dokuwiki používam veľmi často a bez nefunkčného DNS sa tam neviem dostať ( aj keď riešenie je nastaviť staticky záznam v /etc/hosts, ale to by sa muselo nastaviť na každom PC).
Našťastie firewall pfsense disponuje aj DNS serverom. V pravom slova zmysle sa jedná o rekurzívny a cachujuci DNS resolver. V pfsense sa môžeme rozhodnúť, či budeme používať DNS Resolver (Unbound), alebo DNS Forwarder (Dnsmasq). Ja som sa rozhodol pre DNS Resolver Unbound. Jednou z funkcií tohto resolvera je aj tzv. Host Override (prepísanie hostiteľa). Funguje to veľmi jednoducho. V rámci webkonfigurátora pfsense sa presunieme do
Services --> DNS Resolver
Presunieme sa na stránke celkom dole a v sekcii Host Override klikneme na +Add. podľa obrázka musíme vyplniť následujúce polia
- Host Override Options
- Domain
- IP Address
- Additional Names for this Host
- Host name
- Domain
Domain – tam bude časť názvu domény (v mojom prípade example.ddns.info). IP address – tu bude IP adresa (IPv4, alebo IPv6), ktorá sa ma vrátiť ako výsledok vyhľadávania DNS pre klienta. Ja mám všetky (v súčastnosti obidva) webové servery smerované cez reverzný proxy server, takže IP adresa bude vždy adresa reverzného proxy servera, ktorý sa už postará o správne smerovanie na konkrétny vhost webového servera.
Táto druhá časť „Additional Names for this Host“ predstavuje také niečo ako alias resp. CNAME na DNS serveroch. Host name – ak používame subdoménu www, tak to napíšeme do poľa. Domain – example.ddns.info.
Teraz keď zadáme do obľúbeného webového prehliadača adresu example.ddns.info, ktorú by mal v skutočnosti vyriešiť, Public free dynamic DNS (viď prvý obrázok), tak prehliadač najprv nahliadne do lokálneho resolvera a zistí, že pre túto url ma vrátiť IP adresu 192.168.1.105. Následne sa vo webovom prehliadači zobrazí správny obsah.
Poznámka: Týmto spôsobom by v rámci lokálnej siete bolo možné podvrhnúť DNS requesty a to tak, že by sme akýkoľvek web (napr. www.facebook.com) smerovali na vlastný webový server. Web facebook, by sa užívateľovi javil ako skutočný facebook.com a tým by sme mohli od užívateľa získať napr. prihlasovacie údaje. Tento typ útoky sa volá DNS hijacking. Host override môžeme v rámci LAN použiť aj na blokovanie niektorých webových stránok a to tak, že do Host a domain zapíšeme stránku ktorú chceme blokovať. Nasmerujeme ju na úplne inú IP adresu aká by v skutočnosti mala byť, alebo ju nasmerujeme na náš webový server, ktorý bude zobrazovať obsah, aky budeme chcieť.
To čo sme si dnes popisovali, skutočne funguje. Avšak je tu jeden problém. DHCP server v LAN sieti musí byť nastavený tak, aby klientovi pridelil IP adresy vrátane správneho DNS servera. Ak si náhodou klient zmení IP adresu DNS servera na inú adresu (napr. Google Public DNS 8.8.8.8, alebo ClodFlare 1.1.1.1 a pod.), tak obíde lokálny DNS a k lokálnym webom nebude mať prístup. Toto sa dá tiež pomerne jednoducho vyriešiť tak, že všetkých klientov v LAN donútime použiť lokálny DNS aj keď si nastavia IP adresy iných DNS serverov. Použijeme na to Port Forwarding, ktorý zachytí všetky požiadavky klientov na porte určenom pre DNS (53). Presunieme sa do
Firewall --> Nat
Klikneme na +Add a nastavíme pravidlo ako je na obrázku.
Ak klient použije DNS over TLS, ktoré funguje na porte 853, tak je možné zablokovať aj port 853. Niektoré prehliadače sa snažia použiť DNS over HTTPS a tam môže nastať problém, pretože port 443 nemôžeme blokovať, inak by sme zablokovali takmer celý web (mimo http). Môžeme však blokovať, bežné, verejné resolvery.
Teraz bude vždy DNS požiadavku od klienta riešiť lokálny DNS resolver. Ak sa mu požiadavku nepodarí vyriešiť, tak sa prejde na ďalší DNS, ktorý je nastavený ako sekundárny DNS (môže to byť 8.8.8.8, alebo 1.1.1.1 a pod). Keď som to testoval v linuxe, tak to fungovalo ako to opisujem. Testovanie na Win 10 dopadlo inak. Ak som nastavil DNS servery ručne, tak vôbec nefungoval internet. Keďže sa v MS Win 10 pohybujem veľmi zriedka, tak som to ďalej neriešil. Proste sa nastaví všetko z DHCP a funguje to, alebo sa nastavia DNS servery ručne a nefunguje celý internet (čiže v konečnom dôsledku sa to nastaví z DHCP).