DoH Server auf CentOS 7 mit nginx, doh-proxy und Unbound einrichten

Erstellt am 22.03.2019


Code programming

Einführung

In diesem Tutorial möchte ich euch nahe bringen, wie ihr einen eigenen DoH Server aufsetzten könnt. Dieses Setup ist äquivalent zu meinem DoH Server ns.doh-ns.de. Folgende Software wird verwendet:

  • CentOS 7 als OS Grundlage
  • Nginx als Proxy
  • doh-proxy als DoH Server
  • Let‘s Encrypt für gültige SSL Zertifkate
  • Unbound als DNS resolver

Basis Pakete installieren

Zunächst müssen wir ein paar Basis Pakete installieren, damit wir doh-proxy verwenden können. DNS over HTTPS ist ein neues Protokoll und erst seit dem Oktober 2018 im RFC 8484 Standard, daher sind diverse Pakete noch nicht im Repository verfügbar. Wir müssen folgende Schritte im Terminal durchführen:

yum -y install git bind-utils certbot-nginx
yum -y install https://centos7.iuscommunity.org/ius-release.rpm
yum -y install python36u python36u-pip python36u-devel

Doh-proxy kann auf zwei verschiedene Wege installiert werden:

pip3.6 install doh-proxy

pip3.6 install git+https://github.com/facebookexperimental/doh-proxy.git

Wir können doh-proxy als eigenen Nutzer verwenden lassen:

adduser -r doh-proxy \
-d /var/lib/doh-proxy \
-c 'DOH Proxy server' \
-s /sbin/nologin \
-U
mkdir /var/lib/doh-proxy \
&& chown doh-proxy: /var/lib/doh-proxy \
&& chown 700 /var/lib/doh-proxy

Wir müssen unserem OS anweisen, doh-proxy beim Booten zu starten und auf Port 8080 / 8081 zu hören:

cat <<EOF > /etc/systemd/system/doh-httpproxy\@.service
[Unit]
Description=DOH HTTP Proxy on %I
After=syslog.target network.target
Before=nginx.target

[Service]
Type=simple
ExecStart=/bin/doh-httpproxy --upstream-resolver ::1 --level DEBUG --listen-address=::1 --port %I
Restart=always
User=doh-proxy
Group=doh-proxy

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
for i in 8080 8081
do
cp /etc/systemd/system/doh-httpproxy\@.service \
/etc/systemd/system/doh-httpproxy\@${i}.service
systemctl enable doh-httpproxy@${i}
systemctl start doh-httpproxy@${i}
done

Im nächsten Schritt richten wir Unbound ein, um die DNS Anfragen öffentlich aufzulösen:

yum -y install unbound
systemctl enable unbound
systemctl start unbound

Die erfolgreiche Einrichtung kann mit folgendem Befehl getestet werden:

dig @::1 example.com

Nun fehlt noch nginx und das SSL Zertifikat:

certbot --nginx -d dns.beispiel.de

Nginx konfigurieren wir in der /etc/nginx/nginx.conf. Der Certbot hat schon Einträge hinterlegt, wir passen wie folgt an:

server {

listen       80 ;
listen       [::]:80 ;
server_name ns.doh-ns.de;
return 404; # managed by Certbot

if ($host = ns.doh-ns.de) {
return 301 https://$host$request_uri;
} # managed by Certbot
}

server {
server_name ns.doh-ns.de; # managed by Certbot

listen [::]:443 ssl http2 ipv6only=on; # managed by Certbot
listen 443 ssl http2; # managed by Certbot

root         /usr/share/nginx/html;

# Load configuration files for the default server block.
require_once /etc/nginx/default.d/*.conf;
location /dns-query {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_buffering off;
proxy_pass http://dohproxy_backend;
}
location / {
deny all;
}

ssl_certificate /etc/letsencrypt/live/ns.doh-ns.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ns.doh-ns.de/privkey.pem;
require_once /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
return 501;
}
}

Wichtig ist, dass wir vor den Serverblock noch folgendes hinzufügen:

upstream dohproxy_backend {
server [::1]:8080;
server [::1]:8081;
}
server{
....
}

Testen können wir die Funktion mit einem curl Befehl. Bitte beachtet, dass curl DoH erst ab Version 7.62.0 unterstützt. Der Befehl sieht wie folgt aus:

curl --doh-url https://ns.doh-ns.de https://www.beispiel.de

Somit ist die Grundlage für einen DoH Server gelegt. Ich empfehle jedem noch weitere Software zu installieren, welche z. B. Sicherheitsupdates, Firewall und das Blocken von Angriffen übernimmt.