Donnerstag, 10. Mai 2018

DNS Lifehacks

Was dein DNS Server alles könnte, speziell pfSense

Intro

In diesem Artikel, geht es um die Möglichkeiten die ein aktueller DNS Server heute so bieten würde. Er soll ein kleiner Einblick in dieses breite Thema bieten und Anreize für ein eigenes Setup schaffen. Speziell geht es hier um Optionen welche man im Zusammenhang mit einer pfSense Firewall hat. Viele Dinge haben aber Allgemeingültigkeit oder können auch mit einem Linux System in ähnlicher Form aufgesetzt werden, womit ich hoffe, dass sich das Lesen auch für nicht pfSensler lohnt.


Vielen ist kommt der DNS Dienst selber höchstens wieder mal in den Sinn, wenn etwas harzt. Können gewisse Internet Seiten nicht aufgerufen werden, so ist das 1.lv Haushaltsmittel vieler, mal in den Einstellungen des Betriebssystems den DNS Server von automatisch auf manuell zu ändern. Üblicherweise tauscht man dabei die DNS Anfragen von 192.168.1.1, was der heimische Router wäre welcher normalerweise die Cache Server des Providers nutzt, auf den Dienst eines öffentlichen Resolvers wie den von Google (8.8.8.8) oder auf etwas mehr anti Google, wie die quad9 Betreiber (9.9.9.9). Jetzt kann es sein, dass diese Massnahme etwas bringt, weil der Provider entweder eine Netzsperre auf diese Seite eingerichtet hat oder man umgeht damit ein eigentliches Routing Problem, weil für das Ziel eine andere IP geliefert wurde.
Dies beschreibt jetzt nur den einfachsten Fall. Themen wie Netzsperren, Authentizität, Kinder- und Datenschutz und viele weitere, sollten Anlass genug sein, sich mit einem der wichtigsten Dienste im Internet, dem DNS genauer auseinanderzusetzen. Und dies beginnt im heimischen Netz.


Forwarder vs. Resolver

Forwarder: Üblicherweise wird das Thema DNS Server auf den Heimrouter der Provider sehr stiefmütterlich behandelt. Gängig ist, dass auf dem Router eine Linux Variante werkelt und DNS über den Dienst Dnsmasq bedient wird. DNSmasq ist ein einfaches robustes Programm welches gleichzeitig auch noch ein DHCP Server sein kann. Da DNS die meisten Heimanwender (bis jetzt) wenig interessiert hat, genügt dies auch. Dieses Programm nimmt die DNS Anfragen auf, leitet diese an einen Resolver weiter, welcher die Anfrage beantwortet. Je nachdem hat der Router dann noch einen kleinen Cache, womit eine erneute Anfrage innert kürzester Zeit nicht nochmals beim DNS Resolver des Providers angefragt werden muss. Bietet der Provider oder Routerlieferant sogar noch ein klein bisschen mehr als ein beschnittenes Webinterface, kann man für lokale Server gar eigene Einträge machen. So muss man den Drucker nicht mehr über 192.168.1.10 ansprechen, sondern kann dies über seinen FQDN zb. printer.home machen. Bringt vor allem etwas, wenn man sich die 128Bit einer IPv6 nicht merken will.
Zugegeben, bei einem Provider Router darf man heute ja schon froh sein, wenn man die Forwarder Adressen welche der Router vom Provider bezieht, auf einen sich genehmen Dienst wechseln darf :) Grund genug also schon mal seinen eigenen DNS Dienst aufzubauen.

