Auch wenn man jetzt DNS icht immer sofort bei einer Fehlersuche im Blick hat, letztendlich handelt es sich um ein kritisches System. Ohne DNS keine Namensauflösung und somit keine Services im Internet. Das wurde besonders deutlich, als kürzlich der DNS-over-TLS Service von Cloudflare nicht mehr antwortete und besonders Fritzboxen in der Standard Konfiguration keine DNS Abfragen machen konnten. Ok, machen konnten sie die Abfragen schon, sie bekamen eben nur keine Antwort.
Die Lösung wäre, einfach auf die unverschlüsselte Variante zu wechseln. Das mag im privaten Umfeld oder auch als Workaround funktionieren, im Unternehmen aber sicher keine gute Idee. Abhilfe schafft tatsächlich nur, auf einen anderen DNS Dienstleister zu wechseln. Aber auch hier hat man die Qual der Wahl. Die meisten Provider verwenden nicht wirklich eigene Strukturen, sondern leiten oft auch auf die bekannten öffentlichen DNS Server von Google (8.8.8.8, 8.8.4.4) oder eben von Cloudflare (1.1.1.1) um. Im Fall von DNSSEC läuft die Kommunikation verschlüsselt (TLS1.2, TLS 1.3) über die gleichen IP-Adressen lediglich üner Port 853 (DNS-over-TLS).
In der Fritzbox sowie in anderen Router kann dafür ein Fallback konfiguriert werden, um auf die unverschlüsselte DNS Abfrage (Port 53) umzuschalten, falls DNSSEC nicht funktioniert.
Dieser Fallback sollte allerdings mit Vorsicht verwendet werden. In der Fritzbox wird man zwar darauf hingewiesen, dass eine Deaktivierung zu einem kompletten DNS Ausfall für alle Geräte die an der Fritzbox hängen führen kann. Jedoch wird die Sicherheit auch „aufgeweicht“, da der Fallback dann ja die unverschlüsselte Variante für die Namensauflösung wählt. Was davon jetzt besser ist, muss jeder für sich selbst entscheiden. Wichtig ist nur, dass man diese Funktion kennt.
DNS Server testen
Einen DNS Server zu testen ist im Prinzip ja relativ einfach. Dafür existiert ja auf jedem System das Kommando nslookup.
thomas@Toms-MBP ~ % nslookup google.com Server: 192.168.178.1 Address: 192.168.178.1#53 Non-authoritative answer: Name: google.com Address: 142.250.184.238
Mein MacBook fragt meine Fritzbox über den Port 53 unverschlüsselt nach der Adresse von Google.com und bekommt die IP Adresse als Antwort. Was ich hier lediglich sehe, ist das DNS erstmal funktioniert. Ich sehe nicht welche DNS Server meine Fritzbox fragt, um mir die Adresse zu liefern.
Ich kann aber mit der nslookup Shell auch jederzeit einen anderen Server fragen. Einfach nslookup ohne URL verwenden und danach mit dem Parameter Server den DNS Server (hier Cloudflare) angeben. Danach kann ich direkt diesen Server verwenden um nach einer IP Adresse zu fragen.
thomas@Toms-MBP ~ % nslookup > server 1.1.1.1 Default server: 1.1.1.1 Address: 1.1.1.1#53 > google.com Server: 1.1.1.1 Address: 1.1.1.1#53 Non-authoritative answer: Name: google.com Address: 142.250.185.110 > exit thomas@Toms-MBP ~ %
Wer nslookup nicht mag, kann auf einem Mac (oder auch Linux) das Kommando dig verwenden.
thomas@Toms-MBP ~ % dig google.com @1.1.1.1 ; <<>> DiG 9.10.6 <<>> google.com @1.1.1.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8587 ;; 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. 0 IN A 142.250.74.206 ;; Query time: 2887 msec ;; SERVER: 1.1.1.1#53(1.1.1.1) ;; WHEN: Sat Jan 22 11:50:59 CET 2022 ;; MSG SIZE rcvd: 55 thomas@Toms-MBP ~ %
Wir sind allerdings immer noch unverschlüsselt unterwegs. Um jetzt eine verschlüsselte Abfrage an einen DNS Server zu schicken und zu prüfen ob dieser Antwortet, verwenden wir ein openssl Komando:
thomas@Toms-MBP ~ % echo | openssl s_client -connect 'one.one.one.one:853' CONNECTED(00000005) depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA verify return:1 depth=1 C = US, O = DigiCert Inc, CN = DigiCert TLS Hybrid ECC SHA384 2020 CA1 verify return:1 depth=0 C = US, ST = California, L = San Francisco, O = "Cloudflare, Inc.", CN = cloudflare-dns.com verify return:1 --- Certificate chain 0 s:/C=US/ST=California/L=San Francisco/O=Cloudflare, Inc./CN=cloudflare-dns.com i:/C=US/O=DigiCert Inc/CN=DigiCert TLS Hybrid ECC SHA384 2020 CA1 1 s:/C=US/O=DigiCert Inc/CN=DigiCert TLS Hybrid ECC SHA384 2020 CA1 i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA --- [...] Start Time: 1642849389 Timeout : 7200 (sec) Verify return code: 0 (ok) --- DONE thomas@Toms-MBP ~ %
Mit der Ausgabe der Zertikatinformationen wissen wir, dass der DNS Server auf Port 853 verschlüsselt erreichbar ist und Antwortet. Im Fehlerfall würde die Abfrage einfach in einen Timeout (2,5 Minuten!) laufen und keine Antwort zurückgeben.
thomas@Toms-MBP ~ % echo | openssl s_client -connect 'example.com:853' connect: Operation timed out connect:errno=60 0.01s user 0.00s system 0% cpu 2:30.02 total
Am Rande noch ein paar Tips
- Es gibt ein wirklich gutes Troubleshooting Dokument vom ESnet (Energy Sciences Network – U.S. Department of Energy). Ihr findet eine Menge Ansätze zur Fehlerbehebung von DNS(SEC) Problemen.
- Wer ein Problem mit den öffentlichen DNS Server von Google oder Cloudflare hat (Tracking, Logging etc.) dem empfehle ich den Artikel von Mike Kuketz, der auch eine Liste von freien DNS(SEC) Server enthält, die statt Google etc. verwendet werden können (ich empfehle da z.B. FFMUC).
- Eine andere Alternative ist Quad9, als Schweizer DNS Dienst, der auf Datenschutz setzt
- Wer etwas mehr Kontrolle über den verwendete DNS Server haben möchte und eventuell auch lokale Adressen auflösen möchte, dem empfehle ich NextDNS. Allerdings ist das ein kostenpflichtiger Service.