DNS over TLS Server mit nginx und unbound installieren

von Thomas


Erstellt am 28.10.2020


encrypted locks

Einführung

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:

  • beliebiges Linux OS (hier wird CentOS 8 verwendet)
  • nginx als Proxy
  • Let‘s Encrypt für gültige SSL Zertifikate
  • unbound als DNS-Resolver

Grundsystem installieren

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

nginx Installation und Konfiguration

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).