Resolver: Auch wenn der Provider den DNS Dienst oft verkrüppelt, so bleibt Dnsmasq trotzdem ein mächtiges Programm mit dem man viel machen kann. Bis zu pfSense 2.2 war der Dnsmasq Resolver auch hier der Standard. Seit 2.2 wir eine Standardinstallation aber mit einem Resolver ausgeführt und zwar Unbound. Hauptunterschied ist, dass man mit Unbound noch viel mehr machen kann und wie so eine Namensauflösung von statten geht. Während der Forwarder einfach den Resolver beim Provider oder einem Anbieter anfragt, macht der Resolver den Weg von der Root her bis er die Antwort vom autoritativen Server einer Domain bekommen hat. Vorteil ist, dass man genau die Antwort bekommen sollte, wie es der Betreiber einer Webseite vorgesehen hat, sofern nicht irgendeine Instanz (staatlich oder privat) eingreift. Weiter kann dieses DNS System durch anycast kaum "ausfallen". Selbst wenn der DNS Server des Providers wieder mal einen Tilt hat, egal das "echte" Internet wird abgefragt. Durch die Abfrage vieler DNS Server ist der Datenschutz theoretisch besser, da man nicht einen einzelnen Server abfragt welcher alles loggen kann. Der Datenschutz ist theoretisch, da der Traffic natürlich weiterhin durch den Provider läuft und DNS bekanntlich unverschlüsselt und plain über die Leitungen läuft.
Ein Resolver kann aber auch einen gewichtigen Nachteil haben und zwar die Performance!
Während ein Forwarder seine Anfrage an einen Resolver macht, welcher einen grossen und befeuerten Cache hat und diese Anfrage schnell bedienen kann, muss ein Resolver bei seiner ersten Abfrage oder nach einer gewissen Zeit den DNS Baum heraufklettern (ok die Wurzel steht in den meisten Diagrammen zuoberst, iknow). Dies braucht gegenüber einer gecacheden Antwort natürlich Zeit.
Das ist auch der Grund, wieso man teilweise Foren-Einträge findet, dass der Resolver langsamer als der Forwarder ist und der Seitenaufbau beim surfen dadurch etwas harziger wirken kann.
Nochmals zur Erinnerung, pfSense kommt bei einer Installation genau mit dieser Einstellung: Es ist der Resolver aktiv er arbeitet auch als solcher durch den DNS Baum.
Nur ein beschäftigter Resolver ist ein schneller Resolver, kommt die Anfrage nämlich aus seinem cache, sind wir da im Heimnetz bei Antwortzeiten von unter 1ms! Kann man im Heimnetz einen Resolver aber zu Genüge beschäftigen? Kaum, daher...

Forwarding Modus aktivieren beim Unbound Resolver

Kombiniert man die Möglichkeiten eines Resolvers (Unbound kann noch viel viel mehr...) mit der Geschwindigkeit eines Forwarders, so kann man die Vor- und Nachteile beider Varianten kombinieren. Natürlich versuchen wir hierbei die Vorteile zu kombinieren. Die Nachteile lassen wir mal bei den Provider CPE :)
Um dem Resolver von pfSense etwas zu befeuern gibt man diesem Forwarding Server an.
Unter Services > DNS Resolver TAB General Settings: aktiviert man Enable Forwarding Mode.


Erst JETZT werden allfällig bezogene DNS Server des Providers oder andere DNS Dienste welche man in den Allgemeinen Einstellungen definiert hat, aktiv!
Vorteil nun: Die Performance steigt, da ein Eintrag welcher nicht im Cache ist, nun von einem Server in der Forwarding Liste ziemlich zügig beantwortet werden sollte. Nachteil, den eingetragenen Servern sollte man trauen können.

DNS Server im Router ändern

Es kann viele Gründe für das Ändern der DNS Server im Router geben. Es kann sein das der Provider ein langsames System hat, sollte er nicht, ist aber möglich. Weiter kann es sein, dass man dem Provider nicht traut oder diese DNS basierte Netzsperren aktiv hat, das kann bei einem der grossen Provider durchaus mal vorkommen, sind diese historisch Bedingt aus staatlichen Betrieben gewachsen. Es kann aber auch sein, dass man zB einen DNS Anbieter möchte, welcher gewisse Dienste bietet die der Standarddienst nicht kann. Namentlich zB. OpenDNS, ein Dienst welchen ich persönlich zwar Kacke finde, aber mit dem man einen einfachen DNS basierten "Kinderschutz" aktivieren kann. Gut, Daddys werden nach dem lesen dieses Artikels sich sogar mit diesem Dienst, auch tatsächlich im Heimnetz durchsetzen können ;)
Im Falle von pfSense möchte ich jetzt die DNS Server eintragen / ändern, weil ich eine bessere Performance möchte und weil ich Dienste nutzen möchte, welche der DNS Server meines Providers (Swisscom), nicht anbietet. Nicht weil ich die Dienste des Providers aus Prinzip schlecht finde. Nein :)  (wobei dies bei einem guten Glas (nosing) Whisky schnell mal zum Thema werden würde)

