von Thomas
Erstellt am 28.10.2020
In diesem Tutorial möchte ich euch nahelegen, wie ihr einen eigenen DNS over TLS (DoT) Server aufsetzten könnt. Prinzipiell kann das Setup mit jedem beliebigem Linux OS durchgeführt werden. Es wird aber immer folgende Software benötigt:
DNS over TLS ist ein relativ neues Protokoll und im RFC 7858 standardisiert. Es ist neben DNS over HTTPS (DoH) ein Protokoll, was DNS Anfragen verschlüsselt übertragen kann. Als ersten Schritt installieren wir die grundlegenden Softwarekomponenten:
dnf -y install nginx unbound systemctl enable nginx systemctl enable unbound
Das Setup funktioniert wie folgt:
nginx fungiert als Verschlüsselungspartner zum anfragenden Client. Sprich
nginx ist dafür verantwortlich, dass verschlüsselt wird und gibt die eigentliche DNS Anfrage an den unbound Dienst weiter.
unbound löst die Anfrage entsprechend auf, gibt sie an den nginx zurück, der wiederum verschlüsselt durch TLS antwortet. Aus
diesem Grund benötigen wir zunächst ein gültiges TLS Zertifikat, welches wir mit dem Certbot bekommen können.
curl -O https://dl.eff.org/certbot-auto mv certbot-auto /usr/local/bin/certbot-auto chmod 0755 /usr/local/bin/certbot-auto certbot-auto --nginx -d your.domain.com
Anschließend konfigurieren wir den nginx mit einem neuem Stream. Dazu unter CentOS 8 die Datei /etc/nginx/nginx.conf bearbeiten. Unter anderen linuxartigen Betriebssystemen muss die Konfiguration unter Umständen in einer anderen Datei erfolgen.
stream { upstream dns-servers{ server localhost:53; server localhost:53; } server { listen 853 ssl; listen [::]:853 ssl; proxy_pass dns-servers; proxy_connect_timeout 1s; preread_timeout 2s; } ssl_certificate /etc/letsencrypt/live/your.domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your.domain.com/privkey.pem; ssl_session_timeout 1d; ssl_session_tickets off; ssl_protocols TLSv1.3; ssl_prefer_server_ciphers on; # DoT is a really new protocol. We do not to support old broken ciphers ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256; ssl_session_cache shared:DoT:10m; log_format dot '$remote_addr\t-\t-\t[$time_local]\t$ssl_protocol\t' '$ssl_session_reused\t$ssl_cipher\t$ssl_server_name\t$status\t' '$bytes_sent\t$bytes_received'; access_log /var/log/nginx/dot.log dot; }
Zu guter letzt die Dienste neustarten, bzw. starten.
systemctl start nginx systemctl start unbound
Somit ist die Grundlage für einen DoT Server gelegt. Ich empfehle jedem noch weitere Software zu installieren, welche z. B. Sicherheitsupdates (dnf-automatic) übernimmt oder Brute-Force-Attacken verhindert (fail2ban).