Also bei pfSense geht man unter System > General Setup und bearbeitet dort die DNS Settings.
Hier trägt man seine DNS Server des Vertrauens ein und deaktiviert den DNS Server override, denn dieser würde die Provider Dienste aktivieren.
In diesem Beispiel werden die Dienste von Cloudflare genutzt. Da kann man jetzt sicher geteilter Meinung sein. Ich selber finde Cloudflare geil und nutze auch für die Domain diesen Dienst, welcher übrigens auch in der Gratis Version Tonnen an Einstellungen erlaubt.
Wie auch immer, Cloudflare ist aktuell relativ angesagt und besagt von sich aus, die Logs alle 24h zu löschen. Eine Frage des Vertrauens. Was ich aber mit Bestimmtheit sagen kann, dein Provider in der Schweiz wird das ganz bestimmt nicht tun! Du kannst von mir aus Google, Quad9, deinen Provider oder gar einen Freakelserver eines Hinterhofaktivisten verwenden, mir egal.
Die weiteren genannten Dienste werden aber auf jeden Fall von Cloudflare bedient. Kläre ab ob das dein Anbieter auch kann.



Wie man hier sehen kann, sind auch noch gleich die IPv6 Server eingetragen. Normalerweise liefern die heutigen DNS Server auch über ihre IPv4 Adresse sowohl den A wie auch den AAAA Record einer Domain. Sprich, um eine IPv6 Webseite zu erreichen genügt die IPv4 Version eines DNS Servers alleweil (vorausgesetzt der Access ist IPv6 tauglich).
Wird man aber mal keinen IPv4 Access mehr haben, so ist die Erreichbarkeit eines IPv6 Servers natürlich eine Voraussetzung!
Als IPv6 Freak ist es natürlich selbstverständlich, dass man hier IPv6 Server einträgt. Wenns nach mir ginge, sollte man sowieso alle Seiten auf IPv6 only umstellen. Bisweilen beschränke ich mich dabei auf Dienste welche ich nur selber brauche. Auch mir ist bewusst, dass etwa 99,99% der Bevölkerung zumindest im mobilen Netz etwas Probleme bekommen würde #menot

DNSSEC

DNSSEC ist tot, nein ist es nicht. DNS selber ist ein unsicheres Protokoll. Wenn ich eine Anfrage auf selfoss.tuxone.ch mache, wer garantiert mir dann dass die DNS Antwort für diese Seite auch tatsächlich dem entspricht, was eigentlich der DNS Server dieser Domain vorsieht? In diesem Fall DNSSEC und sonst nichts.
DNSSEC signiert und garantiert damit, dass die DNS Daten der Quelle entsprechen und während der Übertragung nicht modifiziert wurden. Wichtig. Auch wenn man hier von Kryptografie spricht, so bleibt die DNS Anfrage weiterhin unverschlüsselt!
Zusätzlich ist DNSSEC Grundlage weiterer Protokolle wie DANE.
Ein kleiner Überblick bietet dieses Video:



Damit DNSSEC genutzt werden kann, muss die entsprechende Domain mit DNSSEC gesichert werden und der Resolver muss dies validieren.
Wie im Video gezeigt, kann die Validation auf verschiedenen Ebenen geschehen.
Auf der lokalen Maschine, bleiben die Browser Hersteller der DNSSEC Validation schuldig. Abhelfen kann man sich mittels Browser Plugins: https://www.dnssec-validator.cz/pages/download.html#package
Sofern der DNS Server welchen man einsetzt zumindest DNSSEC aware ist ( The server is able to provide RRSIG, DNSKEY and DS records, but does not validate any records.) findet die Validation direkt über das Plugin statt. Die DNS Server von Swisscom sind zB. DNSSEC aware. Da sie aber die Validation nicht selber machen, nützt dies den üblichen Kunden wenig. Die Validation müsste der Resolver auf dem CPE vornehmen, was dieser aber nicht macht...
Mit pfSense ist die DNSSEC Validation schnell aktiviert:
Services > DNS Resolver: DNSSEC Support aktivieren und fertig. Das funktioniert mit DNSSEC aware sowie validierenden Serven wie Bluewin, Google, Cloudflare, aber auch natürlich über die Root Server.

Möchtest du testen ob bei dir DNSSEC validiert wird, so kannst du dies über diesen Link machen oder ein nslookup auf www.dnssec-failed.org ausführen. Es sollte ein Serverfail ergeben und keine IP!

DNS over TLS

Bis jetzt sind alle DNS Anfragen über Port 53 unverschlüsselt. Auch DNSSEC bietet hier keine Hilfe. Zudem ist nicht sichergestellt, dass der DNS Server mit welchem man kommunizieren möchte, auch tatsächlich der ist, welchen man wünscht. Ähnlich wie es beim E-Banking der Fall sein sollte, wird die Übertragung zum DNS Server verschlüsselt und das Zertifikat wird (oder kann) geprüft werden.
Oft beworben wird dabei auch der Privacy Aspekt, da die DNS Anfragen nicht mehr durch den Provider analysiert und gesammelt werden können. Dabei gibt es aber zu bedenken, dass der Socket dann ja aber trotzdem noch über den Provider läuft...

DNS over TLS läuft über TCP Port 853. Durch die Verschlüsselung sowie TCP statt UDP, kommt es zu einer höheren Latenz was die Namensauflösung betrifft.
Trotzdem habe ich dies seit einigen Wochen aktiv und muss sagen: "Läuft auf der pfSense wirklich geil (flott).
Also aktivieren wir doch das alles. Aktuell hat Netgate dazu einen Blogpost geschrieben:
Wer aber bereits pfSense ab 2.4.4 in betrieb hat #metoo, kann dass komfortabel über das WUI aktivieren:
Services > DNS Resolver > General Settings > DNS Query Forwarding: einfach noch zusätzlich Use SSL/TLS for outgoing DNS Queries to Forwarding Servers aktivieren. Das setzt natürlich voraus, dass die Forwarding Server alle DNS over TLS unterstützen (Cloudflare zb, Bluewin wohl eher nicht :) )





Damit laufen alle Anfragen des Resolvers in der pfSense über TLS Port 853. Möchtest du jetzt noch einen Schritt weitergehen, so kannst du den Resolver selber auch noch über 853 TLS anbieten.
Dazu:
Services > DNS Resolver > General Settings > Enable SSL/TLS Service aktivieren.



Damit kann ein Client die Anfrage direkt auf den Resolver in der pfSense TLS gesichert abschliessen. Ein Stubresolver der dies kann ist Stubby. Zudem wird Android P DNS over TLS unterstützen!
Das würde dann wohl in etwa so aussehen wenn man den Traffic analysiert:




DNS Anfragen umleiten

Jetzt lese ich in letzter Zeit, dass eine DNS Sperre im Zusammenhang mit einer Netzsperre jeweils inner 2 Minuten aufgehoben ist. Ziel ist, dass man statt dem DNS Server des Providers einen freien Resolver einträgt, welcher die gesperrten IP's immer noch auflöst. Auch staatliche Kontrollen konnte man schon umgehen, indem man zB 8.8.8.8 im System eingetragen hat.




Ist das also wirklich so einfach? Kann man zB einen DNS basierten Kinderschutz aktivieren und alles ist in Ordnung? Was wenn die Kids herausfinden dass sie auf dem Smartphone einfach den DNS Server ändern und Daddy das Gerät nicht gesperrt hat? Ist es sinnvoll dann bei allen Geräten die Konfig zu sperren? Ja schon, aber jetzt kommt mein Liebling Gag, welchen ich auch gewerblich gerne einsetze und das Gros der heimischen Sysadmins bereits vor eine hohe ( riesige) Hürde stellt :D (Layer 7 Inspection bleibt in diesem Post aussen vor. Falls Interesse besteht wie man zB. VPN Traffic auf Layer 7 analysiert und damit unterbindet, kann dies in den Kommentaren upvoten. Ich würde dann einen Post darüber machen)

Was vielen der selbsternannten heimischen Sysadmins nicht so geläufig ist. NAT, funktioniert auch umgekehrt (eigentlich eine logische Voraussetzung...).
Üblicherweise verwendet man NAT um eine öffentliche IP Adresse auf eine Private inkl Port umzusetzen (NAPT)

Mit diesem Wissen könnte man doch alle Anfrage welche auf irgendeine Adresse in das Web gehen sollen und als Ziel Port 53 haben, auf den lokalen DNS Resolver von pfSense umleiten und zwar 127.0.0.1.
Und das geht so:


Herrlich dieser Gag! Die verdutzten Gesichter sind dir sicher :)
Übrigens ist diese Art des Jugendschutzes eh schon fraglich. Diese Debatte müssen wir hier nicht führen. Der Port 53 Redirect ist aber auch sonst ziemlich nützlich, da es im Heimnetz viele Geräte gibt, welche auf die Namensauflösung via DHCP Vorgabe pfeifen und selbständig nach Hause kommunizieren möchten. Nennen wir da mal die Google Geräte welchen man so im Glauben lassen kann, dass alles i.O ist.




Abschluss

So ich hoffe ich konnte einen kleinen Einblick geben, was mit einem DNS Resolver im Jahre 2018 so alles möglich wäre.
Für Ergänzungen, Inputs und Fragen, steht die Kommentarfunktion jederzeit zur Verfügung.